Submission #120959

#TimeUsernameProblemLanguageResultExecution timeMemory
120959TadijaSebezFish (IOI08_fish)C++11
100 / 100
1028 ms26744 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int mod;
int mul(int x, int y){ return (ll)x*y%mod;}
int add(int x, int y){ x+=y;return x>=mod?x-mod:x;}
int sub(int x, int y){ x-=y;return x<0?x+mod:x;}
const int N=500050;
const int M=2*N;
struct SegmentTree
{
	int sum[M];
	SegmentTree(){ for(int i=1;i<M;i++) sum[i]=1;}
	void Set(int i, int f){ for(sum[i+=N]+=f;i>1;i>>=1) sum[i>>1]=mul(sum[i],sum[i^1]);}
	int Get(int l, int r)
	{
		int ans=1;
		for(l+=N,r+=N;l<=r;l>>=1,r>>=1)
		{
			if(l%2==1) ans=mul(ans,sum[l++]);
			if(r%2==0) ans=mul(ans,sum[r--]);
		}
		return ans;
	}
} ST;
int col[N],sz[N],id[N],now[N],fir[N],sec[N],po[N];
bool best[N],was[N];
int main()
{
	int n,k;
	scanf("%i %i %i",&n,&k,&mod);
	for(int i=1;i<=n;i++) scanf("%i %i",&sz[i],&col[i]),id[i]=i;
	sort(id+1,id+1+n,[&](int i, int j){ return sz[i]<sz[j];});
	for(int i=1;i<=n;i++) po[id[i]]=i;
	for(int i=1;i<=n;i++)
	{
		swap(sz[i],sz[id[i]]);
		swap(col[i],col[id[i]]);
		swap(id[i],id[po[i]]);
		swap(po[id[i]],po[id[po[i]]]);
	}
	int cnt=0;
	for(int i=n;i>=1;i--)
	{
		if(!now[col[i]]) now[col[i]]=++cnt,best[i]=1,fir[cnt]=i;
		col[i]=now[col[i]];
		if(sz[i]*2>sz[fir[col[i]]]) sec[col[i]]=i;
	}
	int ans=0;
	for(int i=1,j=1;i<=n;i++)
	{
		while(sz[j]*2<=sz[i]) ST.Set(col[j++],1);
		if(!best[i]) continue;
		ST.Set(col[i],-1);
		ans=add(ans,ST.Get(col[i],cnt));
		int top=cnt,bot=1,mid,tmp=0;
		while(top>=bot)
		{
			mid=top+bot>>1;
			if(sz[fir[mid]]>=sz[sec[col[i]]]*2) tmp=mid,bot=mid+1;
			else top=mid-1;
		}
		ans=add(ans,mul(ST.Get(tmp+1,col[i]-1),ST.Get(col[i]+1,cnt)));
		ST.Set(col[i],1);
	}
	printf("%i\n",ans);
	return 0;
}

Compilation message (stderr)

fish.cpp: In function 'int main()':
fish.cpp:59:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    mid=top+bot>>1;
        ~~~^~~~
fish.cpp:31:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i %i",&n,&k,&mod);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
fish.cpp:32:53: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1;i<=n;i++) scanf("%i %i",&sz[i],&col[i]),id[i]=i;
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
#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...
#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...