| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:这题我用了NT^2的算法.有更快的算法吗?In Reply To:这题我用了NT^2的算法.有更快的算法吗? Posted by:ghost_wei at 2007-02-20 19:14:27 T * B = T* N * T
//-*-coding:utf-8-*-
//----------------------------------------------------------
// module: main
// url: http://poj.org/problem?id=3046
// time spend: 20:45-22:16 11:32-13:29 08:23-9:07 = 4:15
//
// T * MAXA = 1000 * 100 * 1000
// T * C * (MAXA = T*C) = 100 * 100 * 1000
//
// 卡关:
// 找规律找了很久
// 找优化算法找了很久
// 没有看到结果6位的提示
// 6位在运算的时候溢出了
//
// 算法:
// 默认方法:
// for i = 1 - alla:
// for all T:
// for k = max(1, i-olda), min(c, i):
// i - k <= olda
// i - k >= 0
// i - c <= i - k <= i
// n[i] += o[i-k]
//
// 优化递推,发现不用每个都加,而是维护一个待加量
//
// 找规律
//
// {}
// {1}
// {1,1}
// 2*3
// {}
// {1}, {2} + o[0]
// {1,1}, {1,2}, {2,2} + o[0] + o[1]
// {2,2,2} + o[0]
// {}
// {1} {2} + o[0]
// {1,1} {1,2} {2,2} + o[0] + o[1]
// {1,1,2} {1,2,2} + o[1] + +o[2]
// {1,1,2,2} + o[2]
// {}
// {1} {2} {3} +o[0]
// {1,1} {1,2} {2,2} {2,3} {1,3} +o[1]
// {1,1,2} {1,2,2} {1,1,3} {1,2,3} {2,2,3} +o[2]
// {1,1,2,2} {1,1,2,3} {1,2,2,3} + o[3]
// {1,1,2,2,3} + o[4]
//----------------------------------------------------------
#include <algorithm>
#include <vector>
#include <deque>
#include <queue>
#include <map>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int INF = 1 << 29;
const int MAXN = INF;
const int MAXT = 1000;
const int MAXA = 100*MAXT;
const int MOD = 1000000;
int T, A, S, B;
int af[MAXT];
long dp1[MAXA+1];
long dp2[MAXA+1];
void solve(){
memset(dp1, 0, sizeof(int) * A);
memset(dp2, 0, sizeof(int) * A);
long *dp = dp1;
long *odp = dp2;
int olda = 0;
dp1[0] = 1;
dp2[0] = 1;
for (int j = 0; j < T; ++j)
{
long t = 0;
int c = af[j];
if (c==0) continue;
for (int i = 1; (i <= min(olda + c, B)); ++i)
{
if (i-1 <= olda) t += odp[i-1];
if (i > c) t -= odp[i-c-1];
dp[i] = (t + odp[i]) % MOD;
// printf("t:%d=%d ", t, dp[i]);
}
// printf("\n");
olda += c;
// swap
long *tt = dp;
dp = odp;
odp = tt;
}
long all = 0;
for (int i = S; i <= B; ++i)
{
all += odp[i];
all %= MOD;
}
printf("%ld\n", all);
};
void scan(){
memset(af, 0, MAXT*sizeof(int));
scanf("%d %d %d %d", &T, &A, &S, &B);
for (int i = 0; i < A; ++i)
{
int d;
scanf("%d", &d);
af[d-1] ++;
}
// for (int i = 0; i < T; ++i)
// {
// printf("%d=%d\n", i, af[i]);
// }
}
int main(int argc, char *argv[])
{
scan();
solve();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator