제출 #1101198

#제출 시각아이디문제언어결과실행 시간메모리
1101198PieArmy도로 폐쇄 (APIO21_roads)C++17
100 / 100
312 ms76508 KiB
typedef long long ll;
ll pie(ll army){return (1ll<<army);}
#include "roads.h"
#include <bits/stdc++.h>
#define fr first
#define sc second
#define pb push_back
#define endl '\n'
#define mid ((left+right)>>1)
const ll inf=200000000000000005;
const int sonsuz=2000000005;
using namespace std;
ll fpow(ll x,ll y,ll m=0){if(y<0){cout<<"powError";return -1;}if(m)x%=m;ll res=1;while(y>0){if(y&1)res*=x;x*=x;if(m){x%=m;res%=m;}y>>=1;}return res;}

struct Seg{
	int n;
	vector<ll>sum,arr;
	vector<int>cnt;
	void build(int node=1,int left=0,int right=-1){
		if(right==-1)right=n-1;
		if(left==right){
			sum[node]=arr[left];
			cnt[node]=!!arr[left];
			return;
		}
		build(node*2,left,mid);build(node*2+1,mid+1,right);
		sum[node]=sum[node*2]+sum[node*2+1];
		cnt[node]=cnt[node*2]+cnt[node*2+1];
	}
	void launch(){
		n=arr.size();
		sum.resize(n<<2);
		cnt.resize(n<<2);
		build();
	}
	int l,r;
	void up(int node=1,int left=0,int right=-1){
		if(right==-1)right=n-1;
		if(left==right){
			sum[node]=r;
			cnt[node]=!!r;
			return;
		}
		if(l>mid)up(node*2+1,mid+1,right);
		else up(node*2,left,mid);
		sum[node]=sum[node*2]+sum[node*2+1];
		cnt[node]=cnt[node*2]+cnt[node*2+1];
	}
	void update(int tar,int x){
		l=tar;r=x;
		up();
	}
	ll qu(int node=1,int left=0,int right=-1){
		if(right==-1)right=n-1;
		if(l==0)return 0;
		if(left==right){
			return sum[node];
		}
		if(cnt[node*2]>l)return qu(node*2,left,mid);
		l-=cnt[node*2];
		return sum[node*2]+qu(node*2+1,mid+1,right);
	}
	ll query(int x){
		l=x;
		if(l>cnt[1])return inf;
		return qu();
	}
};

int n;
int vis[100000];
ll dp[100000][2];
Seg seg[100000];
vector<pair<int,int>>adj[100000],act[100000];
map<int,int>ord[100000];
vector<int>deg[100000],awake;
vector<ll>ans;

void dfs(int pos,int par,int k){
	vis[pos]=k;
	ll sum=0;
	vector<ll>v;
	ll parcos=inf;
	for(pair<int,int>x:act[pos]){
		if(x.fr==par){
			parcos=x.sc;
			continue;
		}
		dfs(x.fr,pos,k);
		sum+=dp[x.fr][0];
		v.pb(dp[x.fr][1]-dp[x.fr][0]);
	}
	sort(v.begin(),v.end());
	dp[pos][1]=inf;
	dp[pos][0]=inf;
	dp[pos][1]=min(dp[pos][1],sum+seg[pos].query(max(0,int(adj[pos].size())-k-1))+parcos);
	dp[pos][0]=min(min(dp[pos][0],dp[pos][1]),sum+seg[pos].query(max(0,int(adj[pos].size())-k)));
	for(int i=0;i<v.size();i++){
		sum+=v[i];
		dp[pos][1]=min(dp[pos][1],sum+seg[pos].query(max(0,int(adj[pos].size())-i-k-2))+parcos);
		dp[pos][0]=min(min(dp[pos][0],dp[pos][1]),sum+seg[pos].query(max(0,int(adj[pos].size())-i-k-1)));
	}
}

void wake(int tar){
	awake.pb(tar);
	for(pair<int,int>x:adj[tar]){
		act[x.fr].pb({tar,x.sc});
		seg[x.fr].update(ord[x.fr][tar],0);
	}
}

vector<ll> minimum_closure_costs(int N,vector<int>U,vector<int>V,vector<int>W){
	n=N;
	ans.resize(n,0);
	for(int i=0;i<n-1;i++){
		adj[U[i]].pb({V[i],W[i]});
		adj[V[i]].pb({U[i],W[i]});
	}
	for(int i=0;i<n;i++){
		vis[i]=n;
		deg[adj[i].size()-1].pb(i);
		sort(adj[i].begin(),adj[i].end(),[&](const pair<int,int>&x,const pair<int,int>&y){return x.sc<y.sc;});
		for(int j=0;j<adj[i].size();j++){
			ord[i][adj[i][j].fr]=j;
			seg[i].arr.pb(adj[i][j].sc);
		}
		seg[i].launch();
	}
	for(int i=n-1;i>=0;i--){
		for(int x:deg[i]){
			wake(x);
		}
		for(int j:awake){
			if(vis[j]==i)continue;
			dfs(j,-1,i);
			ans[i]+=dp[j][0];
		}
	}
	return ans;
}

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

roads.cpp: In function 'void dfs(int, int, int)':
roads.cpp:98:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |  for(int i=0;i<v.size();i++){
      |              ~^~~~~~~~~
roads.cpp: In function 'std::vector<long long int> minimum_closure_costs(int, std::vector<int>, std::vector<int>, std::vector<int>)':
roads.cpp:124:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  124 |   for(int j=0;j<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...