我突然发现了一件要命的事情

我发现昨天晚上的周赛 F 题有一个很恐怖的现象!

有许多人都被卡成了 93.5,原因竟然各不相同。

数据到底有多水啊,后面的那几组数据。

上面都是废话。

然后,请大佬帮我调一下代码吧,悬赏一关注。谢谢了。

#include <bits/stdc++.h>

#define L(i, a, b) for(int i = (a); i <= (b); i++)
#define R(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long

using namespace std;

const int N = 2e5 + 10;

int a[N], dep[N], fa[N], sz[N], dfn[N], bfn[N], dfc, bfc, n, q, rk[N]; 
int h[N], tot; ll sum[N];
struct ST {
	ll lg[N], F[20][N];
	
	void build() {
		L(i, 2, n) lg[i] = lg[i>>1] + 1;
		L(i, 1, lg[n]) L(j, 1, n) F[i][j] = max(F[i-1][j], F[i-1][j + (1 << i-1)]);
	}
	
	ll query(int l, int r) {
		int k = lg[r - l + 1];
		return max(F[k][l], F[k][r - (1 << k) + 1]);
	}
}st; 
struct Edge {
	int v, w, lst;
}e[N<<2];

void add(int u, int v, int w) {
	e[++tot] = {v, w, h[u]};
	h[u] = tot;
}

bitset<N> vis; vector<pair<int, int>> pos[N];

void bfs() {
	vis = 0;
	queue<int> q;
	q.push(1);
	while(!q.empty()) {
		int u = q.front();
		q.pop(); bfn[u] = ++bfc; rk[bfc] = u; st.F[0][bfc] = sum[u];
		pos[dep[u]].push_back({dfn[u], bfc});
//		cout << dep[u] << '\n'; 
		for(int i = h[u]; i;i = e[i].lst) {
			int v = e[i].v;
			if(v == fa[u]) continue;
			q.push(v);
		}
	}
}

void dfs(int u) {
	++dfc; dfn[u] = dfc; sz[u] = 1;
	for(int i = h[u]; i; i = e[i].lst) {
		int v = e[i].v, w = e[i].w;
		if(v == fa[u]) continue;
		fa[v] = u;
		sum[v] = sum[u] + w;
		dep[v] = dep[u] + 1;
		dfs(v); sz[u] += sz[v];
	}
}



int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);  cout.tie(0);
	cin >> n;
	L(i, 2, n) {
		int u, v, w; cin >> u >> v >> w;
		add(u, v, w); add(v, u, w);
	}
	dfs(1); bfs(); st.build();
//	L(i, 1, n) cout << bfn[i] << ' '; cout << '\n';
//	L(i, 1, n) cout << i << ' '; cout << '\n';
//	L(i, 1, n) cout << dfn[i] << ' '; cout << '\n';
//	L(i, 1, n) cout << st.F[0][i] << ' '; cout << '\n';
	L(i, 0, n) sort(pos[i].begin(), pos[i].end());
	cin >> q;
	L(i, 1, q) {
		int u, x; cin >> u >> x;
		int dp = dep[u] + x, L = dfn[u], R = dfn[u] + sz[u] - 1;
		auto l = lower_bound(pos[dp].begin(), pos[dp].end(), make_pair(L, 0));
		auto r = upper_bound(pos[dp].begin(), pos[dp].end(), make_pair(R, 0));
		if(r - pos[dp].begin() < 0) r = pos[dp].end()-1;
		if(l == pos[dp].end() || r->second - l->second + 1 <= 0) cout << -1 << '\n';
		else cout << st.query((*l).second, (*r).second) - sum[u] << '\n';
	}
	return 0;
}



#include <bits/stdc++.h>

#define L(i, a, b) for(int i = (a); i <= (b); i++)
#define R(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long

using namespace std;

const int N = 1e5 + 10;

ll n, q, h[N], tot, dep[N], S[N], sz[N], fa[N], son[N], mx, sum[N];

struct Edge {
	ll v, w, lst;
}e[N<<2];

void add(ll u, ll v, ll w) {
	e[++tot] = {v, w, h[u]};
	h[u] = tot;
}

ll Ans[N];

vector<pair<ll, ll>> Q[N];

void dfs(int u) {
	sz[u] = 1; son[u] = -1;
	for(int i = h[u]; i; i = e[i].lst) {
		int v = e[i].v;
		if(v == fa[u]) continue;
		dep[v] = dep[u] + 1; sum[v] = sum[u] + e[i].w;
		fa[v] = u;
		dfs(v);
		sz[u] += sz[v];
		if(son[u] == -1 || sz[v] > sz[son[u]]) son[u] = v;
	}
}

void init(int l, int r) {
	L(i, l, r) S[i] = 0;
	mx = 0;
}

void DFS(int u, ll dp, int p, int x) {
	S[dp] = max(S[dp], sum[u]);
	mx = max(mx, dp);
	for(int i = h[u]; i; i = e[i].lst) {
		int v = e[i].v;
		if(v == fa[u] || v == p) continue;
		DFS(v, dp+1, p, x);
	}
}

void dfs1(int u) {
	for(int i = h[u]; i; i = e[i].lst) {
		int v = e[i].v;
		if(v == fa[u] || v == son[u]) continue;
		dfs1(v); init(dep[v], mx);
	} 
	if(son[u] != -1) dfs1(son[u]);
	DFS(u, dep[u], son[u], u);
	for(auto x : Q[u]) {
		int dp = x.first, id = x.second;
		if(mx < dp + dep[u]) Ans[id] = -1;
		else Ans[id] = S[dp + dep[u]] - S[u];
	}
}


int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);  cout.tie(0);
	cin >> n;
	L(i, 2, n) {
		ll u, v, w; cin >> u >> v >> w;
		add(u, v, w); add(v, u, w);
	} 
	cin >> q;
	L(i, 1, q) {
		int u, x; cin >> u >> x;
		Q[u].push_back({x, i});
	}
	dep[1] = 1;
	dfs(1); 
	dfs1(1); 
	L(i, 1, q) cout << Ans[i] << '\n';
	return 0;
}

全部评论

相关推荐

机械打工仔:我来告诉你原因,是因为sobb有在线简历,有些HR为了快会直接先看在线简历,初步感觉不合适就不会找你要详细的了
投了多少份简历才上岸
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务