Submission #543504

# Submission time Handle Problem Language Result Execution time Memory
543504 2022-03-30T19:12:07 Z new_acc Road Closures (APIO21_roads) C++14
0 / 100
165 ms 26044 KB
#include<bits/stdc++.h>
#define fi first
#define se second
#define pitem item*
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
const int N=1e5+10;
const ll INF=1e14;
struct item{
	item *l,*r;
	int val,il,pod,prior;
	ll sum;
};
pitem tr[N];
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int oj[N],fau[N],kk[N],dep[N],syn[N],kr[N];
ll dp[N][2];
vector<pair<int,int> >graf[N];
vector<pair<int,int> >graf2[N];
vi aa[N];
bitset<N>bb,vis;
int Find(int a){
	if(fau[a]==a) return a;
	return fau[a]=Find(fau[a]);
}
void Union(int a,int b){
	a=Find(a),b=Find(b);
	if(dep[kk[a]]<dep[kk[b]]) swap(a,b);
	fau[a]=b;
}
void comb(pitem v){
	v->sum=(v->l!=nullptr?v->l->sum:0)+(v->r!=nullptr?v->r->sum:0)+(ll)(v->val)*(ll)(v->il);
	v->pod=(v->l!=nullptr?v->l->pod:0)+(v->r!=nullptr?v->r->pod:0)+(v->il);
} 
pair<pitem,pitem> split(pitem v,int x){
	if(!v) return {nullptr,nullptr};
	if((v->val)<=x){
		pair<pitem,pitem>curr=split(v->r,x);
		v->r=curr.fi;
		comb(v);
		return {v,curr.se};
	}else{
		pair<pitem,pitem>curr=split(v->l,x);
		v->l=curr.se;
		comb(v);
		return {curr.fi,v};
	}
}
pitem merge(pitem v1,pitem v2){
	if(!v1 or !v2) return (!v1?v2:v1);
	if((v1->prior)>(v2->prior)){
		v1->r=merge(v1->r,v2);
		comb(v1);
		return v1;
	}else{
		v2->l=merge(v1,v2->l);
		comb(v2);
		return v2;
	}
}
pitem add(pitem v,int x){
	pair<pitem,pitem>curr1=split(v,x);
	pair<pitem,pitem>curr2=split(curr1.fi,x-1);
	if(!curr2.se){
		curr2.se=new item;
		curr2.se->val=x,curr2.se->pod=0,curr2.se->prior=uniform_int_distribution<int>(1,1000*1000*1000)(rng);
		curr2.se->sum=0,curr2.se->il=0,curr2.se->l=nullptr,curr2.se->r=nullptr;
	}
	curr2.se->pod++,curr2.se->il++,curr2.se->sum+=x;
	curr1.fi=merge(curr2.fi,curr2.se);
	v=merge(curr1.fi,curr1.se);
	return v;
}
pitem del(pitem v,int x){
	pair<pitem,pitem>curr1=split(v,x);
	pair<pitem,pitem>curr2=split(curr1.fi,x-1);
	if(curr2.se!=nullptr){
		curr2.se->il--;
		curr2.se->pod--,curr2.se->sum-=x,curr2.se;
	}
	if(!curr2.se or curr2.se->il==0){
		v=merge(curr2.fi,curr1.se);
		return v;
	}
	curr1.fi=merge(curr2.fi,curr2.se);
	v=merge(curr1.fi,curr1.se);
	return v;
}
ll sum(pitem v,int x){
	if(!v or x==0) return 0;
	ll suml=(v->sum)-(!(v->r)?0:v->r->sum);
	int pp=(v->pod)-(!(v->r)?0:v->r->pod);
	if(pp<=x) return sum(v->r,x-pp)+suml;
	else{
		int wz=max(0,x-(!(v->l)?0:v->l->pod));
		return sum(v->l,x-wz)+(ll)(v->val)*(ll)wz;
	}
}
void dfsi(int v,int o){
	oj[v]=o;
	dep[v]=dep[o]+1;
	for(auto [u,c]:graf[v]){
		if(u==o) continue;
		tr[v]=add(tr[v],c);
		kr[u]=c;
		dfsi(u,v);
	}
}
ll ob(vl pom,int v,int usu){
	ll res=0,res2=INF;
	int g=0;
	for(int i=0;i<pom.size();i++){
		if(pom[i]>0) break;
		res+=pom[i],usu--;
		g++;
	}
	if(usu>0){
		if((!tr[v]?0:(tr[v]->pod))>=usu) res2=sum(tr[v],usu);
		ll curr=0;
		for(int i=g;i<pom.size();i++){
			curr+=pom[i];
			usu--;
			usu=max(0,usu);
			if((!tr[v]?0:(tr[v]->pod))>=usu) res2=min(res2,curr+sum(tr[v],usu));
		}
		return res+res2;

	}else return res;
}
void dfs(int v,int o,int x){
	vl pom;
	ll res=0;
	for(auto [u,c]:graf2[v]){
		if(o==u) continue;
		syn[v]++;
		dfs(u,v,x);
		pom.push_back(dp[u][1]-dp[u][0]);
		res+=dp[u][0];
	}
	sort(pom.begin(),pom.end());
	dp[v][0]=ob(pom,v,graf[v].size()-x)+res;
	dp[v][1]=ob(pom,v,graf[v].size()-(x+1))+res+kr[v];
	dp[v][0]=min(dp[v][0],INF),dp[v][1]=min(dp[v][1],INF);
}
vl minimum_closure_costs(int n,vi u,vi v,vi w){
	ll xd=0;
	for(int i=0;i<n-1;i++){
		u[i]++,v[i]++;
		graf[u[i]].push_back({v[i],w[i]}),graf[v[i]].push_back({u[i],w[i]});
	}
	for(int i=1;i<=n;i++) fau[i]=i,kk[i]=i;
	dfsi(1,1);
	kr[1]=1e9;
	for(int i=1;i<=n;i++) aa[graf[i].size()].push_back(i);
	vl res(n);
	vi k;
	for(int i=3;i>=0;i--){
		for(auto v:aa[i]){
			for(auto [u,c]:graf[v]){
				if(bb[u]){
				 	Union(v,u);
				 	graf2[u].push_back({v,c}),graf2[v].push_back({u,c});
				 	if(oj[v]!=u) tr[v]=del(tr[v],c);
				 	if(oj[u]!=v) tr[u]=del(tr[u],c);
				 }
			}
			k.push_back(v);
			bb[v]=1;
		}
		ll ans=0;
		for(auto u:k){
			if(vis[Find(u)]) continue;
			vis[Find(u)]=1;
			dfs(kk[Find(u)],kk[Find(u)],i);
			ans+=min(dp[kk[Find(u)]][0],dp[kk[Find(u)]][1]);
		}
		for(auto u:k) vis[Find(u)]=0;
		res[i]=ans;
	}
	return res;
}

