QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#561339#8222. 投票游戏Idtwtei0 29ms24540kbC++204.1kb2024-09-12 21:55:582024-09-12 21:55:59

Judging History

你现在查看的是最新测评结果

  • [2024-09-12 21:55:59]
  • 评测
  • 测评结果:0
  • 用时:29ms
  • 内存:24540kb
  • [2024-09-12 21:55:58]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

#define int long long 
#define pb push_back
const int N=4e5+100;
mt19937 rnd(time(0)); 
#define gc getchar()
#define rd read()
inline int read(){
	int x=0,f=0; char c=gc;
	for(;c<'0'||c>'9';c=gc) f|=(c=='-');
	for(;c>='0'&&c<='9';c=gc) x=(x<<1)+(x<<3)+(c^48);
	return f?-x:x;
}

int n,m,a[N],b[N],fa[N],val[N];
int dfn[N],d_c=0,fdfn[N],dep[N],top[N],btm[N],son[N],siz[N];
vector<int> G[N];

struct SEG{
	int div,v0,v1;
	void print(){ printf("%lld %lld %lld\n", div, v0, v1); }
	int get(int x){ return x<div?v0:v1; }
	SEG operator+(const SEG &x){ SEG res=x; res.v0=get(x.v0),res.v1=get(x.v1); return res; }
}f[N];

struct TREAP{
	#define lc t[id].ls 
	#define rc t[id].rs
	struct TREE{ int ls,rs,rid,v,b,mn,sum; }t[N<<1];
	int rt[N],tot=0;
	
	int make(int v,int b){ return t[++tot]={0,0,rnd(),v,b,v,b},tot; }
	void pushup(int id){ t[id].sum=t[lc].sum+t[id].b+t[rc].sum,t[id].mn=min({t[lc].mn,t[lc].sum+t[id].v,t[lc].sum+t[id].b+t[rc].mn}); }
	
	int mer(int x,int y){
		if(!x||!y) return x^y;
		if(t[x].rid<t[y].rid) return t[x].rs=mer(t[x].rs,y),pushup(x),x;
		else return t[y].ls=mer(x,t[y].ls),pushup(y),y;
	}
	void spl(int id,int &x,int &y,int b){
		if(!id) return x=y=0,void();
		if(t[x].b<=b) x=id,spl(rc,rc,y,b),pushup(x);
		else y=id,spl(lc,x,lc,b),pushup(y);
	}
	void ins(int &id,int v,int b){ int x,y; spl(id,x,y,b),id=mer(x,mer(make(v,b),y)); }
	void del(int &id,int b){ int x,y,z; spl(id,x,z,b),spl(x,x,y,b-1),y=mer(t[y].ls,t[y].rs),id=mer(x,mer(y,z)); }
	int bry(int id,int v){
		if(!id) return v;
		if(t[lc].mn<v) return bry(lc,v);
		else if(t[lc].sum+t[id].v<v) return v-t[lc].sum;
		else return bry(rc,v)-t[lc].sum-t[id].b;
	}
	#undef lc
	#undef rc
}T;
struct SMT{
	#define lc (id<<1)
	#define rc (id<<1|1)
	#define mid (l+r>>1)
	SEG t[N<<2];
	void pushup(int id){ t[id]=t[lc]+t[rc]; }
	void chg(int id,int l,int r,int ql){
		if(l==r) return t[id]=f[fdfn[l]],void();
		ql<=mid?chg(lc,l,mid,ql):chg(rc,mid+1,r,ql); pushup(id);
	}
	SEG ask(int id,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr) return t[id];
		if(qr<=mid) return ask(lc,l,mid,ql,qr);
		else if(ql>=mid+1) return ask(rc,mid+1,r,ql,qr);
		else return ask(lc,l,mid,ql,qr)+ask(rc,mid+1,r,ql,qr); 
	}
	#undef lc
	#undef rc
	#undef mid
}S;
inline int get(int x){ return S.ask(1,1,n,dfn[x],dfn[btm[top[x]]]).get(0); }

void dfs0(int u,int fu){
	siz[u]=1,son[u]=0,dep[u]=dep[fu]+1;
	for(int v:G[u]){
		if(v==fu) continue;
		dfs0(v,u),siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v; 
	}
}
void dfs1(int u,int fu,int tp){
	fdfn[dfn[u]=++d_c]=u,btm[top[u]=tp]=u;
	if(son[u]) dfs1(son[u],u,tp);
	for(int v:G[u]) if(v!=fu&&v!=son[u]) dfs1(v,u,v);
}
void dfs2(int u,int fu){
	if(son[u]) dfs2(son[u],u),val[u]+=b[son[u]];
	for(int v:G[u]){
		if(v==fu||v==son[u]) continue;
		dfs2(v,u),val[u]+=b[v];
		T.ins(T.rt[u],get(v),b[v]);
	}
	f[u].div=f[u].v0=T.bry(T.rt[u],val[u]);
	f[u].v1=T.bry(T.rt[u],val[u]-b[son[u]]);
	S.chg(1,1,n,dfn[u]);
}

