社区讨论
95ptsTLE#11,在线求卡常
P5290[十二省联考 2019] 春节十二响参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhqm4d63
- 此快照首次捕获于
- 2025/11/09 02:23 3 个月前
- 此快照最后确认于
- 2025/11/16 14:05 3 个月前
RT,需要卡常到原来的约80%
CPP#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#define push_back emplace_back
#define re register
using namespace std;
char *p1,*p2,in[100000];
#define gc() (p1 == p2 && (p2 = (p1 = in) + fread(in,1,100000,stdin),p1 == p2)?EOF:*p1++)
inline int read()
{
int x = 0,f = 1;
char c = gc();
while (c < 48 || c > 57)
{
if (c == '-') f = -1;
c = gc();
}
while (c >= 48 && c <= 57) x = x * 10 + c - 48,c = gc();
return x * f;
}
void write(long long x)
{
if (x < 0) putchar('-'),x = -x;
if (x / 10) write(x/10);
putchar(x%10+48);
}
int a[200010],sz[200010],son[200010];
vector <int> g[200010],r;
void dfs1(int x)
{
sz[x] = 1;
for (re int i = 0;i < g[x].size();i++)
{
int y = g[x][i];
dfs1(y),sz[x] += sz[y],son[x] = sz[y] > sz[son[x]] ? y : son[x];
}
return;
}
void dfs2(int x,vector <int> &r)
{
if (son[x]) dfs2(son[x],r);
vector <int> h;
for (re int i = 0;i < g[x].size();i++)
if (g[x][i] != son[x])
{
dfs2(g[x][i],h);
for (re int i = 0;i < min(r.size(),h.size());++i) r[i] = max(r[i],h[i]);
if (r.size() < h.size()) for (int i = r.size();i < h.size();++i) r.push_back(h[i]);
h.clear();
}
r.push_back(-1);
int cur = 0;
while (r[cur] >= a[x]) ++cur;
for (re int i = r.size() - 1;i > cur;i--) r[i] = r[i - 1];
r[cur] = a[x];
return;
}
signed main()
{
int n = read();
for (re int i = 1;i <= n;++i) a[i] = read();
for (re int i = 2;i <= n;++i) g[read()].push_back(i);
dfs1(1);
dfs2(1,r);
long long ans = 0;
for (re int i = 0;i < r.size();i++) ans += r[i];
write(ans);
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...