百度之星 毒瘤数据结构题 题解(思维)
题目链接
题目思路
赛时本来用的是线段树上二分,然后T了..
正解如下
我们考虑维护最左边两个 0的位置,设其依次为 a,b
若查询时,将 a 设为了 1,则答案为 b,否则答案为 a。
修改时,若修改了 a,则令 a=b,之后 b 一直递增,直到找到下一个0。
若修改了 b,则 b之后一直递增,直到找到下一个 0。
这样整个序列最多被扫过 2 次,总复杂度为 O(n)。
但hdu这老年机还是能T。。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define fi first
#define se second
#define debug printf("aaaaaaaaaaa\n");
const int maxn=5e6+5,inf=0x3f3f3f3f,mod=998244353;
const ll INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-7;
int n;
bool vis[maxn];
int main(){
scanf("%d",&n);
int a=1,b=1;
for(int i=1,opt,x;i<=n;i++){
scanf("%d%d",&opt,&x);
if(opt==1){
vis[x]=1;
if(x==a){
a=b;
b++;
while(vis[b]){
b++;
}
}else if(x==b){
while(vis[b]){
b++;
}
}
}else{
if(x==a){
printf("%d\n",b);
}else{
printf("%d\n",a);
}
}
}
return 0;
}
不摆烂了,写题