社区讨论

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 条回复,欢迎继续交流。

正在加载回复...