제출 #412596

#제출 시각아이디문제언어결과실행 시간메모리
412596kshitij_sodaniRoad Closures (APIO21_roads)C++14
100 / 100
646 ms98744 KiB
//#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define mp make_pair
#define pb push_back
#define a first 
#define b second
#define endl '\n'

#include "roads.h"

#include <vector>
vector<pair<llo,llo>> adj[100001];
vector<pair<llo,llo>> adj2[100001];

#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;



#define ord tree<llo,null_type,less<llo>,rb_tree_tag,tree_order_statistics_node_update>

llo val[100001];
llo dp[100001][2];
vector<llo> tt[100001];
llo kk=-1;
llo vis[100001];

vector<llo> xx;
map<pair<llo,llo>,llo> ind;
vector<llo> tree2[100001];
vector<pair<pair<llo,llo>,llo>> pre[100001];
vector<llo> pre2[100001];
ord pre3[100001];
void update(llo zz,llo no,llo l,llo r,llo i,llo j){
	if(l==r){
		tree2[zz][no]=j;
	}
	else{
		llo mid=(l+r)/2;
		if(i<=mid){
			update(zz,no*2+1,l,mid,i,j);
		}
		else{
			update(zz,no*2+2,mid+1,r,i,j);
		}
		tree2[zz][no]=tree2[zz][no*2+1]+tree2[zz][no*2+2];
	}
}
llo query(llo zz,llo no,llo l,llo r,llo aa,llo bb){
	if(r<aa or l>bb){
		return 0;
	}
	if(aa<=l and r<=bb){
		return tree2[zz][no];
	}
	else{
		llo mid=(l+r)/2;
		return query(zz,no*2+1,l,mid,aa,bb)+query(zz,no*2+2,mid+1,r,aa,bb);
	}
}
void dfs(llo no,llo par2=-1,llo ba=-1){
	vector<llo> ss;
	llo su=0;
	vis[no]=1;
	vector<pair<llo,llo>> ne;
	vector<llo> tt;
	for(auto j:adj2[no]){
		if(j.a!=par2){
			if(adj[j.a].size()<kk){
			//	ne.pb(j);
			//	tt.pb(j.b);
				continue;
			}
			ne.pb(j);
			dfs(j.a,no,j.b);
			su+=dp[j.a][0];//not removed
			ss.pb(dp[j.a][1]-dp[j.a][0]);
			//ss.pb(j.a);
		}
		else{
			ne.pb(j);
		}
	}
	adj2[no]=ne;
	//cout<<no<<"::"<<ss.size()<<endl;
	/*for(auto j:tt[no]){
		ss.pb(j);
	}*/
	sort(ss.begin(),ss.end());
	//sort(tt.begin(),tt.end());
	dp[no][0]=1e14;
	dp[no][1]=1e14;
	for(llo i=0;i<2;i++){
		if(i==1 and par2==-1){
			continue;
		}
		llo nee=0;
		//cout<<11<<endl;
		for(llo ii=0;ii<=ss.size();ii++){
			if(ii>0){
				nee+=ss[ii-1];
			}
			llo ka=0;
			llo le=ss.size()+pre3[no].size();
			if(par2>=0 and i==0){
				le++;
			}
			/*if(kk>1){
				cout<<le<<"///"<<endl;
			}
*/
			le-=kk;
			le-=ii;
			/*if(le>0){
				continue;
			}*/
			/*if(kk>1){
				cout<<le<<"///"<<endl;
			}
			if(kk>1){
					cout<<endl;
					cout<<no<<":"<<le<<":"<<pre3[no].size()<<endl;
					for(auto j:pre3[no]){
						cout<<j<<"...";
					}
					cout<<endl;
					//cout<<ka<<"!"<<endl;
					//cout<<ind5<<".."<<endl;
			}*/

			if(le>(llo)pre3[no].size()){
				//dp[no][i]=ba+su;
				continue;
			}

			ka=su+nee;

		/*	for(llo j=0;j<le;j++){
				ka+=ss[j];
			}*/
			if(le>0){
				/*for(int j=0;j<le;j++){
					ka+=tt[j];
				}*/
				llo ind5=*pre3[no].find_by_order(le-1);
				ka+=query(no,0,0,adj[no].size()-1,0,ind5);
				/*for(int j=0;j<=ind5;j++){
					ka+=query(no,0,0,adj[no].size()-1,j,j);
				}*/
				//ka+=query(no,0,0,adj[no].size()-1,0,ind5);
				/*if(kk>1 ){
					cout<<111<<":"<<ind5<<endl;
					cout<<query(no,0,0,adj[no].size()-1,0,ind5)<<endl;
				}*/
				
			}

			
			if(i==1){
				ka+=ba;
			}
			//cout<<pre3[no].size()<<"..."<<endl;
			/*if(kk==1 and no==0){
				cout<<no<<":"<<i<<","<<ii<<":"<<ka<<endl;
				
			}*/
			dp[no][i]=min(dp[no][i],ka);
		}

	}
	dp[no][0]=min(dp[no][0],dp[no][1]);

	/*if(kk==1){
		cout<<no<<":"<<dp[no][0]<<":"<<dp[no][1]<<endl;
	}*/

}

