Submission #1346561

#TimeUsernameProblemLanguageResultExecution timeMemory
1346561ByeWorldPPP (EGOI23_ppp)C++20
100 / 100
280 ms95760 KiB
#include <bits/stdc++.h>
// #pragma GCC optimize("O3", "unroll-loops")
#define ll long long
#define int long long
#define pb push_back
#define fi first
#define se second
#define lf ((id<<1))
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
#define ld long double
using namespace std;
typedef pair<ll,ll> pii;
typedef pair<pii,ll> ipii;
const int MAXN = 3e5+10;
const int LOG = 20;
const int VAL = 2520;
const int MAXA = 1e6+10;
const int MOD = 1e9+7;
const ll INF = 1e9+10;
const ld EPS = 1e-12;
void chmn(auto &a, auto b){ a = min(a, b); }
void chmx(auto &a, auto b){ a = max(a, b); }
int sum(int a, int b){ a %= MOD; b += MOD; b %= MOD; return (a+MOD+b)%MOD; }
void chsum(int &a, int b){ a = sum(a, b); }
int mul(int a, int b){ a %= MOD; b %= MOD; return (a*b)%MOD; }
void chmul(int &a, int b){ a = mul(a, b); }
int expo(int a, int b){
	if(b==0) return 1;
	int te = expo(a, b/2); te = mul(te,te); // temporary -> te
	return (b%2 ? mul(te, a) : te);
}

int n, m, x[MAXN], y[MAXN], ans[MAXN];
vector<pii> upd[MAXN]; // di idx ini updaetnya apa

struct seg {
	pii st[4*MAXN];
	void bd(int id,int l,int r){
		if(l==r){
			st[id].se = -l; return; 
		}
		bd(lf,l,md); bd(rg,md+1,r);
		st[id] = max(st[lf], st[rg]);
	}
	pii que(int id,int l,int r,int x,int y){
		if(x<=l && r<=y) return st[id];
		if(r<x || y<l) return pii(-INF, -1);
		return max(que(lf,l,md,x,y), que(rg,md+1,r,x,y));
	}
	pii upd(int id,int l,int r,int x,int p){
		if(l==r && l==x){ st[id].fi += p; return st[id]; }
		if(r<x || x<l) return st[id];
		return st[id] = max(upd(lf,l,md,x,p), upd(rg,md+1,r,x,p));
	}
} A;

vector<int> vec[MAXN];
int l[MAXN], r[MAXN], gan[MAXN]; // reidxnya 
set<int> s[MAXN];

signed main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1; i<=n; i++){
		l[i] = -1; r[i] = -1;
		s[i].insert(m+1);
	}
	for(int i=1; i<=m; i++){
		cin>>x[i]>>y[i]; x[i]++; y[i]++; // y masukin ke x
		s[x[i]].insert(i); s[y[i]].insert(i);

		if(vec[x[i]].size() < vec[y[i]].size()) swap(vec[x[i]], vec[y[i]]);

		for(auto in : vec[y[i]]) vec[x[i]].pb(in);
		vec[x[i]].pb(i);

		vec[y[i]].clear();
	}

	int cnt = 0;
	for(int i=1; i<=n; i++){
		for(auto in : vec[i]){
			gan[in] = ++cnt; // in diganti jd cnt
			// cout << in << ' '<< cnt << " gan\n";
		}
	}

	for(int i=1; i<=m; i++){ // medal, turni, tambahin sm medali baru
		int le = i, ri = i; // winner ada ini
		if(l[x[i]]==-1 && l[y[i]]==-1){
			le = gan[i]; ri = gan[i];
		} else if(l[x[i]]==-1){
			le = l[y[i]]; ri = r[y[i]];
		} else if(l[y[i]]==-1){
			le = l[x[i]]; ri = r[x[i]];
		} else {
			le = min(l[x[i]], l[y[i]]); ri = max(r[x[i]], r[y[i]]);
		}

		chmn(le, gan[i]); chmx(ri, gan[i]);

		int tim = *s[x[i]].upper_bound(i)-i; // nanti dia ada lagi
		upd[le].pb({x[i], tim}); upd[ri+1].pb({x[i], -tim});
		
		l[x[i]] = le; r[x[i]] = ri;
		// cout << x[i] << ' '<<le<<' '<<ri<<" ler\n";
		l[y[i]] = r[y[i]] = -1;
	}
	A.bd(1,1,n);
	for(int i=1; i<=m; i++){
		for(auto [id, val] : upd[i]){
			A.upd(1,1,n,id,val);
		}
		int idx = -A.que(1,1,n,1,n).se;
		ans[idx]++;
	}
	for(int i=1; i<=n; i++) cout << ans[i] << " \n"[i==n];
}
#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...