제출 #1339461

#제출 시각아이디문제언어결과실행 시간메모리
1339461WH8PPP (EGOI23_ppp)C++17
38 / 100
3096 ms121260 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
#define mt make_tuple
#define mp make_pair
#define pb push_back
#define int long long 
#define f first
#define s second
#define pll pair<long long, long long>
#define iii tuple<int,int,int>
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int n,m;cin>>n>>m;
	vector<set<pll>> out(n), in(n);
	vector<bool> vis(m, 0);
	vector<pll> ed(m);
	vector<int> belong(m, -1);
	for(int i=0;i<m;i++){
		int x, y;cin>>x>>y;
		out[y].insert({i, x});
		in[x].insert({i, y});
		ed[i]={x, y};
	}
	/*for(int i=0;i<n;i++){
		sort(all(out[i]));
		sort(all(in[i]));
	}*/
	for(int i=m-1;i>=0;i--){
		if(vis[i])continue;
		map<int,int> freq;
		set<pair<int,int>> best; 
		vis[i]=1;
		auto dfs=[&](auto && dfs, int x, int pn, int pe1, int pe2)->void{
			/*printf("at node x %lld, pn %lld, pe1 %lld, pe2 %lld\n", 
					x, pn, pe1, pe2);*/
			assert(pn == ed[pe1].f);
			best.erase(mp(freq[pn], pn));
			freq[pn]+=pe2-pe1;
			best.insert(mp(freq[pn], pn));
			int most=(*prev(best.end())).f;
			belong[pe1]=(*best.lower_bound(mp(most, (int)-1))).s;
			auto it = in[x].lower_bound(mp(pe1, 1ll));
			while(it != in[x].begin()){
				it = prev(it);
				auto [et, to]=*it;
				assert(vis[et] == 0);
				auto chk=lower_bound(all(out[x]), mp(et, (int)-1));
				if(chk == out[x].end() or (*chk).f != pe1){
					break;
				}
				vis[et]=1;
				dfs(dfs, to, x, et, pe1);
				in[x].erase(it);
				it=in[x].lower_bound(mp(pe1, 1ll));
			}
			best.erase(mp(freq[pn], pn));
			freq[pn]-=pe2-pe1;
			best.insert(mp(freq[pn], pn));

		};
		dfs(dfs, ed[i].s, ed[i].f, i, m);
	}
	vector<int> ans(n, 0);
	for(int i=0;i<m;i++){
		assert(belong[i] != -1);
		ans[belong[i]]++;
	}
	for(int i=0;i<n;i++){
		cout<<ans[i]<<" ";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...