参考大佬的博客
如果不想重复+1寻找-1的操作,就必然让这个数能在log级别查询出下一个-1的位置。
可以想到用并查集来记忆化维护这个情况,我们用并查集实现出节点之间指向最近的-1。
当这个-1被写入时,我们将它和下个节点合并。
当不是-1时,我们让它的根节点写入值,并将根节点和根节点下一个点合并。
这样使得每个点不会被重复访问。
这里被取模WA了,注意下就行了。
AC代码#include//#include //priority_queue #define PII pair #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 ; }



