萌新求调
查看原帖
萌新求调
461359
huangrenheluogu楼主2023/12/18 15:52

萌新刚学线段树分治,下面这份代码全 WA 了,1111 个测试点反馈均为如下:

Wrong Answer.wrong answer On line 1 column 1, read N, expected Y.
#include<bits/stdc++.h>
#define ls p << 1
#define rs p << 1 | 1
using namespace std;
const int N = 1e5 + 5;
int n, m, k, fa[N << 1], u, v, x, y, t, dep[N];
struct edge{
	int u, v, depu = 0, depv = 0;//fa[v] = u
}s[N << 1], tem;
vector<edge>S[N << 2];
inline void modify(int p, int l, int r, int x, int y){
	if(x > y) return ;
	if(x <= l && r <= y){
		S[p].push_back((edge){u, v});
		return ;
	}
	int mid = l + r >> 1;
	if(mid >= x) modify(ls, l, mid, x, y);
	if(mid < y) modify(rs, mid + 1, r, x, y);
}
inline void NO(int l, int r){
	for(int i = l; i <= r; i++) printf("No\n");
}
inline int getfa(int x){
	if(fa[x] == x) return x;
	return getfa(fa[x]);
}
inline void merge(int x, int y){
	int fax = getfa(x), fay = getfa(y);
	if(fax == fay) return ;
	if(dep[fax] < dep[fay]) swap(fax, fay);
	s[++t] = (edge){fax, fay, dep[fax], dep[fay]};
	fa[fay] = fax;
	if(dep[fax] == dep[fay]) dep[fax]++;
}
inline void solve(int p, int l, int r){
//	printf("in the dot %d, L = %d, R = %d\n", p, l, r);
	int las = t;
	bool flag = 0;
	for(auto e : S[p]){
		int fax = getfa(e.u), fay = getfa(e.v);
//		printf("%d %d %d %d\n", e.u, e.v, fax, fay);
		if(fax == fay){
			NO(l, r);
			flag = 1;
			break;
		}
		merge(e.u, e.v + n);
		merge(e.u + n, e.v);
	}
	if(l == r && !flag){
		printf("Yes\n");
		return ;
	}
	if(!flag){
		int mid = l + r >> 1;
		solve(ls, l, mid);
		solve(rs, mid + 1, r);
	}
	while(t > las){
		tem = s[t];
		fa[tem.v] = tem.v;
		dep[tem.u] = tem.depu;
		dep[tem.v] = tem.depv;
		t--;
	}
//	printf("out the dot %d\n", p);
}
int main(){
	scanf("%d%d%d", &n, &m, &k);
	while(m--){
		scanf("%d%d%d%d", &u, &v, &x, &y);
		modify(1, 1, k, x + 1, y);
	}
	for(int i = 1; i <= n * 2; i++) fa[i] = i, dep[i] = 1;
	solve(1, 1, k);
	return 0;
}
2023/12/18 15:52
加载中...