AC on 样例、#4&6、#7~11、#18。
错误信息:
line 83 column 2, read 8, expected 3.
line 71566 column 4, read 4, expected 1.
line 18068 column 5, read 9, expected 4.
line 19110 column 6, read 8, expected 5.
......
在第五组(第一个信息)应该是被特意卡了?似乎所有信息中都是我输出偏大了一些。
代码
#include<bits/stdc++.h>
using namespace std;
int f[300000],n,m,u,v;
char t[300000];
long long s[300000],ans[300000];
int find(int x){
return x == f[x] ? x : f[x] = find(f[x]);
}
vector<int>e[300000];
int main(){
scanf("%d%d%s",&n,&m,t + 1);
for(int i = 1;i <= n;i ++) f[i] = i;
for(int i = 1;i <= m;i ++){
scanf("%d%d",&u,&v);
if(u > v) swap(u,v);
if(t[u] == '1') f[find(u)] = find(v);
e[u].push_back(v),e[v].push_back(u);
}
for(int i = n;i;i --){
ans[i] = ans[i + 1];
int u = find(i);
for(auto j : e[i]){
if(j < i) continue;
int v = find(j);
if(u != v){
ans[i] -= s[u] * (s[u] - 1) + s[v] * (s[v] - 1);
s[u] += s[v],f[v] = u;
ans[i] += s[u] * (s[u] - 1);
}
}
s[u] ++;
ans[i] += 2 * s[u] - 2;
}
for(int i = 1;i <= n;i ++) printf("%lld\n",ans[i] / 2);
return 0;
}