萌新刚学线段树分治,下面这份代码全 WA 了,11 个测试点反馈均为如下:
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;
}