QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#139981 | #4891. 树上的孤独 | zhouhuanyi | 0 | 1960ms | 252936kb | C++14 | 5.0kb | 2023-08-14 20:55:25 | 2023-08-14 20:55:28 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#include<algorithm>
#define N 300000
using namespace std;
int read()
{
char c=0;
int sum=0;
while (c<'0'||c>'9') c=getchar();
while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
return sum;
}
const int inf=(int)(1e9);
struct reads
{
int num,data;
bool operator < (const reads &t)const
{
return data<t.data;
}
};
reads tong[N+1];
struct rds
{
int num,data,data2;
bool operator < (const rds &t)const
{
return data!=t.data?data<t.data:data2<t.data2;
}
};
rds tongs[N+1];
int n,m,q,ans,length,lg[N+1],rt[N+1],rt2[N+1],st[N+1],lengs,delta[N+1],dque[N+1],top,dfn[N+1],sz[N+1],len,v1[N+1],v2[N+1],fa[N+1],fa2[N+1][21],depth[N+1],depth2[N+1],ST[N+1][21],L[N+1],R[N+1];
bool used[N+1],used2[N+1];
vector<int>E[N+1];
vector<int>E2[N+1];
set<reads>s[N+1];
void add(int x,int y)
{
E[x].push_back(y),E[y].push_back(x);
return;
}
void add2(int x,int y)
{
E2[x].push_back(y),E2[y].push_back(x);
return;
}
void dfs(int x)
{
used[x]=1;
for (int i=0;i<E[x].size();++i)
if (!used[E[x][i]])
fa[E[x][i]]=x,depth[E[x][i]]=depth[x]+1,dfs(E[x][i]);
return;
}
void dfs2(int x)
{
dfn[x]=++len,used2[x]=sz[x]=1;
for (int i=0;i<E2[x].size();++i)
if (!used2[E2[x][i]])
fa2[E2[x][i]][0]=x,depth2[E2[x][i]]=depth2[x]+1,dfs2(E2[x][i]),sz[x]+=sz[E2[x][i]];
return;
}
bool cmp(int x,int y)
{
return depth[x]<depth[y];
}
int lca(int x,int y)
{
if (depth2[x]<depth2[y]) swap(x,y);
for (int i=lg[m];i>=0;--i)
if (depth2[fa2[x][i]]>=depth2[y])
x=fa2[x][i];
if (x==y) return x;
for (int i=lg[m];i>=0;--i)
if (fa2[x][i]!=fa2[y][i])
x=fa2[x][i],y=fa2[y][i];
return fa2[x][0];
}
void dfs3(int x,int d)
{
if (depth[x]<=d) dque[++top]=v1[x];
for (int i=0;i<E[x].size();++i)
if (fa[E[x][i]]==x)
dfs3(E[x][i],d);
return;
}
struct seg
{
struct node
{
int ls,rs,data;
};
node tree[60*N+1];
void push_up(int k)
{
tree[k].data=tree[tree[k].ls].data+tree[tree[k].rs].data;
return;
}
int add(int k,int L,int R,int x,int d)
{
int nw=++length;
tree[nw]=tree[k];
if (L==R)
{
tree[nw].data+=d;
return nw;
}
int mid=(L+R)>>1;
if (x<=mid) tree[nw].ls=add(tree[nw].ls,L,mid,x,d);
else tree[nw].rs=add(tree[nw].rs,mid+1,R,x,d);
push_up(nw);
return nw;
}
int query(int k,int L,int R,int l,int r)
{
if (L==l&&R==r) return tree[k].data;
int mid=(L+R)>>1;
if (r<=mid) return query(tree[k].ls,L,mid,l,r);
else if (l>=mid+1) return query(tree[k].rs,mid+1,R,l,r);
else return query(tree[k].ls,L,mid,l,mid)+query(tree[k].rs,mid+1,R,mid+1,r);
}
};
seg T;
int get_query(int l,int r)
{
if (l>r) return inf;
int lw=lg[r-l+1];
return min(ST[l][lw],ST[r-(1<<lw)+1][lw]);
}
int main()
{
int op,x,y,d,d1,d2,ps,l,r,pv,nt;
for (int i=2;i<=N;++i) lg[i]=lg[i>>1]+1;
n=read(),m=read(),q=read();
for (int i=1;i<=n-1;++i) x=read(),y=read(),add(x,y);
for (int i=1;i<=m-1;++i) x=read(),y=read(),add2(x,y);
for (int i=1;i<=n;++i) v1[i]=read();
for (int i=1;i<=m;++i) v2[i]=read(),st[++lengs]=v2[i];
sort(st+1,st+lengs+1),lengs=unique(st+1,st+lengs+1)-st-1,depth[1]=depth2[1]=1,dfs(1),dfs2(1);
for (int i=1;i<=m;++i) tong[i]=(reads){i,depth2[i]};
sort(tong+1,tong+m+1);
for (int i=1;i<=lg[m];++i)
for (int j=1;j<=m;++j)
fa2[j][i]=fa2[fa2[j][i-1]][i-1];
for (int i=1;i<=m;++i)
{
int d=lower_bound(st+1,st+lengs+1,v2[tong[i].num])-st;
auto it=s[d].lower_bound((reads){tong[i].num,dfn[tong[i].num]});
rt[i]=T.add(rt[i-1],1,m,dfn[tong[i].num],1);
if (it!=s[d].end()) nt=(*it).num;
else nt=-1;
if (it!=s[d].begin()) it--,pv=(*it).num;
else pv=-1;
if (pv!=-1) rt[i]=T.add(rt[i],1,m,dfn[lca(pv,tong[i].num)],-1);
if (nt!=-1) rt[i]=T.add(rt[i],1,m,dfn[lca(nt,tong[i].num)],-1);
if (pv!=-1&&nt!=-1) rt[i]=T.add(rt[i],1,m,dfn[lca(pv,nt)],1);
s[d].insert((reads){tong[i].num,dfn[tong[i].num]});
}
for (int i=1;i<=m;++i) tongs[i]=(rds){i,lower_bound(st+1,st+lengs+1,v2[i])-st,dfn[i]};
sort(tongs+1,tongs+m+1);
for (int i=1;i<=lengs;++i) L[i]=inf,R[i]=0;
for (int i=1;i<=m;++i) L[tongs[i].data]=min(L[tongs[i].data],i),R[tongs[i].data]=max(R[tongs[i].data],i);
for (int i=1;i<=m;++i) ST[i][0]=depth2[tongs[i].num],delta[i]=tongs[i].data2;
for (int i=1;i<=lg[m];++i)
for (int j=1;j<=m;++j)
ST[j][i]=min(ST[j][i-1],ST[j+(1<<(i-1))][i-1]);
while (q--)
{
op=read();
if (op==1)
{
x=read(),y=read(),d1=read()^ans,d2=read()^ans,ps=lower_bound(tong+1,tong+m+1,(reads){0,depth2[y]+d2+1})-tong-1,ans=T.query(rt[ps],1,m,dfn[y],dfn[y]+sz[y]-1),top=0,dfs3(x,depth[x]+d1),sort(dque+1,dque+top+1),top=unique(dque+1,dque+top+1)-dque-1;
for (int i=1;i<=top;++i)
{
d=lower_bound(st+1,st+lengs+1,dque[i])-st;
if (st[d]==dque[i])
{
if (depth2[y]+d2<=tong[m].data) l=lower_bound(delta+L[d],delta+R[d]+1,dfn[y])-delta,r=lower_bound(delta+L[d],delta+R[d]+1,dfn[y]+sz[y])-delta-1,ans+=(get_query(l,r)>depth2[y]+d2);
}
else ans++;
}
printf("%d\n",ans);
}
else x=read(),d=read(),v1[x]=d;
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 3ms
memory: 60584kb
input:
20 2000 2000 8 15 8 13 14 8 14 7 12 14 12 1 9 13 9 4 5 9 5 10 2 5 2 19 6 19 6 16 11 7 11 20 18 2 18 17 3 6 1395 1783 1395 1735 1735 457 457 739 739 438 438 101 101 441 441 1879 1879 1238 1238 501 501 1732 1732 1910 1910 2000 2000 834 834 917 917 111 111 780 780 1966 1966 1604 1604 623 623 1748 1748 ...
output:
105 93 2 40 19 54 192 6 69 21 21 200 78 75 137 33 68 68 54 35 24 6 13 72 53 100 26 200 24 119 94 20 75 36 197 76 15 48 10 19 58 44 23 2 108 157 5 3 15 102 36 98 26 78 171 82 32 141 163 9 136 15 97 132 119 55 22 52 1 16 40 33 54 13 34 153 101 133 140 200 21 80 84 37 73 9 28 22 174 37 61 51 95 4 53 68...
result:
wrong answer 4th numbers differ - expected: '44', found: '40'
Subtask #2:
score: 0
Wrong Answer
Test #3:
score: 0
Wrong Answer
time: 1102ms
memory: 234136kb
input:
20 200000 500000 8 18 8 4 2 4 2 14 13 4 13 16 6 4 6 3 1 4 1 17 15 6 15 19 7 17 7 11 5 14 5 10 20 7 12 15 9 8 165302 77239 165302 198189 165302 180850 165302 192738 165302 173589 165302 194087 165302 191990 165302 167370 165302 101092 165302 92553 165302 163654 165302 122381 165302 152105 165302 1919...
output:
2 17595 3898 3423 16 517 5136 11355 21 7340 21 18327 15797 6628 513 1179 6110 1869 6227 662 16736 13223 1597 5445 6059 2385 6265 1 1 277 3497 1806 1235 1036 17804 4656 5519 4632 4545 21 244 2684 2 4610 8571 4037 1 13497 5636 2054 3486 4880 5828 782 2052 1510 13232 2593 918 16806 1 17623 334 1 1 719 ...
result:
wrong answer 6th numbers differ - expected: '518', found: '517'
Subtask #3:
score: 0
Wrong Answer
Test #7:
score: 0
Wrong Answer
time: 350ms
memory: 148564kb
input:
20 100000 100000 16 12 16 20 6 12 6 18 2 16 2 8 5 20 5 13 3 6 3 11 19 11 19 17 9 12 9 15 4 15 4 7 10 5 14 15 14 1 85812 94626 85812 91172 91172 93788 93788 96567 96567 75524 75524 23275 23275 98340 98340 81608 81608 91480 91480 75108 75108 56605 56605 93317 93317 41617 41617 77160 77160 727 727 7559...
output:
2565 605 8287 8983 3561 9180 651 281 2464 7308 2682 1175 1383 1268 8228 4407 89 2679 621 4822 3151 9182 1 8987 2091 9950 8009 9944 1 5037 87 2021 1881 1 1275 2179 335 1088 9386 3460 7723 1958 2741 1256 2331 697 1 544 1 428 699 2332 447 3 23 1422 2321 673 2449 1 2318 696 9999 1 176 1366 8932 6497 766...
result:
wrong answer 1st numbers differ - expected: '2568', found: '2565'
Subtask #4:
score: 0
Wrong Answer
Test #13:
score: 0
Wrong Answer
time: 996ms
memory: 248888kb
input:
1 200000 500000 189127 137023 189127 199761 199761 160701 160701 130639 130639 190908 190908 176819 176819 193363 193363 188021 188021 182446 182446 186028 186028 198828 198828 190792 190792 155378 155378 189428 189428 177276 177276 146159 146159 175923 175923 188073 188073 182206 182206 131072 1310...
output:
3781 1773 771 7328 18160 19394 1952 2 5498 1 2862 3368 7393 5130 5706 1 5996 19866 2 5123 2 12549 1496 4837 7770 16333 18175 5926 17983 19707 3820 17709 17094 4225 3824 575 5637 3660 4987 15686 2 18774 29 5068 16606 2275 16601 4544 598 845 19976 7054 882 163 2743 1683 6747 5090 1631 5109 2930 2777 1...
result:
wrong answer 1st numbers differ - expected: '3782', found: '3781'
Subtask #5:
score: 0
Wrong Answer
Test #15:
score: 0
Wrong Answer
time: 1960ms
memory: 252936kb
input:
20 200000 1000000 13 10 13 5 19 5 19 20 15 10 15 6 12 6 12 3 8 10 8 2 1 20 1 11 14 10 14 16 18 3 18 7 4 3 9 10 9 17 194055 154514 194055 148156 148156 115271 115271 198116 198116 179433 179433 171975 171975 196600 196600 167194 167194 185078 185078 191409 191409 163496 163496 178243 178243 154093 15...
output:
459 5817 10120 7654 4894 19469 3577 16028 2835 7536 1131 9925 18495 478 11867 2081 9841 7574 7285 91 1834 7391 3344 6097 19488 16462 6206 1725 5911 5596 3803 1918 698 3319 2715 19890 5606 634 751 1299 15990 2973 1654 14621 5218 2639 118 1896 3266 1935 14603 4574 7219 5890 11028 4391 7458 9754 19632 ...
result:
wrong answer 10th numbers differ - expected: '7538', found: '7536'