萌新20分求调,Subtask #1,3有WA的,Subtask #4有RE的
查看原帖
萌新20分求调,Subtask #1,3有WA的,Subtask #4有RE的
553625
scp020楼主2023/11/5 18:33

RE大概是由于ans不正确导致异或解密后的输入不合法

#include<bits/stdc++.h>
namespace fast_IO
{
	#define Getchar() p1==p2 and (p2=(p1=Inf)+fread(Inf,1,1<<21,stdin),p1==p2)?EOF:*p1++
	#define Putchar(c) p3==p4 and (fwrite(Ouf,1,1<<21,stdout),p3=Ouf),*p3++=c
	char Inf[1<<21],Ouf[1<<21],*p1,*p2,*p3=Ouf,*p4=Ouf+(1<<21);
	inline void read(int &x,char c=Getchar())
	{
		bool f=c!=45;
		x=0;
		while(c<48 or c>57) c=Getchar(),f&=c!=45;
		while(c>=48 and c<=57) x=(x<<3)+(x<<1)+(c^48),c=Getchar();
		x=f?x:-x;
	}
	inline void write(int x)
	{
		if(x<0) Putchar(45),x=-x;
		if(x>=10) write(x/10),x%=10;
		Putchar(x^48);
	}
	inline void write(std::string st)
	{
		for(int i=0;i<st.size();i++) Putchar(st[i]);
	}
};
using namespace fast_IO;
int n,m,w,a[300010],pre[300010],ed[300010];
std::unordered_map< int,std::set<int> > mp;
struct node
{
	int mpre;
	node *lc,*rc;
	inline void pushup()
	{
		mpre=std::max(lc->mpre,rc->mpre);
	}
};
class seg_tree
{
	#define ls l,mid
	#define rs mid+1,r
private:
	node *root;
	inline node *build(int l,int r)
	{
		node *rt=new node;
		if(l==r) rt->mpre=pre[l];
		else
		{
			int mid=(l+r)/2;
			rt->lc=build(ls),rt->rc=build(rs),rt->pushup();
		}
		return rt;
	}
	inline void fix(node *rt,const int &pos,const int &val,int l,int r)
	{
		if(l==r)
		{
			rt->mpre=val;
			return;
		}
		int mid=(l+r)/2;
		if(pos<=mid) fix(rt->lc,pos,val,ls);
		else fix(rt->rc,pos,val,rs);
		rt->pushup();
	}
	inline int ask(node *rt,const int &L,const int &R,int l,int r)
	{
		if(L<=l && r<=R) return rt->mpre;
		int mid=(l+r)/2,ret=0;
		if(L<=mid) ret=std::max(ret,ask(rt->lc,L,R,ls));
		if(R>mid) ret=std::max(ret,ask(rt->rc,L,R,rs));
		return ret;
	}
public:
	inline void build()
	{
		root=build(1,n);
	}
	inline void fix(const int &pos,const int &val)
	{
		fix(root,pos,val,1,n);
	}
	inline int ask(const int &L,const int &R)
	{
		return ask(root,L,R,1,n);
	}
};
seg_tree tree;
inline void debug()
{
	static int cnt=0;
	cnt++;
	std::cout<<"\n"<<cnt<<":\n";
	for(int i=1;i<=n;i++) std::cout<<pre[i]<<" ";
	std::cout<<"\n";
}
int main()
{
	read(n),read(m),read(w);
	for(int i=1;i<=n;i++) read(a[i]);
	std::set<int>::iterator it,it2,it3;
	for(int i=1,prev;i<=n;i++)
	{
		if(!mp[w-a[i]].size()) pre[i]=-1;
		else
		{
			prev=*(--mp[w-a[i]].end());
			if(ed[prev]) pre[i]=-1;
			else pre[i]=prev,ed[prev]=1;
		}
		mp[a[i]].insert(i);
	}
	tree.build();
	for(int i=1,op,l,r,ans=0;i<=m;i++)
	{
		read(op),read(l),read(r);
		if(op==1)
		{
			it=mp[w-a[l]].upper_bound(l),it2=mp[a[l]].find(l),it3=it2;
			if(it3!=mp[a[l]].end())
			{
				it3++;
				if(it3!=mp[a[l]].end())
					pre[*it3]=std::max(pre[*it3],r==w-a[l]?l:pre[l]),tree.fix(*it3,pre[*it3]);
			}
			if(it!=mp[w-a[l]].end())
			{
				if(it2==mp[a[l]].begin()) pre[*it]=-1;
				else it2--,pre[*it]=*it2;
				tree.fix(*it,pre[*it]);
			}
			mp[a[l]].erase(l),a[l]=r,mp[a[l]].insert(l);
			it=mp[w-a[l]].upper_bound(l),it2=mp[a[l]].find(l),it3=it2;
			if(it!=mp[w-a[l]].end()) pre[*it]=std::max(pre[*it],l),tree.fix(*it,pre[*it]);
			if(it!=mp[w-a[l]].begin()) it--,pre[*it2]=*it;
			else pre[*it2]=-1;
			tree.fix(*it2,pre[*it2]);
			if(it3!=mp[a[l]].begin())
			{
				it3--;
				if(pre[*it3]==pre[*it2]) pre[*it3]=-1;
			}
		}else
		{
			l^=ans,r^=ans;
			if(tree.ask(l,r)>=l) write("Yes\n"),ans++;
			else write("No\n");
		}
		// debug();
	}
	fwrite(Ouf,1,p3-Ouf,stdout),fflush(stdout);
	return 0;
}
2023/11/5 18:33
加载中...