QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#354690#5094. 小 H 分糖果ANIG0 19ms163032kbC++235.3kb2024-03-15 21:09:392024-03-15 21:09:40

Judging History

你现在查看的是最新测评结果

  • [2024-03-15 21:09:40]
  • 评测
  • 测评结果:0
  • 用时:19ms
  • 内存:163032kb
  • [2024-03-15 21:09:39]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll __int128
const int N=1e5+5;
struct msg{
    signed sm;
    int rs;
    ll 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*300];
    int bk[300*N],idx;
    int nw(){
        return bk[idx--];
    }
    void init(int x,int op){
        if(!p[x].lson&&op==0)p[x].lson=nw();
        if(!p[x].rson&&op==1)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;
        if(l<=mid)init(x,0);
        if(r>mid)init(x,1);
        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)bk[++idx]=p[x].lson,p[x].lson=0;
        if(p[x].rson&&p[p[x].rson].sm.sm==0)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{
        int lson,rson,rt;
    }p[50*N];
    int idx;
    void init(int x){
        if(!p[x].lson)p[x].lson=++idx,p[idx].rt=trr::nw();
        if(!p[x].rson)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,sm*d*d});
      //  cout<<x<<" "<<nl<<"-"<<nr<<" "<<p[x].rt<<" "<<p[x].lson<<endl;
        if(nl==nr)return;
        int mid=nl+nr>>1;
        init(x);
        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<200*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;
        //    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;
            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: 19ms
memory: 163032kb

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:

286187366
286412183
286084151
286084151
285644911
285644911
286007798
286052993
286052993
285988526
285995411
285995411
287765246
287636117
286427695
286427695
286257774
286257774
286012515
286249271
288648394
288648394
288648394
288648394
288648394
289147849
289250066
289250066
289519142
290066863
...

result:

wrong answer 1st lines differ - expected: '285125508', found: '286187366'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

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:

35184346655657074623531
83068742862297311394532
25585194972502250945632
27221411626300328489574
27222959705188326432921
50499264785485362866902
27221258218548286095655
27220752223804155149025
27221480399907983128176
32891938498199857760071
26793868325410780288259
27224083368220301676210
272244349293...

result:


Subtask #4:

score: 0
Skipped

Dependency #1:

0%