社区讨论
建议放宽时限
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 优化加
CPPfread 快速读入下,一个不干任何事情的长剖模板会 TLE,评测记录。#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 条回复,欢迎继续交流。
正在加载回复...