제출 #733732

#제출 시각아이디문제언어결과실행 시간메모리
733732QwertyPiMisspelling (JOI22_misspelling)C++14
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N_MAX = 5e5 + 11;
const int MOD = 1e9 + 7;
const int INF = 1LL << 60;

vector<int> G[N_MAX], Gi[N_MAX];
vector<int> tp;
bool vis[N_MAX];
vector<int> scc[N_MAX];

struct Edge{
	int u, v;
};

void dfs(int u, int pa = -1){
	vis[u] = true;
	for(auto v : G[u]){
		if(!vis[v]){
			dfs(v, u);
		}
	}
	tp.push_back(u);
}

int n, m;

int imax[N_MAX], imin[N_MAX], omax[N_MAX], omin[N_MAX];

void dfs_dp1(int u, int pa = -1){
	vis[u] = true; omax[u] = omin[u] = u;
	for(auto v : G[u]){
		if(!vis[v]){
			dfs_dp1(v, u);
		}
		omax[u] = max(omax[u], omax[v]);
		omin[u] = min(omin[u], omin[v]);
	}
}

void dfs_dp2(int u, int pa = -1){
	vis[u] = true; imax[u] = imin[u] = u;
	for(auto v : Gi[u]){
		if(!vis[v]){
			dfs_dp2(v, u);
		}
		imax[u] = max(imax[u], imax[v]);
		imin[u] = min(imin[u], imin[v]);
	}
}

void dp_combine(){
	fill(imax, imax + n, -INF);
	fill(imin, imin + n, INF);
	fill(omax, omax + n, -INF);
	fill(omin, omin + n, INF);
	
	fill(vis, vis + n, 0);
	for(int i = 0; i < n; i++){
		if(!vis[i]) dfs_dp1(i);
	}
	
	fill(vis, vis + n, 0);
	for(int i = 0; i < n; i++){
		if(!vis[i]) dfs_dp2(i);
	}
}

struct DSU{
	int dsu[N_MAX], l[N_MAX], r[N_MAX];
	void init(int n){
		for(int i = 0; i < n; i++){
			dsu[i] = l[i] = r[i] = i;
		}
	}
	int root(int x){
		return x == dsu[x] ? x : dsu[x] = root(dsu[x]);
	}
	void join(int x, int y){
		x = root(x), y = root(y);
		if(x > y) swap(x, y);
		if(x != y) {
			dsu[x] = y;
			l[y] = x;
			r[y] = y;
		}
	}
	void join_range(int l, int r){
		l = root(l), r = root(r);
		while(l < r){
			join(l, l + 1);
			l = root(l);
		}
	}
} dsu;

int dp_calc(){
	vector<int> v;
	for(int i = 0; i < n; i++){
		if(dsu.root(i) == i){
			v.push_back(i);
		}
	}
	return ans;
}

void rdfs(int id, int u, int pa = -1){
	vis[u] = true; scc[id].push_back(u);
	for(auto v : Gi[u]){
		if(!vis[v]){
			rdfs(id, v, u);
		}
	}
}

vector<Edge> E;
void rebuild(){
	for(int i = 0; i < n; i++){
		G[i].clear(); Gi[i].clear();
	}
	for(int i = 0; i < m; i++){
		int u = dsu.root(E[i].u), v = dsu.root(E[i].v);
		if(u == v) continue;
		G[u].push_back(v); Gi[v].push_back(u);
	}
}

int32_t main(){
	cin >> n >> m; dsu.init(n);
	for(int i = 0; i < m; i++){
		int a, b; cin >> a >> b; a--; b--;
		G[a].push_back(b); 
		Gi[b].push_back(a);
		E.push_back({a, b});
	}
	for(int i = 0; i < n; i++){
		if(!vis[i]) dfs(i);
	}
	fill(vis, vis + n, 0); int sid = 0;
	for(int i = n - 1; i >= 0; i--){
		if(!vis[tp[i]]) rdfs(sid++, tp[i]);
	}
	for(int i = 0; i < sid; i++){
		for(int j = 0; j < (int) scc[i].size() - 1; j++){
			dsu.join_range(scc[i][j], scc[i][j + 1]);
		}
	}

	rebuild();
	dp_combine();
	for(int i = 0; i < n; i++){
		dsu.join_range(i, min(imax[i], omax[i]));
	}
	rebuild();
	int ans = dp_calc();
	cout << ans << endl;
	/*
	for(int i = 0; i < n; i++){
		cout << omin[i] << ' ';
	}
	cout << endl;
	for(int i = 0; i < n; i++){
		cout << omax[i] << ' ';
	}
	cout << endl;
	for(int i = 0; i < n; i++){
		cout << imin[i] << ' ';
	}
	cout << endl;
	for(int i = 0; i < n; i++){
		cout << imax[i] << ' ';
	}
	cout << endl;
	*/
	for(int i = 0; i < n; i++){
		cout << dsu.root(i) << ' ';
	}
	cout << endl;
	for(int i = 0; i < n; i++){
		cout << "G[" << i << "] => ";
		for(auto j : G[i]){
			cout << j << ' ';
		}
		cout << endl;
	} 
}

컴파일 시 표준 에러 (stderr) 메시지

misspelling.cpp: In function 'long long int dp_calc()':
misspelling.cpp:106:9: error: 'ans' was not declared in this scope; did you mean 'abs'?
  106 |  return ans;
      |         ^~~
      |         abs