傳送門
題意:就是兩種操作,1:使得x點無效,2:查找大於等於x的最小有效點
解:由於數據達到1e9不好set,所以就線段樹操作就像了,節點維護區間,和存在的有效點數,然後查詢的時候,用存在的有效點數剪枝一下即可。(好像有暴力過的???
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define SZ(a) int((a).size())
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int N=1e6+5;
//il int Add(ll &x,ll y) {return x=x+y>=mod?x+y-mod:x+y;}
//il int Mul(ll &x,ll y) {return x=x*y>=mod?x*y%mod:x*y;}
int n,m;
ll b[N];
struct node{
int op,x;
}qu[N];
struct T{
int l,r;
ll sum;
}s[N<<2];
il void pushup(int rt){
s[rt].sum=s[rt<<1].sum+s[rt<<1|1].sum;
}
il void build(int l,int r,int rt){
if(l==r){ //左閉右開
s[rt].l=b[l],s[rt].r=b[l+1];
s[rt].sum=s[rt].r-s[rt].l;
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
s[rt].l=s[rt<<1].l,s[rt].r=s[rt<<1|1].r;
pushup(rt);
}
il void update(int l,int r,int rt,int X){
if(l==r){
s[rt].sum--;
return ;
}
int mid=(l+r)>>1;
if(X<s[rt<<1].r) update(l,mid,rt<<1,X);
else update(mid+1,r,rt<<1|1,X);
pushup(rt);
}
ll res=0;
il void query(int l,int r,int rt,int X){
if(l==r){
if(s[rt].sum==s[rt].r-s[rt].l){
res=s[rt].l;
return ;
}
else{
res=s[rt].l+1;
return;
}
}
int mid=(l+r)>>1;
if(X<s[rt<<1].r && s[rt<<1].sum) query(l,mid,rt<<1,X);
if(res==0 && s[rt<<1|1].sum) query(mid+1,r,rt<<1|1,X);
}
int main(){
std::ios::sync_with_stdio(0);cin.tie(0);
scanf("%d%d",&n,&m);
int cnt=0,op,x;
for(int i=1;i<=m;++i){
scanf("%d%d",&qu[i].op,&qu[i].x);
if(x>n) continue;
b[++cnt]=qu[i].x;
}
b[++cnt]=n+5;
sort(b+1,b+cnt+1);
int sz=unique(b+1,b+cnt+1)-(b+1);
build(1,sz-1,1);
for(int i=1;i<=m;++i){
if(qu[i].op==2){
if(qu[i].x>n) printf("-1\n");
res=0;
query(1,sz-1,1,qu[i].x);
if(res!=0) printf("%lld\n",res);
else printf("-1\n");
}
else{
if(qu[i].x>n) continue;
update(1,sz-1,1,qu[i].x);
}
}
return 0;
}
題解用map模擬並查集簡單好寫,菜啊;
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define SZ(a) int((a).size())
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int N=1e6+5;
//il int Add(ll &x,ll y) {return x=x+y>=mod?x+y-mod:x+y;}
//il int Mul(ll &x,ll y) {return x=x*y>=mod?x*y%mod:x*y;}
int n,m;
unordered_map<int,int> fa;
il int find(int x){
if(!fa.count(x)) return x;
return fa[x]=find(fa[x]);
}
int main(){
std::ios::sync_with_stdio(0);cin.tie(0);
scanf("%d%d",&n,&m);
int op,x;
for(int i=1;i<=m;++i){
scanf("%d%d",&op,&x);
if(op==1) fa[x]=find(x+1);
else{
int ans=find(x);
printf("%d\n",(ans>n?-1:ans));
}
}
return 0;
}