Submission #1277689

#TimeUsernameProblemLanguageResultExecution timeMemory
1277689PieArmyCoin Collecting (JOI19_ho_t4)C++20
0 / 100
1 ms580 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;

struct Fen{
	int n;
	vector<int>tree;
	void init(int N){
		n=N;
		tree.resize(n+1,0);
	}
	void update(int tar,int x){
		while(tar<=n){
			tree[tar]+=x;
			tar+=(tar&-tar);
		}
	}
	int qu(int tar){
		int res=0;
		while(tar>0){
			res+=tree[tar];
			tar-=(tar&-tar);
		}
		return res;
	}
	int query(int left,int right){
		if(left>right)return 0;
		return qu(right)-qu(left-1);
	}
};

int n;
int arr[100023][2];
ll ans=0;
set<int>st;
Fen fen,fen2;

void ekle(int from,int tar,int k,int x){
	if(x==0)return;
	arr[tar][k]+=x;
	arr[from][k]-=x;
	ans+=x;
	if(k==0){
		fen2.update(tar,x);
		fen2.update(from,-x);
	}
	fen.update(tar,x);
	fen.update(from,-x);
}

void f(int left,int right){
	if(left==right){
		if(arr[left][0]!=1)ans++;
		return;
	}
	int mi=-1;
	if(arr[left][0]+arr[left][1]>=2)mi=left;
	else{
		int x=left;
		while(true){
			x=*st.upper_bound(x);
			if(x>right)break;
			if(fen.query(left,x)<2*(x-left+1)){
				st.erase(x);
				continue;
			}
			mi=x;
			break;
		}
	}
	//cout<<left<<" "<<mi<<" "<<right<<endl;
	if(mi==-1||mi==right){
		mi=right;
		int a=arr[mi][0],b=arr[mi][1];
		ekle(mi,mi-1,0,max(0,a-1-!b));
		ekle(mi,mi-1,1,max(0,b-1-!a));
		/*for(int j=0;j<2;j++){
			for(int i=1;i<=n;i++){
				cout<<arr[i][j]<<" ";
			}
			cout<<endl;
		}
		cout<<endl;*/
		f(mi,mi);
		f(left,mi-1);
		return;
	}
	int s=fen.query(left,right),a=fen.query(left,mi),b=s-a;
	int ust=fen2.query(left,mi),alt=a-ust;
	int need=a-2*(mi-left+1);
	assert(need>=0);
	//cout<<need<<endl;
	if(need<=min(arr[mi][0],ust-alt)){
		ekle(mi,mi+1,0,need);
	}
	else if(need<=min(arr[mi][1],alt-ust)){
		ekle(mi,mi+1,1,need);
	}
	else{
		if(ust>alt){
			int x=min(arr[mi][0],ust-alt);
			ekle(mi,mi+1,0,x);
			need-=x;
			ust-=x;
		}
		else{
			int x=min(arr[mi][1],alt-ust);
			ekle(mi,mi+1,1,x);
			need-=x;
			alt-=x;
		}
		int x=min(min(arr[mi][0],arr[mi][1]),need/2);
		ekle(mi,mi+1,0,x);
		ekle(mi,mi+1,1,x);
		need-=x*2;
		if(need){
			if(arr[mi][0]){
				ekle(mi,mi+1,0,need);
			}
			else{
				ekle(mi,mi+1,1,need);
			}
		}
	}
	/*for(int j=0;j<2;j++){
		for(int i=1;i<=n;i++){
			cout<<arr[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;*/
	f(left,mi);
	f(mi+1,right);
}

int main(){
	ios_base::sync_with_stdio(23^23);cin.tie(NULL);
	cin>>n;
	fen.init(n);
	fen2.init(n);
	for(int i=1;i<=2*n;i++){
		pair<int,int>p;cin>>p.fr>>p.sc;
		if(p.fr<1){
			ans+=1-p.fr;
			p.fr=1;
		}
		if(p.fr>n){
			ans+=p.fr-n;
			p.fr=n;
		}
		if(p.sc<1){
			ans+=1-p.sc;
			p.sc=1;
		}
		if(p.sc>2){
			ans+=p.sc-2;
			p.sc=2;
		}
		arr[p.fr][p.sc-1]++;
		fen.update(p.fr,1);
		if(p.sc-1==0){
			fen2.update(p.fr,1);
		}
	}
	int sum=0;
	st.insert(n+1);
	for(int i=1;i<=n;i++){
		sum+=arr[i][0]+arr[i][1];
		if(sum>=2*i)st.insert(i);
	}
	/*cout<<ans<<endl;
	for(int j=0;j<2;j++){
		for(int i=1;i<=n;i++){
			cout<<arr[i][j]<<" ";
		}
		cout<<endl;
	}*/
	f(1,n);
	cout<<ans<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...