题目
题解思路
参考大佬的博客
如果不想重复+1寻找-1的操作,就必然让这个数能在log级别查询出下一个-1的位置。
可以想到用并查集来记忆化维护这个情况,我们用并查集实现出节点之间指向最近的-1。
当这个-1被写入时,我们将它和下个节点合并。
当不是-1时,我们让它的根节点写入值,并将根节点和根节点下一个点合并。
这样使得每个点不会被重复访问。
这里被取模WA了,注意下就行了。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 200100;
const int mod = 1048576 ;
long long a[2000100] ;
int fa[2000100] ;
int find(int x )
{
if ( x != fa[x] )
return fa[x] = find(fa[x]) ;
return fa[x] ;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int q ;
for (int i = 0 ; i <= mod ; i++ )
{
fa[i] = i ;
a[i] = -1 ;
}
cin >> q ;
while (q--)
{
int t1 ;
long long x ;
cin >> t1 >> x ;
long long p = x%mod ;
if ( t1 == 1 )
{
if ( a[p] != -1 )
{
int fx = find(p);
a[fx] = x ;
int fy = find((fx+1)%mod) ;
fa[fx] = fy ;
}else
{
int fx = find((p+1)%mod) ;
a[p] = x ;
fa[p] = fx ;
}
}else
{
cout << a[p] << "\n" ;
}
}
return 0 ;
}