QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#561339 | #8222. 投票游戏 | Idtwtei | 0 | 29ms | 24540kb | C++20 | 4.1kb | 2024-09-12 21:55:58 | 2024-09-12 21:55:59 |
Judging History
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%