2013: [Ceoi2010]A huge tower
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 471 Solved: 321
[Submit][Status][Discuss]
Description
有N(2<=N<=620000)快砖,要搭一个N层的塔,要求:如果砖A在砖B上面,那么A不能比B的长度+D要长。问有几种方法,输出 答案 mod 1000000009的值
Input
第一行: N,D 第二行: N个数,表示每块砖的长度。
Output
方案数。输出要mod1000000009
Sample Input
4 1
1 2 3 100
1 2 3 100
Sample Output
4
一道liu_runda都没看出来的题……
又是一道想得到十分钟AC,想不到一整天也打不出来的题……
对于这道题,我们大可“目光短浅”一点,他说什么我们就想什么。既然他唯一的限制是上下两块砖的限制,我们就只关注上下两块砖的关系,很明显,大的砖在下面一定是合法的,我们就去按照题目给的要求,看谁能在他下面,我们先假定这块砖是当前最大的,这样,我们就可以让任一砖在他上面都合法,然后,可以注意到只要这块砖可以放到谁的上面,我们就尽管去放好了,反正他上面的砖比他小。这样,我们只要把砖排一个序,然后去找有几块砖可以放到当前砖下面,乘起来就好了。
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm> 7 #include <cmath> 8 #include <map> 9 #include <vector> 10 #define N 620005 11 using namespace std; 12 int n,a[N],p=1000000009,d; 13 int main() 14 { 15 scanf("%d%d",&n,&d); 16 for(int i=1;i<=n;i++) 17 scanf("%d",&a[i]); 18 sort(a+1,a+n+1); 19 long long ans=1,zz=1; 20 for(int i=2;i<=n;i++) 21 { 22 while(a[zz]+d<a[i])zz++; 23 ans*=(i-zz+1); 24 ans%=p; 25 } 26 printf("%lld ",ans); 27 return 0; 28 }
Ps:据说4352是双倍经验。