QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#354706 | #5094. 小 H 分糖果 | ANIG | 10 | 27ms | 211960kb | C++23 | 5.7kb | 2024-03-15 21:32:48 | 2024-03-15 21:32:49 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
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;
return c;
}
friend gj operator-(gj a,gj b){
gj c={a.a-b.a,a.b-b.b};
while(c.b<0)c.a--,c.b+=inf;
return c;
}
int gets(){
return (ll)a*inf+b;
}
};
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};
}
}emp;
namespace trr{
struct node{
signed lson,rson;
msg sm;
}p[N*240];
int bk[240*N],idx;
int nw(){
return bk[idx--];
}
void init(int x){
if(!p[x].lson)p[x].lson=nw();
if(!p[x].rson)p[x].rson=nw();
}
void add(int x,int l,int r,msg sm,int nl=1,int nr=1e5){
if(l<=nl&&r>=nr){
// cout<<"add"<<x<<" "<<nl<<" "<<nr<<" "<<sm.sm<<endl;
p[x].sm=p[x].sm+sm;
return;
}
int mid=nl+nr>>1;
init(x);
if(l<=mid)add(p[x].lson,l,r,sm,nl,mid);
if(r>mid)add(p[x].rson,l,r,sm,mid+1,nr);
if(p[x].lson&&p[p[x].lson].sm.sm==0&&!p[p[x].lson].lson&&!p[p[x].lson].rson)bk[++idx]=p[x].lson,p[x].lson=0;
if(p[x].rson&&p[p[x].rson].sm.sm==0&&!p[p[x].rson].lson&&!p[p[x].rson].rson)bk[++idx]=p[x].rson,p[x].rson=0;
}
msg gets(int x,int d,int nl=1,int nr=1e5){
if(!d)return emp;
if(!x)return emp;
// cout<<nl<<" "<<nr<<" "<<d<<" "<<p[x].sm.sm<<endl;
if(nl==nr)return p[x].sm;
int mid=nl+nr>>1;
if(d<=mid)return gets(p[x].lson,d,nl,mid)+p[x].sm;
else return gets(p[x].rson,d,mid+1,nr)+p[x].sm;
}
}
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){
trr::add(p[x].rt,l,r,{sm,sm*d,{0,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(){
//fin();fout();
cin>>n>>m;
for(int i=1;i<240*N;i++)trr::bk[++trr::idx]=i;
for(int i=1;i<n;i++){
int x,y;
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];
while(m--){
int op,x,y,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("");
}
}
}
详细
Subtask #1:
score: 10
Accepted
Test #1:
score: 10
Accepted
time: 24ms
memory: 198104kb
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:
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 288632989 ...
result:
ok 419 lines
Test #2:
score: 0
Accepted
time: 27ms
memory: 198432kb
input:
951 896 6 886 8 809 9 392 12 590 13 643 16 322 17 613 37 605 42 354 44 594 47 905 49 623 53 240 56 546 58 751 60 919 62 74 63 303 64 105 68 578 69 41 41 110 71 402 74 528 75 616 76 83 77 230 83 289 84 354 88 340 89 65 91 785 92 831 93 286 96 101 97 841 99 556 100 700 101 574 102 652 103 534 105 107 ...
output:
323762325 323477550 323340853 323950611 323726768 322803839 322828150 323927499 323452292 322435378 323945420 323767611 322557229 323137116 322736140 322900873 322078759 322286746 322383436 322825503 321513631 320299707 320738958 320752861 319979668 320430841 319960294 319658294 317899682 318822085 ...
result:
ok 443 lines
Subtask #2:
score: 0
Wrong Answer
Dependency #1:
100%
Accepted
Test #3:
score: 0
Wrong Answer
time: 19ms
memory: 211960kb
input:
903 809 2 4 5 604 6 396 10 637 12 593 22 855 26 586 29 170 34 64 37 559 42 413 44 789 46 584 49 83 52 642 55 688 59 899 61 614 68 572 74 707 79 278 80 32 83 315 86 779 87 323 89 901 91 720 92 463 93 592 98 348 99 644 100 465 102 377 103 835 104 479 107 757 111 207 112 458 116 43 43 623 121 538 124 1...
output:
103902478522974282 * 716063541255406145 0 / 299465326125192708 , 854110714688013875 ' * . 751606926746490546 3016182845548359759 643200052420414317 ( / , + 2083633984168570375 3360243498454711907 . 0 864845706881293288 229011584117835535 . 3051792200658497448 3560026872561987197 * 177503873679259962...
result:
wrong answer 1st lines differ - expected: '276805063584166248522', found: '103902478522974282'
Subtask #3:
score: 0
Memory Limit Exceeded
Test #6:
score: 0
Memory Limit Exceeded
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:
result:
Subtask #4:
score: 0
Skipped
Dependency #1:
100%
Accepted
Dependency #2:
0%