Submission #1224867

#TimeUsernameProblemLanguageResultExecution timeMemory
1224867_rain_Arranging Tickets (JOI17_arranging_tickets)C++20
100 / 100
507 ms11712 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=(int)2e5;
	LL f[N+2]={};
	vector<pair<int,int>>upd[N+2];
	int t,n,m;
	
	bool judge(LL x,LL lim){
		if (lim<0) return false;
		vector<LL>add(n+2,0);
		priority_queue<pair<int,int>,vector<pair<int,int>>,less<pair<int,int>>>pq;
		LL cur_add=0;
		for(int i=1;i<=t;++i){
			LL need=(f[i]+x-lim+1)/2;
			for(auto&xx:upd[i]) if (xx.first>t) pq.push(xx);
			while (cur_add<need){
				if (pq.empty()) return false;
				int y=pq.top().second;
				int xx=pq.top().first;
				pq.pop();
				if (cur_add+y<=need) cur_add+=y,add[xx]+=y;
				else {
					int add_more=need-cur_add;
					y-=add_more;
					add[xx]+=add_more,cur_add+=add_more;
					pq.push({xx,y});
				}
			}
		}
		for(int i=t+1;i<=n;++i){
			cur_add-=add[i];
			if (f[i]+x-cur_add*2>lim) return false;
		}
		return true;
	}
	
	bool possible(LL m){
		return judge(f[t]-m,m)||judge(f[t]-m+1,m);
	}
	

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0);
	#define task "main"
	if (fopen(task".inp","r")){
		freopen(task".inp","r",stdin);
		freopen(task".out","w",stdout);
	}
	cin>>n>>m;
	LL mx=0;
	for(int i=1;i<=m;++i){
		int a,b,c; cin>>a>>b>>c;
		if (a>b) swap(a,b);
		upd[a].push_back({b,c});
		f[a]+=c,f[b]-=c;
		mx=max(mx,(LL)c);
	}
	for(int i=1;i<=n;++i) f[i]+=f[i-1];
	t=0;
	for(int i=1;i<=n;++i) if (f[i]>f[t]) t=i;
	LL low=0,high=mx*m,ans=-1;
	assert(t!=-1);
	while (low<=high){
		LL mid=(low+high)/2;
		bool exist=possible(mid);
		if (exist){
			ans=mid;
			high=mid-1;
		}
		else low=mid+1;
	}
	cout<<ans;
	return 0;
}

Compilation message (stderr)

arranging_tickets.cpp: In function 'int main()':
arranging_tickets.cpp:49:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |                 freopen(task".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
arranging_tickets.cpp:50:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |                 freopen(task".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...