QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#684954#5418. Color the TreekiraaWA 27ms18992kbC++143.5kb2024-10-28 16:45:552024-10-28 16:45:55

Judging History

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

  • [2024-10-28 16:45:55]
  • 评测
  • 测评结果:WA
  • 用时:27ms
  • 内存:18992kb
  • [2024-10-28 16:45:55]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int S=200005;
int e,siz[S],dep[S],fa[S],DEEP[S],link[S],head[S],to[S],son[S],n;
void dfs(int u,int FA) {
    siz[u]=1,fa[u]=FA,dep[u]=dep[FA]+1,DEEP[u]=dep[u];
    for(int i=head[u];i;i=link[i]) {
        int v=to[i];
        if(v==FA)continue;
        dfs(v,u);
        siz[u]+=siz[v];
        DEEP[u]=max(DEEP[u],DEEP[v]);
        if(DEEP[son[u]]<DEEP[v])son[u]=v;
    }
}
int a[S],link_id[S];
vector<pair<long long, pair<int, int> > > ve[S];
int ST[S][25],i2[S];
int Qry(int l,int r) {
    return min(ST[l][i2[r-l+1]], ST[r-(1<<i2[r-l+1])+1][i2[r-l+1]]);
}
const int INF = 1e9;
void Clr(int x, int cur) {
    int L = INF, R = -INF, siz = ve[x].size();
    for (int i = siz - 1; i >= max(0, siz - cur); i--) {
        if (L != INF) {
            L++, R++;
        }
        if (ve[x][i].second.first != -1) {
            L = min(L, ve[x][i].second.first);
            R = max(R, ve[x][i].second.second);
            ve[x][i].second = make_pair(-1, -1);
        }
        if (L == INF) continue;
        ve[x][i].first = min(ve[x][i].first, Qry(L, R)*1ll);
    }
    if (L != INF && siz - cur - 1 > 0) {
        L++, R++;
        if (ve[x][siz - cur - 1].second.first == -1)
            ve[x][siz - cur - 1].second = make_pair(L, R);
        else {
            ve[x][siz - cur - 1].second.first = min(ve[x][siz - cur - 1].second.first, L);
            ve[x][siz - cur - 1].second.second = max(ve[x][siz - cur - 1].second.second, R);
        }
    }
}
int dfs1(int u) {
    if (son[u]) {
        link_id[u] = dfs1(son[u]);
    } else {
        link_id[u] = u;
    }
    int x = link_id[u];
    int cur=-INF;
    ve[x].push_back(make_pair(a[0], make_pair(-1, -1)));
    for (int i=head[u];i;i=link[i])
        if (to[i]!=son[u] && to[i]!=fa[u]) {
            cur=max(cur,DEEP[to[i]]);
        }
    if (cur > -INF) {
        cur = cur - dep[u] + 2;
        //cur++;
        Clr(x, cur);
    }
    int szx = ve[x].size();
    for (int i=head[u];i;i=link[i])
        if (to[i]!=son[u] && to[i]!=fa[u]) {
            int o = dfs1(to[i]);
            Clr(o, ve[o].size());
            for (int sz=ve[o].size(),j=sz-1;j>=0;--j) {
                ve[x][szx-(sz-j)-1].first += ve[o][j].first;
                //ve[x][DEEP[u]-DEEP[to[i]]+j].first += ve[o][j].first;
            }
            ve[o].clear();
        }
    ve[x][szx - 1].second = make_pair(0, 0);
    //ve[x][DEEP[u]].second = make_pair(0, 0);
    return x;
}
void add(int uu,int vv) {
    to[++e]=vv;
    link[e]=head[uu];
    head[uu]=e;
}
int main() {
    int T = 0;
    scanf("%d",&T);
    i2[1]=0;
    for (int i=2;i<S;++i)
        i2[i]=i2[i>>1]+1;
    while(T--) {
        scanf("%d",&n);
        for(int i=0;i<n;i++)scanf("%d",&a[i]),ST[i][0]=a[i];
        e=0;
        for(int i=1;i<=n;i++)
            head[i]=0, ve[i].clear(), son[i] = 0, link_id[i] = 0;
        for (int i=1;(1<<i)<=n;++i)
            for (int j=0;j+(1<<i)-1<n;++j)
                ST[j][i]=min(ST[j][i-1],ST[j+(1<<(i-1))][i-1]);
        for(int i=1,u,v;i<n;i++)scanf("%d%d",&u,&v),add(u,v),add(v,u);
        //printf("NMSL---------\n");
        DEEP[0] = 0, dep[0] = -1, dfs(1,0);
        //printf("NMSL---------\n");
        int x = dfs1(1);
        //printf("NMSL---------\n");
        Clr(x, ve[x].size());
        long long ans = 0;
        for (int i = 0, siz = ve[x].size(); i < siz; i++)
            ans += ve[x][i].first;
        printf("%lld\n", ans);
    }
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 18992kb

input:

3
4
10 15 40 1
1 2
2 3
2 4
5
10 5 1 100 1000
1 2
2 3
2 4
4 5
4
1000 200 10 8
1 2
2 3
3 4

output:

35
17
1218

result:

ok 3 number(s): "35 17 1218"

Test #2:

score: -100
Wrong Answer
time: 27ms
memory: 16960kb

input:

3000
54
43 44 11 49 17 14 7 30 35 12 34 14 15 8 29 47 30 31 39 17 26 23 26 45 34 50 49 13 35 18 29 15 13 44 47 5 22 20 19 46 30 22 26 13 47 46 43 27 48 48 13 14 30 44
1 2
1 3
2 4
3 5
4 6
2 7
4 8
1 9
3 10
1 11
8 12
2 13
9 14
1 15
1 16
15 17
15 18
7 19
1 20
19 21
13 22
10 23
17 24
9 25
9 26
24 27
8 28...

output:

180
168
222
230
161
240
258
126
105
81
155
73
166
129
163
124
228
230
132
196
153
171
78
282
195
286
191
211
119
197
211
234
88
252
244
242
188
182
195
125
109
151
180
176
226
210
182
97
199
59
56
31
115
205
203
172
139
208
53
140
213
170
173
137
233
94
163
273
80
350
156
133
146
159
240
269
137
222...

result:

wrong answer 5th numbers differ - expected: '156', found: '161'