Compilation message

roads.cpp: In function 'item* del(item*, int)':
roads.cpp:3:12: warning: right operand of comma operator has no effect [-Wunused-value]
    3 | #define se second
      |            ^
roads.cpp:81:42: note: in expansion of macro 'se'
   81 |   curr2.se->pod--,curr2.se->sum-=x,curr2.se;
      |                                          ^~
roads.cpp: In function 'void dfsi(int, int)':
roads.cpp:104:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  104 |  for(auto [u,c]:graf[v]){
      |           ^
roads.cpp: In function 'll ob(vl, int, int)':
roads.cpp:114:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |  for(int i=0;i<pom.size();i++){
      |              ~^~~~~~~~~~~
roads.cpp:122:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |   for(int i=g;i<pom.size();i++){
      |               ~^~~~~~~~~~~
roads.cpp: In function 'void dfs(int, int, int)':
roads.cpp:135:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  135 |  for(auto [u,c]:graf2[v]){
      |           ^
roads.cpp: In function 'vl minimum_closure_costs(int, vi, vi, vi)':
roads.cpp:161:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  161 |    for(auto [u,c]:graf[v]){
      |             ^
roads.cpp:148:5: warning: unused variable 'xd' [-Wunused-variable]
  148 |  ll xd=0;
      |     ^~
# Verdict Execution time Memory Grader output
1 Runtime error 10 ms 14804 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 11 ms 14796 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 9 ms 14804 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 9 ms 14804 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 165 ms 26044 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 165 ms 26044 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 10 ms 14804 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -