Submission #1331034

#TimeUsernameProblemLanguageResultExecution timeMemory
1331034boclobanchatSails (IOI07_sails)C++20
100 / 100
423 ms5168 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
pair<int,int> A[MAXN];
long long seg[MAXN*4],lazy[MAXN*4];
void down(int pos,int l,int r)
{
	int val=lazy[pos],mid=(l+r)/2;
	seg[pos*2]+=val*(mid-l+1),seg[pos*2+1]+=val*(r-mid);
	lazy[pos*2]+=val,lazy[pos*2+1]+=val;
	lazy[pos]=0;
}
void update(int l,int r,int u,int v,int val,int pos)
{
	if(v<l||r<u) return ;
	if(u<=l&&r<=v)
	{
		seg[pos]+=val*(r-l+1),lazy[pos]+=val;
		return ;
	}
	int mid=(l+r)/2;
	down(pos,l,r);
	update(l,mid,u,v,val,pos*2);
	update(mid+1,r,u,v,val,pos*2+1);
	seg[pos]=seg[pos*2]+seg[pos*2+1];
}
long long get(int l,int r,int u,int v,int pos)
{
	if(u<=l&&r<=v) return seg[pos];
	int mid=(l+r)/2;
	down(pos,l,r);
	if(v<=mid) return get(l,mid,u,v,pos*2);
	if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
	return get(l,mid,u,v,pos*2)+get(mid+1,r,u,v,pos*2+1);
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,N=100000;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>A[i].first>>A[i].second;
    sort(A+1,A+n+1);
    priority_queue< int,vector<int>,greater<int> > pq;
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
    	ans+=get(1,N,A[i].first-A[i].second+1,A[i].first,1);
    	update(1,N,A[i].first-A[i].second+1,A[i].first,1,1);
    	if(A[i].second!=A[i].first)
    	{
    		int x=get(1,N,A[i].first-A[i].second+1,A[i].first-A[i].second+1,1);
    		int y=get(1,N,A[i].first-A[i].second,A[i].first-A[i].second,1);
    		if(y<x)
    		{
    			int l=1,r=A[i].first-A[i].second,pl=A[i].first-A[i].second,pr=pl+1;
    			while(l<=r)
    			{
    				int mid=(l+r)/2;
    				if(get(1,N,mid,mid,1)==y) r=mid-1,pl=mid;
    				else l=mid+1;
				}
				l=pr,r=A[i].first;
				while(l<=r)
    			{
    				int mid=(l+r)/2;
    				if(get(1,N,mid,mid,1)==x) l=mid+1,pr=mid;
    				else r=mid-1;
				}
				update(1,N,A[i].first-A[i].second+1,pr,-1,1);
				update(1,N,pl,pl+pr-A[i].first+A[i].second-1,1,1);
			}
		}
	}
	cout<<ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...