社区讨论

建议放宽时限

P14135【MX-X22-T6】「TPOI-4F」Miserable EXperience参与者 1已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mjjstbve
此快照首次捕获于
2025/12/24 17:15
2 个月前
此快照最后确认于
2025/12/26 21:15
2 个月前
查看原帖
理由:O2 优化加 fread 快速读入下,一个不干任何事情的长剖模板会 TLE,评测记录
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 1e6 + 10;
int n, p[MAXN], a[MAXN]; char buf[1 << 24];
// 快速读入缓冲区设置
static char _in_buf[1 << 24], *_p1 = _in_buf, *_p2 = _in_buf;
#define get_char() (_p1 == _p2 && (_p2 = (_p1 = _in_buf) + fread(_in_buf, 1, 1 << 24, stdin), _p1 == _p2) ? EOF : *_p1++)

// 读入一个整数
inline void readInt(int &x) {
    x = 0; char c = get_char();
    while (c < '0' || c > '9') c = get_char();
    while (c >= '0' && c <= '9') x = x * 10 + (c - '0'), c = get_char();
}

// 读入一个字符串到指定的 buffer
inline void readStr(char *s) {
    char c = get_char();
    while (c <= 32 && c != EOF) c = get_char(); // 跳过空白符
    while (c > 32) *s++ = c, c = get_char();
    *s = '\0';
}

inline void read() {
    // 1. 读入 n
    readInt(n);

    // 2. 读入第一个字符串并处理 p 数组
    readStr(buf);
    for (int i = 2, j = 0; i <= n; i++) {
        // 原逻辑:~buf[i + j - 2] & 1 相当于判断字符 ASCII 码是否为偶数
        for (; (~buf[i + j - 2] & 1); j++);
        p[i] = j;
    }

    // 3. 读入第二个字符串并处理 a 数组
    readStr(buf);
    for (int i = 1, j = 0; i <= n; i++) {
        // 确保 a[i] 初始为 0(全局变量默认 0,若多次调用 read 则需手动清零)
        a[i] = 0; 
        // 使用强转确保位运算在 int 范围内正确执行
        a[i] |= (int)(buf[j++] - 33) << 24;
        a[i] |= (int)(buf[j++] - 33) << 18;
        a[i] |= (int)(buf[j++] - 33) << 12;
        a[i] |= (int)(buf[j++] - 33) << 6;
        a[i] |= (int)(buf[j++] - 33);
    }
}
vector<int> V[1000005];
int dep[1000005];
int mxdep[1000005],son[1000005];
ll ans=0;
void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	mxdep[u]=0;
	for(int v:V[u]){
		if(v==fa) continue;
		dfs(v,u);
		mxdep[u]=max(mxdep[u],mxdep[v]+1);
		if(!son[u]||mxdep[v]>mxdep[son[u]]) son[u]=v;
	}
}
struct d_info{
	ll cnt,mnd,sumd;
	void operator += (const d_info &b){
		cnt+=b.cnt;
		mnd=min(mnd,b.mnd);
		sumd+=b.sumd;
	}
	int val(){
		return sumd-cnt*mnd;
	}
};
struct s_suf{
	ll sum,mx;
};
struct ChainInfo{
	vector<s_suf> Vs;
	vector<d_info> Vd;
	ll ans1,ans2;
}ci[1000005];
struct Stk{
	ll dlt;
	int id;
	ll res;
};
vector<Stk> stk[1000005];
bool solve(int u,int fa,int tp){
	if(u==tp){
		ci[u].Vs.resize(mxdep[u]+3);
		ci[u].Vd.resize(mxdep[u]+3);
		stk[u].push_back({0,mxdep[u]+1,0});
	}
	if(son[u]) solve(son[u],u,tp);
	for(int v:V[u]){
		if(v==son[u]) continue;
		solve(v,u,v);
	}
	return 1;
}
int main(){
	read();
	for(int i=2;i<=n;i++){
		V[p[i]].push_back(i);
	}
	dfs(1,0);
	solve(1,1,1);
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...