Submission #939347

# Submission time Handle Problem Language Result Execution time Memory
939347 2024-03-06T09:38:37 Z WanWan Closing Time (IOI23_closing) C++17
Compilation error
0 ms 0 KB
#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
void debug_out() {cerr<<endl;}
template <typename Head, typename... Tail>
void debug_out(Head _H, Tail... _T) {cerr<<" "<<to_string(_H);debug_out(_T...);}
#define debug(...) cerr<<"["<<#__VA_ARGS__<<"]:",debug_out(__VA_ARGS__)
#else
#define debug(...)
#endif
#define int long long
const int MAXN = 3005;
const int inf=1000000500ll;
const long long oo =1000000000000000500ll;
const int MOD = (int)1e9+7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef pair<int,int> pi; 
vector<pi>adj[MAXN];

int par[MAXN];
int dep[MAXN];

void dfs(int x, int p){
   	par[x]=p;
   	for(auto v:adj[x])if(v.first!=p){
   		dep[v.first]=dep[x]+1;
   		dfs(v.first,x);
   	}
}
int dd[2][MAXN];
void bfs(int src, int xx){
	queue<int> qu;
	memset(dd[xx],-1,sizeof dd[xx]);
	dd[xx][src]=0;
	qu.push(src);
	while(qu.size()){
		int c=qu.front();
		qu.pop();

		for(auto v:adj[c]){
			if(dd[xx][v.first] == -1 || dd[xx][v.first] > dd[xx][c]+v.second){
				dd[xx][v.first]=dd[xx][c]+v.second;
				qu.push(v.first);
			}
		}
	}
}
map<int,int>cst;
int mnsum[MAXN],mxsum[MAXN];
int32_t max_score(int32_t n, int32_t X, int32_t Y, long long K,
              std::vector<int32_t> U, std::vector<int32_t> V, std::vector<int32_t> W)
{
	for(int i=0;i<n;i++){
		adj[i].clear();
	}
    for(int i=0;i<n-1;i++){
        adj[U[i]].push_back({V[i],W[i]});
        adj[V[i]].push_back({U[i],W[i]});
    }
   	dfs(1,-1);
   	vector<int> v1,v2;
   	int x=X,y=Y;
   	while(x!=y){
   		if(dep[x]>dep[y]){
   			v1.push_back(x);
   			x=par[x];
   		} else{
   			v2.push_back(y);
   			y=par[y];
   		}
   	}

   	unordered_set<int> path;
   	reverse(v2.begin(),v2.end());
   	vector<int> vec;
   	for(auto e:v1)vec.push_back(e);
   	vec.push_back(x);
   	for(auto e:v2)vec.push_back(e);
   	for(auto e:vec)path.insert(e);
	int ans=2;
   	// 1. calc if there's 0 intersection--just greedily choose the cheapest node
	bfs(X,0);
	bfs(Y,1);

	{
		vector<int> vs;
		for(int i=0;i<n;i++)vs.push_back(dd[0][i]);
		for(int i=0;i<n;i++)vs.push_back(dd[1][i]);
		sort(vs.begin(),vs.end());
		int cst=0;
		int cc=0;
		for(auto x:vs){
			cst+=x;
			++cc;
			if(cst<=K){
				ans=max(ans,cc);
			} else{
				break;
			}
		}
	}
	priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>> one; //{cost,index,min/max}
   	priority_queue<pi,vector<pi>,greater<pi>> both;
   	// 2. if there's at least 1 intersection, it'll happen on the path
   
   	for(int k=0;k<n;k++){
   	if(path.find(k) != path.end()){		
   		} else{
   			both.push({max(dd[0][k],dd[1][k]),k});
			one.push({min(dd[0][k],dd[1][k]),k,0});
   		}
   	}
   			
   	set<pi>doneone;
   	set<int>doneboth;
   	int cost=0;
   	int cnt=0;

   	while(true){
   		
   		// try taking 1 only
   		//cst[cost]=cnt;
   		while(one.size() && doneone.find({one.top()[1],one.top()[2]}) != doneone.end())one.pop();
   		if(one.size()){
   			cst[cnt+1]=cost+one.top()[0];
   			cst[cnt+1]=min(cst[cnt+1],oo);
   			//if(cost+one.top()[0]<=K)ans=max(ans,cnt+1);
   		}

   		int c1=oo,c2=oo;

   		if(one.size()){

   			c1=0;
			array<int,3> cur=one.top();
			c1+=cur[0];

   			one.pop();
   			while(one.size() && doneone.find({one.top()[1],one.top()[2]}) != doneone.end())one.pop();
   			if(one.size())c1+=one.top()[0];
   			else c1=oo;
   			one.push(cur);
   		}
   		while(both.size() && doneboth.find(both.top().second) != doneboth.end())both.pop();
   		if(both.size()){
   			c2=both.top().first;
   		}
   		if(c2==oo && c1==oo)break;

   		if(c2<c1){ // we should take the smaller one of the both
   			assert(both.size());
   			pi cur=both.top();
   			cnt++;
   			cost += min(dd[0][cur.second],dd[1][cur.second]);
   			one.push({abs(dd[0][cur.second]-dd[1][cur.second]),cur.second,1});
   			doneone.insert({cur.second,0});
   			both.pop();
   		} else{

   			array<int,3>cur=one.top();
   			one.pop();
   			cnt++;
   			cost+=cur[0];
   			if(cur[2] == 0){ // push max
   				one.push({max(dd[0][cur[1]],dd[1][cur[1]])-cur[0],cur[1],1});
   				doneboth.insert(cur[1]);
   			}
   		}
   		if(cst.find(cnt) == cst.end())cst[cnt]=cost;
   		else cst[cnt]=min(cst[cnt],cost);
   		cst[cnt]=min(cst[cnt],oo);
   	}
   	
   	for(int i=0;i<vec.size();i++){
   		mnsum[i]=mnsum[i-1]+min(dd[1][vec[k]],dd[0][vec[k]]);
   		mxsum[i]=mxsum[i-1]+max(dd[0][vec[k]],dd[1][vec[k]]);
   	}
   	for(int i=0;i<vec.size();i++){

   		for(int j=i;j<vec.size();j++){

   			int cost = 0;
   			int cnt=0;	
   			int cnt=vec.size()+(j-i+1);
   			int cost=mnsum[i-1];
   			cost += mxsum[j];
   			cost -= mxsum[i];
   			cost += mnsum[vec.size()-1];
   			cost -= mnsum[j];
   			/*
   			for(int k=0;k<vec.size();k++){
   				if(k<i){
   					cost+=min(dd[1][vec[k]],dd[0][vec[k]]);
   					++cnt;
   				}
   				else if(k<=j){
   					cost+=max(dd[0][vec[k]],dd[1][vec[k]]);
   					cnt+=2;
   				}
   				else {
   					cost+=min(dd[1][vec[k]],dd[0][vec[k]]);
   					++cnt;
   				}
   			}*/

   			if(cost>K)continue;
   			ans=max(ans,cnt);
   			for(auto x:cst){
   				if(cost+x.second<=K){
   					ans=max(ans,cnt+x.first);
   				}
   			}
   		}
   			


   	}
   	cst.clear();
   	return ans;
}

Compilation message

closing.cpp: In function 'int32_t max_score(int32_t, int32_t, int32_t, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:175:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  175 |     for(int i=0;i<vec.size();i++){
      |                 ~^~~~~~~~~~~
closing.cpp:176:40: error: 'k' was not declared in this scope
  176 |      mnsum[i]=mnsum[i-1]+min(dd[1][vec[k]],dd[0][vec[k]]);
      |                                        ^
closing.cpp:179:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  179 |     for(int i=0;i<vec.size();i++){
      |                 ~^~~~~~~~~~~
closing.cpp:181:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  181 |      for(int j=i;j<vec.size();j++){
      |                  ~^~~~~~~~~~~
closing.cpp:185:11: error: redeclaration of 'long long int cnt'
  185 |       int cnt=vec.size()+(j-i+1);
      |           ^~~
closing.cpp:184:11: note: 'long long int cnt' previously declared here
  184 |       int cnt=0;
      |           ^~~
closing.cpp:186:11: error: redeclaration of 'long long int cost'
  186 |       int cost=mnsum[i-1];
      |           ^~~~
closing.cpp:183:11: note: 'long long int cost' previously declared here
  183 |       int cost = 0;
      |           ^~~~