Submission #469420

#TimeUsernameProblemLanguageResultExecution timeMemory
469420flashmtSails (IOI07_sails)C++17
100 / 100
132 ms4404 KiB
#include <bits/stdc++.h>
#define fr(a,b,c) for (a=b;a<=c;a++)
using namespace std;
const int N = 100100;

int n, H, f[N * 4], mn[N * 4];
vector<pair<int, int>> a;
long long re;

int Get_Value(int nd,int l,int r,int x)
{
	if (l==r) return f[nd];
	int m=(l+r)>>1;
	if (x<=m) return f[nd]+Get_Value(nd<<1,l,m,x);
	return f[nd]+Get_Value((nd<<1)+1,m+1,r,x);
}

int Find_First_Position(int nd,int l,int r,int x,int y,int v)
{
	int m=(l+r)>>1,res=0;
	if (l==x && r==y)
	{
		if (mn[nd]>v) return 0;
		if (l==r) return l;
		if (mn[nd<<1]+f[nd]<=v) return Find_First_Position(nd<<1,l,m,l,m,v-f[nd]);
		return Find_First_Position((nd<<1)+1,m+1,r,m+1,r,v-f[nd]);
	}
	if (x<=m) res=Find_First_Position(nd<<1,l,m,x,min(y,m),v-f[nd]);
	if (res) return res;
	if (m<y) res=Find_First_Position((nd<<1)+1,m+1,r,max(x,m+1),y,v-f[nd]);
	return res;
}

void Add(int nd,int l,int r,int x,int y)
{
	if (l==x && r==y) f[nd]++, mn[nd]++;
	else
	{
		int m=(l+r)>>1;
		if (x<=m) Add(nd<<1,l,m,x,min(y,m));
		if (m<y)
		{
			Add((nd<<1)+1,m+1,r,max(x,m+1),y);
			mn[nd]=mn[(nd<<1)+1]+f[nd];
		}
	}
}

void Calc_Result(int nd,int l,int r)
{
	if (l==r) re+=1LL*f[nd]*(f[nd]-1)>>1;
	else
	{
		int m=(l+r)>>1;
		f[nd<<1]+=f[nd];
		f[(nd<<1)+1]+=f[nd];
		Calc_Result(nd<<1,l,m);
		Calc_Result((nd<<1)+1,m+1,r);
	}
}

int main()
{
	int i,h,k,v,l,r;
	cin >> n;
	fr(i,1,n)
	{
		scanf("%d%d",&h,&k);
		H=max(H,h);
		a.push_back(make_pair(h,k));
	}
	sort(a.begin(),a.end());
	fr(i,0,n-1)
	{
		h=a[i].first; k=a[i].second;
		v=Get_Value(1,1,H,h-k+1);
		r=Find_First_Position(1,1,H,1,h,v-1);
		if (!r) r=h+1;
		else Add(1,1,H,r,h);
		k-=(h-r+1);
		l=Find_First_Position(1,1,H,1,r-1,v);
		Add(1,1,H,l,l+k-1);
	}
	Calc_Result(1,1,H);
	cout << re << endl;
	return 0;
}

Compilation message (stderr)

sails.cpp: In function 'int main()':
sails.cpp:68:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |   scanf("%d%d",&h,&k);
      |   ~~~~~^~~~~~~~~~~~~~
#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...