vector<llo> minimum_closure_costs(int n,vector<int> aa,
                                             vector<int> bb,
                                             vector<int> cc) {

	vector<llo> ans;
	vector<llo> dd;
	for(llo i=0;i<n-1;i++){
		adj[aa[i]].pb({bb[i],cc[i]});
		adj[bb[i]].pb({aa[i],cc[i]});
		adj2[aa[i]].pb({bb[i],cc[i]});
		adj2[bb[i]].pb({aa[i],cc[i]});
		dd.pb(cc[i]);
	}
	//dfs(0);
	llo cot=0;
	for(llo i=0;i<n;i++){
		vector<pair<llo,llo>> dd;
		for(auto j:adj[i]){
			dd.pb({j.b,j.a});
		}
		sort(dd.begin(),dd.end());
		llo yy=-1;
		for(auto j:dd){
			yy++;
			ind[{i,j.b}]=yy;
			xx.pb(j.a);
		}
		for(llo j=0;j<4*adj[i].size();j++){
			tree2[i].pb(0);
		}
		//build(0,0,adj[i].size()-1,)
	}

	for(llo i=0;i<n-1;i++){
		cot+=cc[i];
	}
	for(llo i=0;i<n-1;i++){
		llo x=aa[i];
		llo y=bb[i];
		if(adj[x].size()>adj[y].size()){
			swap(x,y);
		}
		//pre[adj[x].size()].pb({{x,y},cc[i]});
		if(adj[x].size()<adj[y].size()){
			pre[adj[x].size()+1].pb({{y,cc[i]},ind[{y,x}]});
		}
		else{

		}

	}
	for(llo i=0;i<n;i++){
		pre2[adj[i].size()+1].pb(i);
	}
	set<llo> cur;
	for(llo i=0;i<n;i++){
		cur.insert(i);
	}
	ans.pb(cot);
	for(llo i=1;i<=n-1;i++){
		for(auto j:pre2[i]){
			cur.erase(j);

		}
		kk=i;
		for(auto j:cur){
			vis[j]=0;
		}

		for(auto j:pre[i]){
			update(j.a.a,0,0,adj[j.a.a].size()-1,j.b,j.a.b);
			pre3[j.a.a].insert(j.b);
		}
		llo ans2=0;
		for(auto j:cur){
			if(vis[j]==0){
				dfs(j);
				ans2+=dp[j][0];

			}
			//cout<<j<<",";
		}
	//cout<<endl;
		ans.pb(ans2);

	}
	//ans.pb(cot);

	/*for(llo i=0;i<n;i++){
		if(i==0){
			ans.pb(cot);
			continue;
		}

		kk=i;

		for(llo j=0;j<n;j++){
			adj2[j].clear();
			tt[j].clear();
			vis[j]=0;
		}
		for(llo j=0;j<n;j++){
			for(auto k:adj[j]){
				if(adj[j].size()>i){
					if(adj[k.a].size()>i){
						adj2[j].pb(k);
					}
					else{
						tt[j].pb(k.b);
					}
				}
			}
		}
		llo ans2=0;
		for(llo j=0;j<n;j++){
			if(adj[j].size()>i){
				if(vis[j]==0){
					dfs(j);
					ans2+=dp[j][0];
				}
			}
		}
		//dfs(0);
		
		ans.pb(ans2);
	}*/


	return ans;
}

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

roads.cpp: In function 'void dfs(llo, llo, llo)':
roads.cpp:72:22: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'llo' {aka 'long long int'} [-Wsign-compare]
   72 |    if(adj[j.a].size()<kk){
      |       ~~~~~~~~~~~~~~~^~~
roads.cpp:102:18: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |   for(llo ii=0;ii<=ss.size();ii++){
      |                ~~^~~~~~~~~~~
roads.cpp: In function 'std::vector<long long int> minimum_closure_costs(int, std::vector<int>, std::vector<int>, std::vector<int>)':
roads.cpp:209:16: warning: comparison of integer expressions of different signedness: 'llo' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  209 |   for(llo j=0;j<4*adj[i].size();j++){
      |               ~^~~~~~~~~~~~~~~~
#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...