답안 #57140

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
57140 2018-07-14T06:35:58 Z 김세빈(#1653) Skyscraper (JOI16_skyscraper) C++11
15 / 100
1458 ms 69984 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll mod = 1e9 + 7;
const int c = 101010;

int D[2][111][3][220202];
int A[111];
int n, k, ans;

int main()
{
	int i, j, l, x;
	
	scanf("%d%d", &n, &k);
	
	for(i=1;i<=n;i++){
		scanf("%d", A+i);
	}
	
	sort(A+1, A+n+1);
	
	for(i=n;i>=1;i--) A[i] -= A[1];
	
	D[0][0][0][0 + c] = 1;
	
	for(i=1;i<n;i++){
		for(j=0;j<=i;j++){
			for(l=-101010;l<=101010;l++){
				// endpoints
				if(j){
					D[i&1][j-1][1][l + A[i] + c] = (D[i&1][j-1][1][l + A[i] + c] + D[~i&1][j][0][l + c] * (ll)2) % mod;
				}
				D[i&1][j][1][l - A[i] + c] = (D[i&1][j][1][l - A[i] + c] + D[~i&1][j][0][l + c] * (ll)2) % mod;
				
				
				if(j){
					D[i&1][j-1][2][l + A[i] + c] = (D[i&1][j-1][2][l + A[i] + c] + D[~i&1][j][1][l + c]) % mod;
					D[i&1][j-1][1][l + 2*A[i] + c] = (D[i&1][j-1][1][l + 2*A[i] + c] + D[~i&1][j][1][l + c]) % mod;
				}
				D[i&1][j][2][l - A[i] + c] = (D[i&1][j][2][l - A[i] + c] + D[~i&1][j][1][l + c]) % mod;
				D[i&1][j][1][l + c] = (D[i&1][j][1][l + c] + D[~i&1][j][1][l + c]) % mod;
				
				
				if(j){
					D[i&1][j-1][2][l + 2*A[i] + c] = (D[i&1][j-1][2][l + 2*A[i] + c] + D[~i&1][j][2][l + c] * (ll)2) % mod;
				}
				D[i&1][j][2][l + c] = (D[i&1][j][2][l + c] + D[~i&1][j][2][l + c] * (ll)2) % mod;
				
				
				for(x=0;x<3;x++){
					// new group
					D[i&1][j+1][x][l - 2*A[i] + c] = (D[i&1][j+1][x][l - 2*A[i] + c] + D[~i&1][j][x][l + c] * (ll)(j + 1)) % mod;
					
					// merge two groups
					if(j > 1){
						D[i&1][j-1][x][l + 2*A[i] + c] = (D[i&1][j-1][x][l + 2*A[i] + c] + D[~i&1][j][x][l + c] * (ll)(j - 1)) % mod;
					}
					
					// group endpoints
					D[i&1][j][x][l + c] = (D[i&1][j][x][l + c] + D[~i&1][j][x][l + c] * (ll)2 * j) % mod;
					
					D[~i&1][j][x][l + c] = 0;
				}
			}
		}
	}
	
	for(l=-101010;l<=101010;l++){
		if(0 <= l + A[n] * 2 && l + A[n] * 2 <= k) ans = (ans + D[~n&1][0][2][l + c]) % mod;
		if(0 <= l + A[n] && l + A[n] <= k) ans = (ans + D[~n&1][0][1][l + c]) % mod;
	}
	
	printf("%d\n", ans);
	
	return 0;
}

Compilation message

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:18:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &k);
  ~~~~~^~~~~~~~~~~~~~~~
skyscraper.cpp:21:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", A+i);
   ~~~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 252 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1022 ms 60320 KB Output is correct
2 Correct 1057 ms 69984 KB Output is correct
3 Correct 1350 ms 69984 KB Output is correct
4 Correct 1458 ms 69984 KB Output is correct
5 Correct 1129 ms 69984 KB Output is correct
6 Correct 1232 ms 69984 KB Output is correct
7 Correct 1079 ms 69984 KB Output is correct
8 Correct 1104 ms 69984 KB Output is correct
9 Correct 1174 ms 69984 KB Output is correct
10 Correct 1315 ms 69984 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 252 KB Output isn't correct
2 Halted 0 ms 0 KB -