您的位置:首页 > 其它

bzoj2013 [Ceoi2010]A huge tower

2017-10-12 22:50 267 查看
题目

神题呀,考虑从小往大加入,设目前最长的为x,给它放入,显然,比它小的一定可以放在上面,现在看它的下面可以放什么,显然是一段连续的区间,我们可以二分一下l。但是,又发现,它肯定是单增的,所以用一个变量加一下就好了。

#include<bits/stdc++.h>
#define N 620000
#define mod 1000000009
using namespace std;
int n,d,pos;
int A[N+5];
long long ans;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
int x=0,b=1;
char c=nc();
for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1;
for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0';
return x*b;
}
int main()
{
freopen("in.txt","r",stdin);
n=read();d=read();
for(int i=1;i<=n;i++)A[i]=read();
sort(A+1,A+n+1);
ans=pos=1;
for(int i=2;i<=n;i++)
{
while(pos<=n&&A[pos]<A[i]-d)pos++;
ans=1ll*ans*(i-pos+1)%mod;
}
cout<<ans;
return 0;
}


快出新高度,又排第一。



再来一句,fread大法好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: