ABC E求调
  • 板块学术版
  • 楼主BYR_KKK
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/26 21:06
  • 上次更新2023/11/27 08:23:16
查看原帖
ABC E求调
802664
BYR_KKK楼主2023/11/26 21:06

rt,一直 wa*3


#include<bits/stdc++.h>
#define int long long
#define pii std::pair<int,int>
#define mk(P,Q) std::make_pair((P),(Q))
#define rep(j,k,z) for(int i=j;i<=k;i+=z)
#define per(j,k,z) for(int i=j;i>=z;i-=z)
#define ok std::cout<<"orzsoutherndynasty\n"

const int maxn=2e5+10;

int a[maxn],c[maxn];

int n,q;

struct node{
	int l,r,sum,lz;
}s[maxn<<2];

void build(int l,int r,int p){
	s[p].l=l,s[p].r=r;
	if(l==r){
		s[p].sum=(a[l]!=0);
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	s[p].sum=s[p*2].sum+s[p*2+1].sum;
	return ;
}

void upd(int k,int x,int p){
	int l=s[p].l,r=s[p].r;
	if(l==r&&l==k){
		s[p].sum+=x;
		return ;
	}
	int mid=(l+r)>>1;
	if(k<=mid) upd(k,x,p*2);
	else upd(k,x,p*2+1);
	s[p].sum+=x;
	return ;
}

int query(int p){
	int l=s[p].l,r=s[p].r;
	if(l==r) return l;
	int mid=(l+r)>>1;
	if(s[p*2].sum<mid-l+1) return query(p*2);
	else if(s[p*2+1].sum<r-mid) return query(p*2+1);
	return n;
}

signed main(){
	std::cin>>n>>q;
	rep(1,n,1){
		int opt;
		std::cin>>opt;
		if(opt>=n) opt=n;
		a[opt]++;
		c[i]=opt;
	}
	build(0,n-1,1);
	while(q--){
		int x,y;
		std::cin>>x>>y;
//		if(y>=n) y=n;
		if(c[x]<n) a[c[x]]--;
		if(y<n) a[y]++;
		if(c[x]<n&&a[c[x]]==0) upd(c[x],-1,1);
		c[x]=y;
		if(y<n&&a[y]==1) upd(y,1,1);
		std::cout<<query(1)<<'\n';
	}
	return 0;
}

2023/11/26 21:06
加载中...