QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#354919 | #5094. 小 H 分糖果 | ANIG | 0 | 3591ms | 741116kb | C++23 | 6.9kb | 2024-03-16 08:36:01 | 2024-03-16 08:36:03 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll __int128
const int N=1e5+5,inf=1e18;
struct gj{
signed a;int b;
friend gj operator+(gj a,gj b){
gj c={a.a+b.a,a.b+b.b};
while(c.b>inf)c.a++,c.b-=inf;
while(c.b<0)c.a--,c.b+=inf;
return c;
}
friend gj operator-(gj a,gj b){
gj c={a.a-b.a,a.b-b.b};
while(c.b>inf)c.a++,c.b-=inf;
while(c.b<0)c.a--,c.b+=inf;
return c;
}
ll gets(){
return (ll)a*inf+b;
}
}emps;
struct msg{
signed sm;
int rs;
gj pf;
friend msg operator+(msg a,msg b){
return {a.sm+b.sm,a.rs+b.rs,a.pf+b.pf};
}
friend msg operator-(msg a,msg b){
return {a.sm-b.sm,a.rs-b.rs,a.pf-b.pf};
}
msg rev(){
return {-sm,-rs,emps-pf};
}
}emp;
namespace trr{
struct node{
signed son[2],val;
char fl;
msg sm;
}p[N*150];
int bk[150*N],idx;
int nw(){
int y=bk[idx--];
p[y].fl=30;
return y;
}
void add(int x,int d,msg sm){
if(p[x].fl<0){
p[x].sm=p[x].sm+sm;
return;
}
int c=d>>p[x].fl&1;
// cout<<d<<"-"<<(int)p[x].fl<<" "<<c<<" "<<p[x].son[c]<<endl;
if(!p[x].son[c])p[x].son[c]=nw(),p[p[x].son[c]].val=d,p[p[x].son[c]].fl=-1;
else{
// cout<<d<<" "<<(int)p[p[x].son[c]].fl<<" "<<p[p[x].son[c]].val<<endl;
if((d>>p[p[x].son[c]].fl+1)!=p[p[x].son[c]].val){
for(int i=p[x].fl-1;;i--){
if((d>>i+1)!=p[p[x].son[c]].val>>i-p[p[x].son[c]].fl){
i++;
int t=p[x].son[c];
// cout<<x<<" "<<i<<" "<<d<<" "<<p[x].son[c]<<" "<<p[p[x].son[c]].val<<" "<<(int)p[p[x].son[c]].fl<<" "<<(p[t].val>>p[x].fl-p[t].fl-1&1)<<endl;
p[x].son[c]=nw();
p[p[x].son[c]].val=d>>i+1;
p[p[x].son[c]].fl=i;
p[p[x].son[c]].son[p[t].val>>i-p[t].fl-1&1]=t;
break;
}
}
}
}
add(p[x].son[c],d,sm);
p[x].sm=p[p[x].son[0]].sm+p[p[x].son[1]].sm;
}
msg gets(int x,int d){
if(!x)return emp;
if(p[x].fl<0)return p[x].sm;
int c=d>>p[x].fl&1;
// cout<<x<<" "<<(int)p[x].fl<<" "<<p[x].val<<" "<<p[x].son[0]<<" "<<p[x].son[1]<<" "<<(int)p[p[x].son[0]].fl<<" "<<p[p[x].son[0]].val<<" "<<(int)p[p[x].son[1]].fl<<" "<<p[p[x].son[1]].val<<" "<<c<<endl;
if((d>>p[x].fl+1)>p[x].val)return p[x].sm;
msg res=emp;
if(c)res=res+p[p[x].son[0]].sm;
if(p[p[x].son[c]].val<=(d>>p[p[x].son[c]].fl+1))res=res+gets(p[x].son[c],d);
return res;
}
void add(int x,int l,int r,msg sm){
add(x,l,sm);add(x,r+1,sm.rev());
}
}
namespace tr{
struct node{
signed lson,rson,rt;
}p[100*N];
int idx;
void init(int x,int op){
if(!p[x].lson&&op==0)p[x].lson=++idx,p[idx].rt=trr::nw();
if(!p[x].rson&&op==1)p[x].rson=++idx,p[idx].rt=trr::nw();
}
void add(int x,int d,int l,int r,int sm,int nl=0,int nr=1e9){
if(sm>0)trr::add(p[x].rt,l,r,{sm,sm*d,{0,sm*d*d}});
else trr::add(p[x].rt,l,r,{sm,sm*d,{-1,inf+sm*d*d}});
// cout<<x<<" "<<nl<<"-"<<nr<<" "<<p[x].rt<<" "<<p[x].lson<<endl;
if(nl==nr)return;
int mid=nl+nr>>1;
if(d<=mid)init(x,0);
else init(x,1);
if(d<=mid)add(p[x].lson,d,l,r,sm,nl,mid);
else add(p[x].rson,d,l,r,sm,mid+1,nr);
}
msg gets(int x,int l,int r,int d,int nl=0,int nr=1e9){
if(!x||!d)return emp;
// cout<<"ok"<<endl;
if(l<=nl&&r>=nr)return trr::gets(p[x].rt,d);
int mid=nl+nr>>1;
if(r<=mid)return gets(p[x].lson,l,r,d,nl,mid);
if(l>mid)return gets(p[x].rson,l,r,d,mid+1,nr);
return gets(p[x].lson,l,r,d,nl,mid)+gets(p[x].rson,l,r,d,mid+1,nr);
}
int solve(int x,int x1,int x2,int x3,int x4,int k,int he,int sz,int nl=0,int nr=1e9){
if(nl==nr)return nl;
int mid=nl+nr>>1;
msg c=trr::gets(p[p[x].rson].rt,x1)+trr::gets(p[p[x].rson].rt,x2)-trr::gets(p[p[x].rson].rt,x3)-trr::gets(p[p[x].rson].rt,x4);
int ans=c.rs+he-mid*(c.sm+sz);
// cout<<nl<<" "<<nr<<" "<<mid<<" "<<c.sm<<" "<<c.rs<<" "<<ans<<" "<<trr::gets(p[p[x].rson].rt,x2).rs<<endl;
if(ans<=k)return solve(p[x].lson,x1,x2,x3,x4,k,he+c.rs,sz+c.sm,nl,mid);
return solve(p[x].rson,x1,x2,x3,x4,k,he,sz,mid+1,nr);
}
}
int n,m,w[N],fa[N],dep[N],mk[N],dfn[N],eds[N],idx,fs[N][20];
ll al;
vector<int>p[N];
void dfs(int x){
mk[x]=1;dfn[x]=++idx;
for(int i=1;i<=18;i++)fs[x][i]=fs[fs[x][i-1]][i-1];
for(auto c:p[x]){
if(mk[c])continue;
dep[c]=dep[x]+1;
fs[c][0]=x;
dfs(c);
fa[c]=x;
}
mk[x]=0;eds[x]=idx;
}
int up(int x,int k){
while(k){
x=fs[x][__lg(k&-k)];
k^=k&-k;
}
return x;
}
int lca(int a,int b){
if(dep[a]>dep[b])swap(a,b);
b=up(b,dep[b]-dep[a]);
if(a==b)return a;
for(int i=18;i>=0;i--){
if(fs[a][i]!=fs[b][i])a=fs[a][i],b=fs[b][i];
}
return fs[a][0];
}
msg gets(int x,int l=0,int r=1e9){
return tr::gets(1,l,r,dfn[x]);
}
void print(ll x){
if(x>9)print(x/10);
putchar(x%10+'0');
}
signed main(){
for(int i=1;i<150*N;i++)trr::bk[++trr::idx]=i;
//fin();fout();
cin>>n>>m;
for(int i=1;i<n;i++){
int x=i,y=i+1;
cin>>x>>y;
p[x].push_back(y);
p[y].push_back(x);
}
tr::idx=1;
tr::p[1].rt=trr::nw();
dfs(1);
for(int i=1;i<=n;i++)cin>>w[i],tr::add(1,w[i],dfn[i],eds[i],1),al+=w[i]*w[i];
cout<<gets(2).sm<<endl;
while(m--){
int op=1,x=rand()%n+1,y=rand()%n+1,k;
cin>>op>>x>>y;
if(op==1){
tr::add(1,w[x],dfn[x],eds[x],-1);
al-=w[x]*w[x];
w[x]=y;
al+=y*y;
tr::add(1,y,dfn[x],eds[x],1);
}else{
cin>>k;
int z=lca(x,y);
ll res=0,ans=0;
msg cc=gets(x)+gets(y)-gets(z)-gets(fa[z]);
res=al-cc.pf.gets();
// cout<<cc.sm<<" "<<cc.rs<<" "<<x<<" "<<y<<" "<<z<<endl;
if(cc.rs<=k){
print(res);
puts("");
continue;
}
int t=tr::solve(1,dfn[x],dfn[y],dfn[z],dfn[fa[z]],k,0,0);
cc=gets(x,0,t)+gets(y,0,t)-gets(z,0,t)-gets(fa[z],0,t);
res+=cc.pf.gets();
cc=gets(x,t+1,1e9)+gets(y,t+1,1e9)-gets(z,t+1,1e9)-gets(fa[z],t+1,1e9);
ans=cc.rs-t*cc.sm;res+=(ll)t*t*cc.sm;
res-=(k-ans)*(2*t-1);
print(res);
puts("");
}
}
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 28ms
memory: 131848kb
input:
866 841 1 864 4 153 9 559 10 410 11 336 12 417 14 666 18 241 21 184 22 849 23 40 25 783 26 189 28 329 29 216 31 864 34 581 40 131 42 625 45 744 47 723 50 633 51 447 52 454 53 88 55 619 60 259 62 680 67 126 72 371 73 742 80 196 81 536 82 647 85 254 87 172 88 489 93 708 94 227 95 340 96 7 7 91 97 594 ...
output:
15 285125508 285374449 285871392 285072359 284419704 284843737 284692039 284936099 285944374 285174668 285019779 284651455 287282253 287175619 284878507 285369672 284880507 285404741 284913527 286053317 288622563 286960150 287194443 288326074 286937403 287883097 288535226 288195055 288643208 2886329...
result:
wrong answer 1st lines differ - expected: '285125508', found: '15'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Wrong Answer
Test #6:
score: 0
Wrong Answer
time: 3591ms
memory: 741116kb
input:
87080 98363 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 52...
output:
2 27217464773998101198216 27222683135365131711066 27215685950441383375941 27221607244120669838311 27219047117137492446677 27222635053035794978138 27218848172360084265818 27217641965048032442370 27217075857038185043354 27219505943263517662069 27219987830714690994915 27216425553487126261338 2721568455...
result:
wrong answer 1st lines differ - expected: '27217464773998101198216', found: '2'
Subtask #4:
score: 0
Skipped
Dependency #1:
0%