本蒟蒻刚学 OI 第二天,本地 AC 洛谷 RE!
查看原帖
本蒟蒻刚学 OI 第二天,本地 AC 洛谷 RE!
363036
chlchl楼主2022/1/21 08:22

昨天发暴力代码 RE 的帖解决了,今天又 RE 了……

真和 RE 过不去了 ORZ。

今天更奇怪,本地运行第一组数据是 AC 的,洛谷 RE。

#include<bits/stdc++.h>
using namespace std;

const int N = 1e4 + 10;
const int M = 1e7 + 10;
int n, m, rt, SZ, q[N], ans[M];
int sz[N], mson[N];
int len, dis[N], emp[M], dis_son[M], is_ok[M];
bool visit[N];
struct edge{int u, v, w;};
vector<edge> g[N];

void dfs(int u, int fa){
	sz[u] = 1, mson[u] = 0;
	for(int i=0;i<g[u].size();i++){
		int v = g[u][i].v;
		if(v != fa && !visit[v]){
			dfs(v, u);
			mson[u] = max(mson[u], sz[v]);
			sz[u] += sz[v];
		}
	}
	mson[u] = max(mson[u], SZ - sz[u]);
	if(mson[u] < mson[rt])	rt = u; 
}

int query(int u, int fa){
	dis_son[++len] = dis[u];
	for(int i=0;i<g[u].size();i++){
		int v = g[u][i].v, w = g[u][i].w;
		if(visit[v] || v == fa)	continue;
		dis[v] = dis[u] + w;
		query(v, u);
	}
}

void solve(int u){
	int pos = 0;
	for(int i=0;i<g[u].size();i++){
		int v = g[u][i].v, w = g[u][i].w;
		if(visit[v])	continue;
		len = 0, dis[v] = w;
		query(v, u);
		for(int j=len;j;j--){//遍历子树距离 
			for(int l=1;l<=m;l++){
				if(q[l] >= dis_son[j])	ans[l] |= is_ok[q[l] - dis_son[j]];
			}
		}
		for(int j=len;j;j--)	emp[++pos] = dis_son[j], is_ok[dis_son[j]] = 1;
	}
	for(int i=1;i<=pos;i++)	is_ok[emp[i]] = 0;
}


void divide(int u){
	visit[u] = is_ok[0] = 1;
	solve(u);
	for(int i=0;i<g[u].size();i++){
		int v = g[u][i].v, w = g[u][i].w;
		if(visit[v])	continue;
		solve(v);
		SZ = sz[u], rt = 0, mson[rt] = 1e9;
		dfs(v, 0);
//		cout << rt << endl;
		divide(rt);
	}
}

int main(){
//	freopen("1.txt", "w", stdout);
	scanf("%d%d", &n, &m);
	for(int i=1;i<n;i++){
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		g[u].push_back((edge){u, v, w});
		g[v].push_back((edge){v, u, w});
	}
	for(int i=1;i<=m;i++)	scanf("%d", &q[i]);
	SZ = n, mson[rt] = 1e9;
	dfs(1, 0);
	divide(rt);
	for(int i=1;i<=m;i++){
		if(ans[i])	puts("AYE");
		else	puts("NAY");
	}
	return 0; 
}
2022/1/21 08:22
加载中...