记录编号 578121 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [统一省选 2021]图函数 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 1.095 s
提交时间 2023-02-02 15:39:17 内存使用 4.91 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec second
using pii = std::pair<int,int>;

const int maxn = 1e3 + 5;
const int maxm = 2e5 + 5;
int n,m,ans[maxm];
pii E[maxm];
std::bitset<maxn> a[2][maxn],r[2][maxn],G[2][maxn];

void add(int id,int u,int v,int t) {
	G[t][u][v] = true;
	std::queue<int> q;
	std::bitset<maxn> p = r[t][u] & ~r[t][v];
	for(int s = p._Find_first();s <= u&&s < v;s = p._Find_next(s)) {
		ans[id - 1] += a[!t][s][v];
		a[t][s][v] = r[t][v][s] = true;
		q.emplace(v);
		while(!q.empty()) {
			int j = q.front();
			q.pop();
			std::bitset<maxn> cur = G[t][j] & ~a[t][s];
			for(int k = cur._Find_next(s);k < maxn;k = cur._Find_next(k)) {
				ans[id - 1] += a[!t][s][k];
				a[t][s][k] = r[t][k][s] = true;
				q.emplace(k);
			}
		}
	}
	return ;
}

int main() {
	freopen("haoi2021_graph.in","r",stdin);
	freopen("haoi2021_graph.out","w",stdout);
	scanf("%d %d",&n,&m);
	ans[m] = n;
	for(int i = 1;i <= m;++ i)
		scanf("%d %d",&E[i].fir,&E[i].sec);
	for(int i = 1;i <= n;++ i)
		a[0][i][i] = a[1][i][i] = r[0][i][i] = r[1][i][i] = true;
	for(int i = m;i >= 1;-- i)
		add(i , E[i].fir , E[i].sec , 0),add(i , E[i].sec , E[i].fir , 1);
	for(int i = m - 1;~ i;-- i)
		ans[i] += ans[i + 1];
	for(int i = 0;i <= m;++ i)
		printf("%d ",ans[i]);
	return 0;
}