Submission #43373

# Submission time Handle Problem Language Result Execution time Memory
43373 2018-03-15T04:44:05 Z top34051 Boat (APIO16_boat) C++14
27 / 100
2000 ms 12636 KB
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define pii pair<int, int>
#define X first
#define Y second

const int maxn = 2e3 + 5;
const ll mod = 1e9 + 7;

int n,m;
int a[maxn], b[maxn];

vector<int> pos;
pii itv[maxn];
ll temp[maxn][maxn];
ll rec[maxn][maxn];

ll dp[maxn][maxn];

ll fac[maxn], invfac[maxn];

ll add(ll x, ll y) { return ((x+y)%mod + mod)%mod; }

ll mul(ll x, ll y) { return ((x*y)%mod + mod)%mod; }

ll inv(ll x, ll y) { return 1<x ? y - inv(y%x, x)*y/x : 1; }

ll combi1(ll x, ll y) {
    return x<y ? 0 : mul(fac[x], mul(invfac[y], invfac[x-y]));
}

void init() {
	//get interval
	for(int i=1;i<=n;i++) {
		pos.push_back(a[i]);
		pos.push_back(b[i]+1);
	}
	sort(pos.begin(),pos.end());
	pos.erase(unique(pos.begin(),pos.end()),pos.end());
	for(int i=0;i<pos.size()-1;i++) itv[++m] = {pos[i],pos[i+1]-1};
//	for(int i=1;i<=m;i++) printf("[%d, %d] ",itv[i].X,itv[i].Y);
//	printf("\n");
	//fac and invfac
	fac[0] = 1; invfac[0] = inv(fac[0], mod);
//    printf("fac %d = %lld inv = %lld\n",1,fac[1],invfac[1]);
	for(int i=1;i<=m;i++) {
		fac[i] = mul(fac[i-1], i);
		invfac[i] = inv(fac[i], mod);
//		printf("fac %d = %lld inv = %lld\n",i,fac[i],invfac[i]);
	}
	//precompute
	for(int i=1;i<=m;i++) {
        ll sz = itv[i].Y-itv[i].X+1;
        temp[i][1] = sz;
        for(int use=2;use<=n;use++) temp[i][use] = mul(temp[i][use-1], mul(sz-use+1, inv(use,mod)));
	}
//	printf("m = %d\n",m);
	for(int i=1;i<=m;i++) {
        for(int cnt=1;cnt<=n;cnt++) {
//            if(cnt==1) printf("calc %d %d\n",i,cnt);
        	for(int use=1;use<=cnt;use++) rec[i][cnt] = add(rec[i][cnt], mul(temp[i][use], combi1(cnt-1,use-1)));
		}
	}
}

ll solve() {
    ll res = 0;
	for(int i=0;i<=m;i++) dp[0][i] = 1;
	for(int i=1;i<=m;i++) {
		for(int x=1;x<=n;x++) {
			dp[x][i] = dp[x][i-1];
			if(a[x]<=itv[i].X && itv[i].Y<=b[x]) {
				ll cnt = 1;
				for(int y=x-1;y>=0;y--) {
					dp[x][i] = add(dp[x][i], mul(dp[y][i-1], rec[i][cnt]));
					if(a[y]<=itv[i].X && itv[i].Y<=b[y]) cnt++;
				}
			}
//			printf("dp %d %d = %lld\n",x,i,dp[x][i]);
		}
	}
	for(int x=1;x<=n;x++) res = add(res, dp[x][m]);
	return res;
}

int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
	init();
	printf("%lld",solve());
}

Compilation message

boat.cpp: In function 'void init()':
boat.cpp:42:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<pos.size()-1;i++) itv[++m] = {pos[i],pos[i+1]-1};
               ^
boat.cpp: In function 'int main()':
boat.cpp:89:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
                ^
boat.cpp:90:49: 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("%d%d",&a[i],&b[i]);
                                                 ^
# Verdict Execution time Memory Grader output
1 Execution timed out 2028 ms 12636 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2028 ms 12636 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 39 ms 12636 KB Output is correct
2 Correct 40 ms 12636 KB Output is correct
3 Correct 40 ms 12636 KB Output is correct
4 Correct 40 ms 12636 KB Output is correct
5 Correct 46 ms 12636 KB Output is correct
6 Correct 43 ms 12636 KB Output is correct
7 Correct 42 ms 12636 KB Output is correct
8 Correct 42 ms 12636 KB Output is correct
9 Correct 44 ms 12636 KB Output is correct
10 Correct 44 ms 12636 KB Output is correct
11 Correct 40 ms 12636 KB Output is correct
12 Correct 39 ms 12636 KB Output is correct
13 Correct 39 ms 12636 KB Output is correct
14 Correct 42 ms 12636 KB Output is correct
15 Correct 42 ms 12636 KB Output is correct
16 Correct 24 ms 12636 KB Output is correct
17 Correct 23 ms 12636 KB Output is correct
18 Correct 24 ms 12636 KB Output is correct
19 Correct 23 ms 12636 KB Output is correct
20 Correct 23 ms 12636 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 2028 ms 12636 KB Time limit exceeded
2 Halted 0 ms 0 KB -