Submission #433619

# Submission time Handle Problem Language Result Execution time Memory
433619 2021-06-20T08:34:12 Z Mounir Boat (APIO16_boat) C++14
0 / 100
205 ms 32576 KB
#include <bits/stdc++.h>
#define chmax(x, v) x = max(x, v)
#define pii pair<int, int>
#define pb push_back
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
using namespace std;

const int N = 105, MOD = 1e9 + 7, INDEFINI = -1;


struct Inter {
	int deb, fin;
};

int dp[2][2 * N][N], sumDp[2][2 * N][N];
int taille[N];
int nBoats;
vector<Inter> inters;

map<pii, int> binome;

int expo(int val, int exposant){
	if (exposant == 0)
		return 1;
	if (exposant == 1)
		return val;
	int res = expo(val, exposant/2);
	res = (res * res)%MOD;
	if (exposant%2 == 1)
		res = (res * val)%MOD;
	return res;
}

int nFacons(int k, int n){
	pii situation = {k, n};
	if (k > n)
		return 0;
	if (k == n)
		return 1;
	return binome[situation];
}

int getDp(int iBoat, int iPetit, int nMeme){
	if (iBoat == -1)
		return nFacons(nMeme, taille[iPetit]);
	if (iPetit < inters[iBoat].deb || iPetit >= inters[iBoat].fin)
		return 0;

	if (dp[iBoat%2][iPetit][nMeme] == INDEFINI){
		dp[iBoat%2][iPetit][nMeme] = 0;

		//Si on change d'intervalle

		if (iBoat != 0){
			for (int valAvant = 0; valAvant < iPetit; ++valAvant)
				dp[iBoat%2][iPetit][nMeme] = (dp[iBoat%2][iPetit][nMeme] + sumDp[(iBoat - 1)%2][valAvant][1])%MOD;
			dp[iBoat%2][iPetit][nMeme] = (dp[iBoat%2][iPetit][nMeme] * nFacons(nMeme, taille[iPetit]))%MOD;
			//cout << "calc " << iBoat << " " << iPetit << " " << nMeme << " " << nFacons(nMeme, taille[iPetit]);
			//Si on reste sur le même intervalle
			dp[iBoat%2][iPetit][nMeme] = (dp[iBoat%2][iPetit][nMeme] + sumDp[(iBoat - 1)%2][iPetit][nMeme + 1])%MOD;
		}
		//Si cetait le premier
		dp[iBoat%2][iPetit][nMeme] = (dp[iBoat%2][iPetit][nMeme] + getDp(-1, iPetit, nMeme));
	//	cout << "DP " << iBoat << " " << iPetit << " " << nMeme << " " << dp[iBoat][iPetit][nMeme] << endl;
	}
	return dp[iBoat%2][iPetit][nMeme];
}


signed main(){
	cin >> nBoats;
	vector<int> vals;
	inters.resize(nBoats);
	for (Inter& inter : inters){
		cin >> inter.deb >> inter.fin;
		inter.fin++; //Fin exclue
		vals.pb(inter.deb);
		vals.pb(inter.fin);
	}

	sort(all(vals));
	vector<int> t = {vals[0]};
	for (int ind = 1; ind < sz(vals); ++ind){
		if (vals[ind] != vals[ind - 1])
			t.pb(vals[ind]);
	}
	vals = t;
	//vals.pb(vals.back());

	map<int, int> compression;
	for (int ind = 0; ind < sz(vals); ++ind){
		compression[vals[ind]] = ind;
		if (ind != 0)
			taille[ind - 1] = vals[ind] - vals[ind - 1];
	}

	for (int ind = 0; ind < sz(vals) - 1; ++ind){
		int bign = taille[ind], res = bign;
		for (int k = 2; k <= nBoats; ++k){
			binome[{k - 1, bign}] = res;
			res = (res * bign - k + 1)%MOD;
			res = (res * expo(k, MOD - 2))%MOD;
		}
		binome[{nBoats, bign}] = res;
	}

	//int id = 0;
	for (Inter& inter : inters){
		inter.deb = compression[inter.deb];
		inter.fin = compression[inter.fin];
		//cout << "inter " << inter.deb << " " << inter.fin << endl;
	}

	for (int i = 0; i < nBoats; ++i)
		for (int j = 0; j < 2 * nBoats; ++j)
			for (int k = 0; k < nBoats; ++k)
				dp[i%2][j][k] = INDEFINI;

	int sum = 0;
	for (int i = 0; i < nBoats; ++i){
		for (int j = 0; j < sz(vals) - 1; ++j){
			for (int k = 0; k < nBoats; ++k){
				sumDp[i%2][j][k] = getDp(i, j, k);
				if (i != 0)
					sumDp[i%2][j][k] = (sumDp[i%2][j][k] + sumDp[(i - 1)%2][j][k])%MOD;
			}
			sum = (sum + getDp(i, j, 1))%MOD;
		}
	}
	
	cout << sum << endl;
	return 0;
}
# Verdict Execution time Memory Grader output
1 Runtime error 205 ms 32576 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 205 ms 32576 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 36 ms 1820 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 205 ms 32576 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -