提出 #71340270


ソースコード 拡げる

#include <bits/stdc++.h>
#include <map>
using namespace std;
typedef long long ll;
const int maxn=(2e5)+10;
int n,q,a[maxn];
pair<int,int> b[maxn];
#define MP make_pair
int A[maxn],B[maxn];
int tr[maxn],cnt[maxn];
void add(int x) {
    for (;x<=n;x+=x&(-x)) tr[x]++;
}
int query(int x) {
    int res=0;
    for (;x;x-=x&(-x)) res+=tr[x];
    return res;
}
ll preA[maxn],preB[maxn];
pair<int,int> ans[maxn];
vector<int> pos[maxn];
vector<pair<int,int> > Q1[maxn],Q2[maxn];
void solve(vector<pair<int,int> > *Q,int flag) {
    for (int i=1;i<=n;i++) tr[i]=0,pos[i].clear();
    for (int i=n;i>=1;i--) {
        if (i<n) {
            add(a[i+1]);
            pos[a[i+1]].push_back(i+1);
        }
        for (pair<int,int> A : Q[i]) {
            int k=A.first,id=A.second;
            int l=1,r=n,mid,res=-1;
            while (l<=r) {
                mid=(l+r)>>1;
                if (query(mid)>=k) res=mid,r=mid-1;
                else l=mid+1;
            }
            k-=query(res-1);
            // if (id==5) printf("> %d %d %d\n",k,res,flag);
            res=pos[res][k-1];
            
            ans[id].second=res;
        }
    }
}
int main() {
    scanf("%d %d",&n,&q);
    for (int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        b[i]=MP(a[i],i);
    }
    sort(b+1,b+n+1);
    int fd=-1;
    for (int i=1;i<n;i++) if (b[i].first==b[i+1].first) { fd=i; break; }
    for (int i=n;i>=1;i--) {
        A[i]=query(a[i]-1);
        B[i]=n-i-cnt[a[i]]-A[i];
        cnt[a[i]]++,add(a[i]);
    }
    for (int i=1;i<=n;i++) preA[i]=preA[i-1]+A[i],preB[i]=preB[i-1]+B[i];
    ll tot=(ll)n*(n-1)/2;
    for (int _=1;_<=q;_++) {
        ll k; scanf("%lld",&k);
        if (k<=preA[n]) {
            int l=lower_bound(preA+1,preA+n+1,k)-preA;
            k-=preA[l-1];
            ans[_].first=l;
            Q1[l].push_back(MP(k,_));
        } else if (k>=tot-preB[n]+1) {
            k=tot-k+1;
            int l=lower_bound(preB+1,preB+n+1,k)-preB;
            k-=preB[l-1];
            ans[_].first=l;
            Q2[l].push_back(MP(k,_));
        } else {
            assert(fd!=-1);
            ans[_]=MP(b[fd].second,b[fd+1].second);
        }
    }
    solve(Q1,1);
    for (int i=1;i<=n;i++) a[i]=n-a[i]+1;
    solve(Q2,-1);
    for (int i=1;i<=q;i++) printf("%d %d\n",ans[i].first,ans[i].second);

    return 0;
}

提出情報

提出日時
問題 G - One Time Swap 2
ユーザ wygz
言語 C++23 (GCC 15.2.0)
得点 575
コード長 2415 Byte
結果 AC
実行時間 233 ms
メモリ 38688 KiB

コンパイルエラー

./Main.cpp: In function 'void solve(std::vector<std::pair<int, int> >*, int)':
./Main.cpp:23:42: warning: unused parameter 'flag' [-Wunused-parameter]
   23 | void solve(vector<pair<int,int> > *Q,int flag) {
      |                                      ~~~~^~~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 575 / 575
結果
AC × 2
AC × 32
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 4 ms 4024 KiB
00_sample_01.txt AC 4 ms 3744 KiB
01_test_00.txt AC 51 ms 15184 KiB
01_test_01.txt AC 115 ms 26480 KiB
01_test_02.txt AC 131 ms 27680 KiB
01_test_03.txt AC 167 ms 28572 KiB
01_test_04.txt AC 188 ms 29640 KiB
01_test_05.txt AC 216 ms 33856 KiB
01_test_06.txt AC 225 ms 35196 KiB
01_test_07.txt AC 233 ms 38688 KiB
01_test_08.txt AC 125 ms 22480 KiB
01_test_09.txt AC 146 ms 24096 KiB
01_test_10.txt AC 167 ms 28584 KiB
01_test_11.txt AC 184 ms 33688 KiB
01_test_12.txt AC 127 ms 22380 KiB
01_test_13.txt AC 145 ms 24268 KiB
01_test_14.txt AC 165 ms 28360 KiB
01_test_15.txt AC 174 ms 33632 KiB
01_test_16.txt AC 124 ms 22388 KiB
01_test_17.txt AC 144 ms 24112 KiB
01_test_18.txt AC 168 ms 28528 KiB
01_test_19.txt AC 191 ms 33548 KiB
01_test_20.txt AC 131 ms 22420 KiB
01_test_21.txt AC 153 ms 24120 KiB
01_test_22.txt AC 171 ms 28452 KiB
01_test_23.txt AC 184 ms 33532 KiB
01_test_24.txt AC 28 ms 5436 KiB
01_test_25.txt AC 38 ms 6852 KiB
01_test_26.txt AC 41 ms 7320 KiB
01_test_27.txt AC 47 ms 7376 KiB
01_test_28.txt AC 55 ms 7940 KiB
01_test_29.txt AC 27 ms 6688 KiB