QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#684954 | #5418. Color the Tree | kiraa | WA | 27ms | 18992kb | C++14 | 3.5kb | 2024-10-28 16:45:55 | 2024-10-28 16:45:55 |
Judging History
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'