Submission #370944

#TimeUsernameProblemLanguageResultExecution timeMemory
370944kshitij_sodaniSnowball (JOI21_ho_t2)C++14
100 / 100
1746 ms8804 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'
llo it[200001];
llo mi[200001];
llo ma[200001];
llo n,q;
vector<llo> ss;
bool check(llo mid,llo i){
	if(mid==0){
		return false;
	}
	if(mi[q-1]>0){
		return false;
	}
	if(-mi[q-1]<mid){
		return false;
	}
	//return true;
	llo ind=q-1;
	for(llo j=19;j>=0;j--){
		if(ind-(1<<j)>=0){
			if(mi[ind-(1<<j)]<=0 and (-mi[ind-(1<<j)])>=mid){
				ind-=(1<<j);
			}
		}
	}
	if(i==0){
		return true;
	}
	if((mid)>it[i]-it[i-1]){
		return false;
	}
	//cout<<i<<":"<<mid<<endl;
	//return true;
	if(ind==0){
		return true;
	}
	if(ma[ind-1]+it[i-1]<=it[i]-mid){
		return true;
	}
	return false;

}
bool check2(llo mid,llo i){

	if(mid==0){
		return false;
	}
	if(ma[q-1]<0){
		return false;
	}
	if(ma[q-1]<mid){
		return false;
	}

	//return true;
	llo ind=q-1;
	for(llo j=19;j>=0;j--){
		if(ind-(1<<j)>=0){
			if((ma[ind-(1<<j)])>=mid){
				ind-=(1<<j);
			}
		}
	}
/*	if(i==0){
		cout<<mid<<"::"<<ind<<endl;
	}*/
	/*if(mid==5 and i==0){
		cout<<11<<"::"<<endl;
	}*/
	if(i==n-1){
		return true;
	}
	if((mid)>it[i+1]-it[i]){
		return false;
	}
	//cout<<i<<":"<<mid<<endl;
	//return true;
	if(ind==0){
		return true;
	}

	if(mi[ind-1]+it[i+1]>=it[i]+mid){
		return true;
	}
	return false;

}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin>>n>>q;
	for(llo i=0;i<n;i++){
		cin>>it[i];
	}
	/*llo q;
	cin>>q;*/
	llo su=0;
	for(llo i=0;i<q;i++){
		llo aa;
		cin>>aa;
		su+=aa;
		ss.pb(su);
	}
	mi[0]=ss[0];
	ma[0]=ss[0];
	for(llo i=1;i<ss.size();i++){
		mi[i]=min(mi[i-1],ss[i]);
		ma[i]=max(ma[i-1],ss[i]);
	}
/*	for(llo i=0;i<q;i++){
		cout<<mi[i]<<":";
	}
	cout<<endl;*/
	for(llo i=0;i<n;i++){
		llo low=0;
		llo high=1e18;
		while(low<high-1){
			llo mid=(low+high)/2;
			if(check(mid,i)){
				low=mid;
			}
			else{
				high=mid;
			}
		}
		llo ind=low;
		if(check(high,i)){
			ind=max(ind,high);
		}
		//cout<<ind<<":"<<endl;
		low=0;
		high=1e18;
		while(low<high-1){
			llo mid=(low+high)/2;
			if(check2(mid,i)){
				low=mid;
			}
			else{
				high=mid;
			}
		}
		llo ind2=low;
		if(check2(high,i)){
			ind2=max(ind2,high);
		}
		cout<<ind+ind2<<endl;
	}







 
	return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:115:15: 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]
  115 |  for(llo i=1;i<ss.size();i++){
      |              ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...