萌新问个问题
  • 板块P5889 跳树
  • 楼主Legitimity
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/8/14 20:44
  • 上次更新2023/11/4 10:39:27
查看原帖
萌新问个问题
241977
Legitimity楼主2021/8/14 20:44

虽然已经过了,但搞不懂为什么下面这份代码会全 RE。

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
#define djq 1000000007
#define lowbit(x) (x&(-x))
#define siz 100000
const double pi=acos(-1.0);
inline void file(){
	freopen("test.in","r",stdin);
	freopen("test.ans","w",stdout);
}
char buf[1<<21],*p1=buf,*p2=buf;
inline int getc(){
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
	rg int ret=0,f=0;char ch=getc();
    while(!isdigit(ch)){if(ch=='-')f=1;ch=getc();}
    while(isdigit(ch)){ret=ret*10+ch-48;ch=getc();}
    return f?-ret:ret;
}
int n,m,q;
int a[500005],v,l,r,opt;
ll s;
struct node{
	int l,r,up,dn;
	ll val;
}t[500005<<3];
inline void up(node& x,const node cl,const node cr){
	x.l=cl.l; x.r=cr.r;
	if(!cl.up&&!cl.dn) return x=cr,void();
	if(!cr.up&&!cr.dn) return x=cl,void();
	if(cl.dn>cr.up){
		x.up=cl.up;
		x.dn=cl.dn+cr.dn-cr.up;
		x.val=((cl.val>>cr.up)<<cr.dn)+cr.val;
	}else{
		x.up=cl.up+cr.up-cl.dn;
		x.dn=cr.dn;
		x.val=cr.val;
	}
}
void build(int x,int l,int r){
	t[x].l=l; t[x].r=r;
	if(l==r){
		if(a[l]==1){
			t[x].dn=1;
		}else if(a[l]==2){
			t[x].dn=1;
			t[x].val=1;
		}else{
			t[x].up=1;
		}
		return;
	}
	const int mid=l+r>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	up(t[x],t[x<<1],t[x<<1|1]);
}
void modify(int x,const int y,const int v){
	if(t[x].l==t[x].r){
		t[x].up=t[x].dn=t[x].val=0;
		if(v==1){
			t[x].dn=1;
		}else if(v==2){
			t[x].dn=1;
			t[x].val=1;
		}else{
			t[x].up=1;
		}
		return;
	}
	const int mid=t[x].l+t[x].r>>1;
	if(y<=mid) modify(x<<1,y,v);
	else modify(x<<1|1,y,v);
	up(t[x],t[x<<1],t[x<<1|1]);
}
node query(int x,const int sl,const int sr){
	if(sl<=t[x].l&&sr>=t[x].r) return t[x];
	const int mid=t[x].l+t[x].r>>1;
	if(sl>mid) return query(x<<1|1,sl,sr);
	if(sr<=mid) return query(x<<1,sl,sr);
	node ret,cl=query(x<<1,sl,sr),cr=query(x<<1|1,sl,sr);
	up(ret,cl,cr);
	return ret;
}
int main(){
	n=read(),m=read(),q=read();
	for(rg int i=1;i<=m;++i) a[i]=read();
	build(1,1,m);
	while(q--){
		opt=read();
		if(opt==1){
			s=read(),l=read(),r=read();
			const node ans=query(1,l,r);
			printf("%d\n",(max(1ll,s>>ans.up)<<ans.dn)+ans.val);
		}else{
			s=read(),v=read();
			modify(1,s,v);
		}
	}
	return 0;
}  
2021/8/14 20:44
加载中...