D - Linear Probing题解

D - Linear Probing (atcoder.jp)

我必须写一篇题解来发泄我一下,这题做了快一个半小时,wa了十几次,结果最后发现了一个无比愚蠢的错误

题意:给一个初始都为-1的长为2^20的数组,两种操作:

1-给一个数字x,从这个数组的第x位(x如果大于数组长度就取模)开始往后找到第一个为-1的位置(最后一个的下一位是第一位)赋值成x

2-询问该数组第x个位置的值

思路:一开始写了个离散化+暴力,但是最坏的复杂度会到O(n^2),后来一想,离散个der,这个数组大小只有1048576,直接开啊,然后问题就在于怎么样快速找到给定x的下一个应该赋值的位置,很简单,并查集都会吧,一样的事,我们想一想,一旦我把一堆连续的数都赋值了,那么这一串连续的数都共享同一个下一次赋值的位置,就相当于有公共的祖先,直接并查集合并就行了,但是为什么我调了一个半小时呢?因为tm的题目虽然说x取模,但是最后赋值是赋原来的x的值而x的范围到1e18,因此要开long long,我真的是服了,十年oi一场空,不开long long见祖宗,我真的是想直接#define int long long,可惜main只能返回int,破大防。

 #include 
 using namespace std;
 #define ll long long 
 const ll mod=1048576;
 //就是这里,给我整破防了!!!
 ll tes[1048578];
 int _next[1048578];
 ​
 void init(){
     for(int i=0;i<=mod;i++){
         _next[i]=i;
         tes[i]=-1;
     }
 }
 ​
 int update(int x){
     if(_next[x]>=mod){
         _next[x]%=mod;
     }
     if(_next[x]==x){
         return x;
     }
     return _next[x]=update(_next[x]);
 }
 ​
 int main(){
     int t;
     cin>>t;
     init();
     while(t--){
         int ca;
         cin>>ca;
         ll x;
         cin>>x;
         if(ca==1){
             ll pos=x;
             pos%=mod;
             pos=update(pos);
             tes[pos]=x;
             if(pos+1==mod){
                 _next[pos]=_next[0];
             }else{
                 _next[pos]=_next[pos+1];    
             }
             update(pos);
         }else{
             x%=mod;
             cout<

你可能感兴趣的:(题解,算法)