求问此题正解是否是随机赋值法?
查看原帖
求问此题正解是否是随机赋值法?
777756
UFOI楼主2023/10/16 20:36

rt,另外求调我的随机赋值:

#include<bits/stdc++.h>
using namespace std;
int n,q,a[300001],x,y,b[300001];
long long ans;
map<long long,bool>mp;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[a[i]]=i;
        ans+=a[i]*i;
    }
    for(int i=1;i<=n;i++){
        ans-=(1+n)*n/2;
        ans+=b[a[i]]*n;
        mp[ans]=1;
        //cout<<ans<<endl;
    }
    while(q--){
        cin>>x>>y;
        ans-=x*b[x];
        ans+=y*b[x];
        ans-=y*b[y];
        ans+=x*b[y];
        swap(b[x],b[y]);
        //swap(a[b[x]],a[b[y]]);
        //cout<<ans<<endl;
        if(mp[ans]) cout<<"DA\n";
        else cout<<"NE\n";
    }
}
2023/10/16 20:36
加载中...