QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#245213 | #7767. 数据结构 | Crysfly | 5 | 4609ms | 206912kb | C++17 | 7.4kb | 2023-11-09 19:47:35 | 2023-11-09 19:47:35 |
Judging History
answer
// what is matter? never mind.
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2")
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
//#define int long long
#define ull unsigned long long
using namespace std;
inline ll read()
{
char c=getchar();ll x=0;bool f=0;
for(;!isdigit(c);c=getchar())f^=!(c^45);
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
if(f)x=-x;return x;
}
#define fi first
#define se second
#define pb push_back
#define mkp make_pair
typedef pair<int,int>pii;
typedef vector<int>vi;
#define maxn 400005
#define inf 0x3f3f3f3f
mt19937_64 rng(114);
int n;
struct dat{
ull c,s;
dat(ull x=0,ull y=0){c=x,s=y;}
void add(ull x){
s+=c*x;
}
};
dat operator +(dat a,dat b){
return dat(a.c+b.c,a.s+b.s);
}
dat operator -(dat a,dat b){
return dat(a.c-b.c,a.s-b.s);
}
struct node{
dat s0,s[4];
node(){
s0=0;
For(i,0,3)s[i]=0;
}
};
node operator +(node a,node b){
node c;
c.s0=a.s0+b.s0;
For(i,0,3)c.s[i]=a.s[i]+b.s[i];
return c;
}
//void operator +=(node&a,node b){
// a=a+b;
//}
struct oper{
ull t0,t[4];
oper(){
t0=0;
For(i,0,3)t[i]=0;
}
bool emp(){
For(i,0,3)if(t[i])return 0;
if(t0)return 0;
return 1;
}
};
oper operator +(oper a,oper b){
oper c;
c.t0=a.t0+b.t0;
For(i,0,3)c.t[i]=a.t[i]+b.t[i];
return c;
}
node operator +(node a,oper b){
a.s0.add(b.t0);
For(i,0,3){
a.s[i].add(b.t0);
a.s0.s+=a.s[i].c*b.t[i];
a.s[i].add(b.t[i]);
}
return a;
}
oper mov(oper a){
For(i,0,2)a.t[i]=a.t[i+1];
a.t[3]=0;
return a;
}
node movup(node a){
Rep(i,3,1)a.s[i]=a.s[i-1]; a.s[0]=0;
return a;
}
namespace T{
int rt[maxn],ls[maxn],rs[maxn];
node v[maxn],s[maxn];
oper tag[maxn],tag2[maxn];
unsigned rnd[maxn];
void up(int x){
s[x]=s[ls[x]]+v[x]+s[rs[x]];
}
void pt(int x,oper y){
if(!x)return;
tag[x]=tag[x]+y;
tag2[x]=tag2[x]+y;
v[x]=v[x]+y;
s[x]=s[x]+y;
}
void down(int x){
if(!x || tag[x].emp())return;
pt(ls[x],tag[x]),pt(rs[x],tag[x]),tag[x]=oper();
}
void split(int p,int k,int&x,int&y){
if(!p)return x=y=0,void();
down(p);
if(p<=k)x=p,split(rs[p],k,rs[p],y);
else y=p,split(ls[p],k,x,ls[p]); up(p);
}
void split(int p,int k,int&x,int&y,int&z){
int t;
split(p,k-1,x,t);
split(t,k,y,z);
}
int merge(int x,int y){
if(!x||!y)return x|y;
down(x),down(y);
if(rnd[x]<rnd[y])return rs[x]=merge(rs[x],y),up(x),x;
return ls[y]=merge(x,ls[y]),up(y),y;
}
void ins(int&p,int x){
if(!p||rnd[x]<rnd[p]){
split(p,x,ls[x],rs[x]);
p=x,up(p);return;
}
down(p);
if(x<=p)ins(ls[p],x);
else ins(rs[p],x);
up(p);
}
void del(int&p,int x){
if(p==x){
p=merge(ls[p],rs[p]);
return;
}
down(p);
if(x<p)del(ls[p],x);
else del(rs[p],x);
up(p);
}
};
#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
int fa[maxn],ch[maxn][2];
oper tag[maxn];
node v[maxn],s[maxn];
bool rev[maxn];
bool chk(int x){return rs(fa[x])==x;}
bool nrt(int x){return ls(fa[x])==x||rs(fa[x])==x;}
void up(int x){
s[x]=s[ls(x)]+v[x]+s[rs(x)]+movup(T::s[T::rt[x]]);
}
void pr(int x){
rev[x]^=1;
swap(ls(x),rs(x));
}
void update(int u,ull x){
// if(x)cerr<<"update "<<u<<" "<<x<<"\n";
oper t;
t.t[0]=x;
v[u]=v[u]+t;
}
void pt(int x,oper y){
if(!x || y.emp())return;
assert(x);
tag[x]=tag[x]+y;
// cout<<"pushtag "<<x<<"\n";
// For(i,0,3)cout<<y.t[i]<<" "; cout<<"\n";
update(x,y.t0+y.t[0]);
s[x]=s[x]+y;
T::pt(T::rt[x],mov(y));
}
void down(int x){
if(rev[x]){
if(ls(x))pr(ls(x));
if(rs(x))pr(rs(x));
rev[x]=0;
}
if(!tag[x].emp()){
if(ls(x))pt(ls(x),tag[x]);
if(rs(x))pt(rs(x),tag[x]);
tag[x]=oper();
}
}
void downall(int p){
if(nrt(p))downall(fa[p]);
down(p);
}
void rot(int x){
int y=fa[x],z=fa[y],k=chk(x),s=ch[x][!k];
fa[x]=z; if(nrt(y)) ch[z][chk(y)]=x;
fa[y]=x; ch[x][!k]=y;
if(s)fa[s]=y; ch[y][k]=s; up(y),up(x);
}
void splay(int x){
if(!x)return;
downall(x);
while(nrt(x)){
int y=fa[x];
if(nrt(y))rot(chk(x)==chk(y)?y:x);
rot(x);
}
}
int findL(int x){
down(x);
while(ls(x))down(x=ls(x));
return splay(x),x;
}
int st[maxn],tp;
void ins(int x,int y){
// cout<<"ins "<<x<<" "<<y<<"\n";
y=findL(y);
int a,b;
// T::split(T::rt[x],y,a,b);
// T::v[y]=T::s[y]=[y]; // wrong.
node tmp;
tmp.s0=s[y].s0;
int z=y;
For(i,0,3){
tmp.s[i]=tmp.s[i]+v[z].s[0];
For(j,0,2-i) tmp.s[i+j+1]=tmp.s[i+j+1]+T::s[T::rt[z]].s[j];
if(i==3 || !rs(z))break;
z=findL(rs(z)),splay(z);
}
// cout<<"tmp:\n";
// For(i,0,3)cout<<tmp.s[i].s<<" ";puts("");
splay(y);
T::v[y]=T::s[y]=tmp;
T::tag[y]=T::tag2[y]=oper();
T::ins(T::rt[x],y);
// T::rt[x]=T::merge(T::merge(a,y),b);
}
void del(int x,int y){
// cout<<"del "<<x<<" "<<y<<"\n";
y=findL(y),splay(y);
T::del(T::rt[x],y);
oper tmp=T::tag2[y];
// For(i,0,3) cout<<tmp.t[i]<<" "; cout<<"val_y\n";
oper tt; tt.t0=tmp.t0;
pt(y,tt); tt.t0=0;
int z=y;
For(i,0,3){
For(j,0,3-i) tt.t[j]=tmp.t[i+j];
T::pt(T::rt[z],mov(tt));
//v[z]
// oper tt0; tt0.t[0]=tmp.t[i];
update(z,tmp.t[i]);
up(z);
if(i==3 || !rs(z))break;
z=findL(rs(z)),splay(z);
}
splay(y);
}
void make(int x,int y){
// cout<<"mak "<<x<<" "<<y<<"\n";
if(rs(x)){
int tmp=rs(x); rs(x)=0;
ins(x,tmp);
}
splay(y);
// cout<<"mk "<<x<<" "<<y<<"\n";
if(y){
del(x,y);
splay(y);
}
rs(x)=y;
up(x);
}
void acc(int x){
// cout<<"acc "<<x<<"\n";
tp=0;
for(int y=0;x;x=fa[y=x]) splay(x),st[++tp]=x;
// For(i,1,tp) cout<<st[i]<<" "; cout<<"\n";
Rep(i,tp,1){
splay(st[i]);
make(st[i],st[i-1]);
}
// cout<<"done\n";
}
void mkrt(int x){acc(x),splay(x),pr(x);}
void split(int x,int y){
mkrt(x),acc(y),splay(y);
}
void dfs(int u){
if(!u)return;
down(u);
if(ls(u))dfs(ls(u));
cout<<u<<" ";
if(rs(u))dfs(rs(u));
}
vi e[maxn];
void dfs(int u,int pa){
for(int v:e[u])
if(v!=pa){
fa[v]=u;
dfs(v,u),ins(u,v);
}
up(u);
}
int m;
signed main()
{
// freopen("3.in","r",stdin);
// freopen("my.out","w",stdout);
n=read(),m=read();
For(i,2,n){
int u=read(),v=read();
e[u].pb(v),e[v].pb(u);
}
For(i,1,n)T::rnd[i]=rng(),v[i].s0.c=v[i].s[0].c=1;
dfs(1,0);
// For(i,1,n)cout<<fa[i]<<" ";cout<<" fa\n";
For(_,1,m){
int op=read(),u,v,k,x;
if(op==1){
u=read(),v=read(),k=read(),x=read();
oper t;
For(i,0,k) t.t[i]=x;
split(u,v);
// dfs(v);cout<<" ---\n";
// cout<<"pushtag "<<(t.emp())<<"\n";
pt(v,t);
}
if(op==2){
u=read(),x=read();
mkrt(1);
acc(u),splay(u);
oper t; t.t0=x;
update(u,x);
T::pt(T::rt[u],t);
up(u);
}
if(op==3){
u=read(),v=read(),k=read();
split(u,v);
ull res=0;
For(i,0,k)res+=s[v].s[i].s;
cout<<res<<"\n";
}
if(op==4){
u=read();
mkrt(1);
acc(u),splay(u);
ull res=0;
res+=::v[u].s[0].s;
res+=T::s[T::rt[u]].s0.s;
cout<<res<<"\n";
}
// For(i,1,n){
// cout<<"ASK "<<i<<"\n";
// split(i,i);
// cout<<"i: "<<i<<" "<<::v[i].s0.s<<" "<<::v[i].s0.c<<" "<<s[i].s0.s<<" "<<s[i].s0.c<<"\n";
// }
// cout<<"\n";
}
return 0;
}
/*
8 6
1 2
1 3
2 4
2 5
2 8
4 6
4 7
1 6 8 0 1
1 6 8 1 1
*/
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 81ms
memory: 194108kb
input:
5000 5000 1 2 2 3 3 4 4 5 5 6 5 7 6 8 7 9 9 10 8 11 11 12 12 13 12 14 14 15 15 16 16 17 16 18 18 19 18 20 20 21 20 22 22 23 23 24 23 25 23 26 26 27 27 28 28 29 27 30 30 31 29 32 32 33 33 34 32 35 35 36 36 37 35 38 36 39 38 40 38 41 41 42 42 43 43 44 42 45 44 46 45 47 47 48 48 49 48 50 49 51 51 52 52...
output:
37227703492 2136305359188 2794367845468 1309925069860 1698169768858 2678958746332 6688353830259 2086447878235 5784954064446 2186592622 3983445146011 1674542130 6524658548 7062132275751 10064479061786 11555551363815 492570862 3353986958511 2834694279 4198036633070 4395772262 4221137767 9630829210 991...
result:
wrong answer 7th numbers differ - expected: '6690595071246', found: '6688353830259'
Subtask #2:
score: 0
Wrong Answer
Test #3:
score: 0
Wrong Answer
time: 4609ms
memory: 202676kb
input:
200000 200000 1 2 1 3 1 4 3 5 1 6 1 7 7 8 8 9 2 10 1 11 5 12 1 13 7 14 10 15 2 16 7 17 11 18 5 19 5 20 1 21 16 22 1 23 3 24 20 25 14 26 2 27 6 28 15 29 10 30 15 31 5 32 13 33 12 34 31 35 31 36 36 37 36 38 1 39 28 40 5 41 12 42 41 43 20 44 30 45 22 46 11 47 47 48 45 49 14 50 41 51 3 52 30 53 29 54 6 ...
output:
0 0 0 0 0 0 0 0 7615073807 4176911055 0 4745654848 6222845818 0 0 9739142819 0 1424960716 5224818790 9459319003 13717923473 8673060864 0 11610197664 0 0 9587792729 0 0 0 2747489046 12425650803 0 0 11191496476 0 37597503993 0 0 15164651949 14868775382 15559673116 0 16391028892 0 15726757336 0 2421390...
result:
wrong answer 543rd numbers differ - expected: '91846733121', found: '90920431782'
Subtask #3:
score: 5
Accepted
Test #5:
score: 5
Accepted
time: 4100ms
memory: 206616kb
input:
200000 200000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 ...
output:
0 134315201201061 38210069287857 75889674481730 25202765567748 179527420359031 75824479907233 156951577189979 246509811214535 251383387317167 181645886595511 285463150681348 213797241401335 244909583142805 53376921005282 451665818220 379334117147250 720759810155057 768646965102274 224741692238593 18...
result:
ok 100065 numbers
Test #6:
score: 0
Accepted
time: 4122ms
memory: 206912kb
input:
200000 200000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 ...
output:
0 1950387013442 2906443199266 2144858813468 3137341049831 1081425884175 20924388962208 73530126133368 136609133052209 125022026678010 22502893517249 99022896674514 84010333777754 13909990392191 43442491331837 190816082733002 92810414504491 244006706308139 42843404030538 126151201042579 7249812065288...
result:
ok 99740 numbers
Subtask #4:
score: 0
Wrong Answer
Test #7:
score: 0
Wrong Answer
time: 4004ms
memory: 202188kb
input:
200000 200000 1 2 2 3 3 4 1 5 3 6 5 7 5 8 7 9 2 10 7 11 11 12 10 13 6 14 3 15 14 16 4 17 11 18 3 19 14 20 4 21 4 22 12 23 18 24 5 25 5 26 14 27 13 28 24 29 11 30 26 31 29 32 28 33 31 34 23 35 33 36 6 37 11 38 22 39 13 40 35 41 37 42 21 43 12 44 4 45 16 46 12 47 21 48 1 49 26 50 45 51 41 52 46 53 7 5...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
wrong answer 848th numbers differ - expected: '916502377', found: '0'
Subtask #5:
score: 0
Skipped
Dependency #4:
0%
Subtask #6:
score: 0
Skipped
Dependency #4:
0%
Subtask #7:
score: 0
Skipped
Dependency #2:
0%
Subtask #8:
score: 0
Skipped
Dependency #1:
0%