void chg(int x){
	for(;x;x=fa[x]){
		S.chg(1,1,n,dfn[x]);
		x=top[x]; if(!fa[x]) break;
		T.del(T.rt[fa[x]],b[x]),T.ins(T.rt[fa[x]],get(x),b[x]);
		f[fa[x]].div=f[fa[x]].v0=T.bry(T.rt[fa[x]],val[fa[x]]);
		f[fa[x]].v1=T.bry(T.rt[fa[x]],val[fa[x]]-b[son[fa[x]]]);
	}
}

signed main(){
	
	n=rd,m=rd;
	for(int i=2;i<=n;++i) G[fa[i]=rd].pb(i);
	for(int i=1;i<=n;++i) val[i]=a[i]=rd;
	for(int i=1;i<=n;++i) b[i]=rd;
	
	dfs0(1,0),dfs1(1,0,1),dfs2(1,0);
	
	for(int i=1,op,p,x,y;i<=m;++i){
		op=rd; if(op==1) p=rd,x=rd,y=rd; else x=rd,y=rd;
		if(op==1){
			val[p]+=x-a[p];
			f[p].div=f[p].v0=T.bry(T.rt[p],val[p]);
			f[p].v1=T.bry(T.rt[p],val[p]-b[son[p]]);
			swap(a[p],x),swap(b[p],y),chg(p),swap(a[p],x),swap(b[p],y);
			if(fa[p]){
				val[fa[p]]+=y-b[p];
				if(son[fa[p]]!=p) T.del(T.rt[fa[p]],b[p]),T.ins(T.rt[fa[p]],get(p),y);
				f[fa[p]].div=f[fa[p]].v0=T.bry(T.rt[fa[p]],val[fa[p]]);
				f[fa[p]].v1=T.bry(T.rt[fa[p]],val[fa[p]]-b[son[fa[p]]]);
				a[p]=x,b[p]=y,chg(fa[p]);
			}
			a[p]=x,b[p]=y;
		}
		else printf("%lld\n", (get(x)<get(y)));
	}

	return 0;
}
/*
start coding at 20:45.
finish it at 21:43.
*/ 

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Runtime Error

Test #1:

score: 0
Runtime Error

input:

20 500
1 1 3 1 3 5 6 6 7 3 5 3 9 5 4 7 7 18 2
42129194 82765784 1447057 29726963 82321558 32094641 22474113 49277574 27527633 20746795 47630926 92888389 26787144 80703040 43876864 97991729 12117966 75633318 33577855 93462601
69163546 49621952 45236756 46447931 34085269 55246550 54414402 99593046 103...

output:


result:


Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Runtime Error

Test #13:

score: 0
Runtime Error

input:

200 200000
1 2 3 3 5 3 1 6 2 9 11 5 5 2 4 9 17 8 1 4 10 20 18 20 23 13 16 28 15 4 6 27 26 11 30 25 10 2 13 23 25 35 4 8 40 43 36 26 7 27 45 35 14 31 54 45 9 8 9 54 16 32 62 9 29 2 43 39 34 39 27 2 52 56 6 9 48 26 66 28 35 57 79 13 71 61 38 43 80 26 61 26 79 1 24 64 79 15 41 42 56 55 6 24 92 43 89 76...

output:


result:


Subtask #4:

score: 0
Runtime Error

Test #18:

score: 0
Runtime Error

input:

200 200000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1...

output:


result:


Subtask #5:

score: 0
Wrong Answer

Test #26:

score: 0
Wrong Answer
time: 29ms
memory: 24540kb

input:

200 200000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 1...

output:

1
0
1
0
1
1
1
1
0
1
1
1
0
0
0
0
1
0
0
0
0
1
0
0
0
1
1
0
1
0
0
0
0
0
1
1
0
0
0
1
1
0
0
0
1
1
1
0
1
0
0
1
0
1
1
0
0
1
0
0
1
0
0
1
0
0
0
1
0
1
0
0
1
1
1
1
1
1
1
0
0
0
1
0
0
1
0
0
1
0
0
1
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
1
1
1
0
0
0
0
1
0
1
0
1
0
1
1
1
0
0
1
1
0
1
0
0
0
0
0
0
0
1
0
1
1
1
0
0
1
1
0
...

result:

wrong answer 19th numbers differ - expected: '1', found: '0'

Subtask #6:

score: 0
Skipped

Dependency #1:

0%