Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- ifstream f("summax.in");
- ofstream g("summax.out");
- const int nMax = 2003;
- const long long inf = 2000000001;
- int *dp[nMax], *dp_num[nMax];
- inline void Recon(int k, int n) {
- int j = 1;
- for(int i = 1; i < n; i++) {
- g << j << " ";
- if(dp[i + 1][j] == dp[i + 1][j + 1]) {
- if(k > dp_num[i + 1][j]) {
- k -= dp_num[i + 1][j];
- j++;
- }
- continue;
- }
- if(dp[i + 1][j] < dp[i + 1][j + 1]) {
- j++;
- }
- }
- g << j << " ";
- g << "\n";
- }
- inline void Cer1(int n) {
- int summax = 0;
- for(int i = n - 1; i >= 1; i--) {
- for(int j = i; j >= 1; j--) {
- dp[i][j] = max(dp[i + 1][j + 1], dp[i + 1][j]) + dp[i][j];
- }
- }
- dp_num[n][n] = 1;
- for(int i = n - 1; i >= 1; i--) {
- for(int j = i; j >= 1; j--) {
- summax = max(dp[i + 1][j + 1], dp[i + 1][j]);
- if(summax == dp[i + 1][j]) {
- dp_num[i][j] = max(dp_num[i][j],dp_num[i + 1][j]);
- }
- if(summax == dp[i + 1][j + 1]) {
- dp_num[i][j] = max(dp_num[i][j],dp_num[i + 1][j + 1]);
- }
- if(summax == dp[i + 1][j] && summax == dp[i + 1][j + 1]) {
- if(1LL * dp_num[i + 1][j] + dp_num[i + 1][j + 1] >= inf - 1) {
- dp_num[i][j] = inf;
- }
- else {
- dp_num[i][j] = dp_num[i + 1][j] + dp_num[i + 1][j + 1];
- }
- }
- }
- }
- }
- inline void Cer2(int n, int st, int dr){
- for(int i = st; i <= dr; i++) {
- Recon(i, n);
- }
- }
- int main()
- {
- int n, st, dr, cer, x;
- f>> cer;
- f>> n >> st >> dr;
- for(int i = 1; i <= n; i++) {
- dp[i] = new int [i + 2];
- dp_num[i] = new int [i + 2];
- for(int j = 1; j <= i; j++) {
- f >> x;
- dp[i][j] = x;
- dp_num[i][j] = 1;
- }
- }
- Cer1(n);
- if(cer == 1) {
- g << dp_num[1][1] << "\n";
- }
- else {
- Cer2(st, dr, n);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment