这一题是卡常吗?这是我的代码:
#pragma GCC target("avx")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include <bits/stdc++.h>
using namespace std;
struct edge {
int v, a, b;
edge(int _v, int _a, int _b) {
v = _v;
a = _a;
b = _b;
}
};
vector<edge> g[200010];
int r[200010];
vector<int> allb;
void dfs(int u, int suma, int bidx, int sumb) {
while (bidx < allb.size() && sumb + allb[bidx] <= suma) {
sumb += allb[bidx];
bidx++;
}
r[u] = bidx;
for (edge e: g[u]) {
allb.push_back(e.b);
dfs(e.v, suma + e.a, bidx, sumb);
allb.pop_back();
}
}
void run() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) g[i].clear();
for (int j = 2; j <= n; j++) {
int p, a, b;
scanf("%d%d%d", &p, &a, &b);
g[p].push_back(edge(j, a, b));
}
allb.clear();
dfs(1, 0, 0, 0);
for (int i = 2; i <= n; i++) printf("%d ", r[i]);
printf("\n");
}
int main() {
int t;
scanf("%d", &t);
while (t--) run();
return 0;
}
这是数据:
1
200000
1 1 100000000
2 1 1
3 1 1
4 1 1
5 1 1
...
我的代码按这个数据跑是O(n)的,但是还是光荣TLE。我甚至把cin,cout改了,还加了火车头,但是还是TLE。
大佬们,求助。