답안 #283854

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
283854 2020-08-26T08:11:11 Z 송준혁(#5751) Žarulje (COI15_zarulje) C++17
100 / 100
236 ms 58232 KB
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define MOD 1'000'000'007 
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;

int N, Q;
int A[202020], L[202020], R[202020], cnt[202020];
LL F[202020], I[202020], ans[202020], C;
map<int,int> LC[202020], RC[202020];
vector<int> st;

LL Pow(LL x, LL y){
	if (y == 0) return 1;
	LL z = Pow(x, y/2);
	if (y & 1) return z * z % MOD * x % MOD;
	return z * z % MOD;
}

int main(){
	scanf("%d %d", &N, &Q);
	F[0] = I[0] = 1;
	for (int i=1; i<=N; i++){
		scanf("%d", &A[i]);
		F[i] = F[i-1] * i % MOD;
		I[i] = Pow(F[i], MOD-2);
	}
	st.pb(0);
	for (int i=1; i<=N; i++){
		while (st.back() > A[i]) LC[i][st.back()]=cnt[st.back()], cnt[st.back()]=0, st.pop_back();
		L[i] = cnt[A[i]], cnt[A[i]]++;
		if (st.back() != A[i]) st.push_back(A[i]);
	}
	while(st.size()) cnt[st.back()]=0, st.pop_back();
	st.pb(0);
	for (int i=N; i>0; i--){
		while (st.back() > A[i]) RC[i][st.back()]=cnt[st.back()], cnt[st.back()]=0, st.pop_back();
		R[i] = cnt[A[i]], cnt[A[i]]++;
		if (st.back() != A[i]) st.push_back(A[i]);
	}
	while(st.size()) cnt[st.back()]=0, st.pop_back();
	ans[1] = C = 1;
	for (int i=2; i<=N; i++){
		C = C * I[L[i-1]+R[i-1]] % MOD * F[L[i-1]] % MOD;
		C = C * F[L[i-1]+R[i-1]+1] % MOD * I[L[i-1]+1] % MOD;
		C = C * I[L[i]+R[i]+1] % MOD * F[R[i]+1] % MOD;
		C = C * F[L[i]+R[i]] % MOD * I[R[i]] % MOD;
		ans[i] = C;
		for (pii t : LC[i]) ans[i] = ans[i] * F[t.se+RC[i][t.fi]] % MOD * I[t.se] % MOD * I[RC[i][t.fi]] % MOD;
	}
	while (Q--){
		int t;
		scanf("%d", &t);
		printf("%lld\n", ans[t]);
	}
	return 0;
}

Compilation message

zarulje.cpp: In function 'int main()':
zarulje.cpp:24:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   24 |  scanf("%d %d", &N, &Q);
      |  ~~~~~^~~~~~~~~~~~~~~~~
zarulje.cpp:27:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   27 |   scanf("%d", &A[i]);
      |   ~~~~~^~~~~~~~~~~~~
zarulje.cpp:56:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   56 |   scanf("%d", &t);
      |   ~~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 19328 KB Output is correct
2 Correct 16 ms 19456 KB Output is correct
3 Correct 17 ms 19584 KB Output is correct
4 Correct 15 ms 19624 KB Output is correct
5 Correct 18 ms 19712 KB Output is correct
6 Correct 18 ms 19712 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 98 ms 37156 KB Output is correct
2 Correct 151 ms 45432 KB Output is correct
3 Correct 180 ms 53344 KB Output is correct
4 Correct 176 ms 55032 KB Output is correct
5 Correct 189 ms 55424 KB Output is correct
6 Correct 186 ms 56060 KB Output is correct
7 Correct 191 ms 56568 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 19328 KB Output is correct
2 Correct 16 ms 19456 KB Output is correct
3 Correct 17 ms 19584 KB Output is correct
4 Correct 15 ms 19624 KB Output is correct
5 Correct 18 ms 19712 KB Output is correct
6 Correct 18 ms 19712 KB Output is correct
7 Correct 98 ms 37156 KB Output is correct
8 Correct 151 ms 45432 KB Output is correct
9 Correct 180 ms 53344 KB Output is correct
10 Correct 176 ms 55032 KB Output is correct
11 Correct 189 ms 55424 KB Output is correct
12 Correct 186 ms 56060 KB Output is correct
13 Correct 191 ms 56568 KB Output is correct
14 Correct 27 ms 21120 KB Output is correct
15 Correct 123 ms 38652 KB Output is correct
16 Correct 205 ms 48632 KB Output is correct
17 Correct 222 ms 54904 KB Output is correct
18 Correct 233 ms 58200 KB Output is correct
19 Correct 211 ms 56696 KB Output is correct
20 Correct 231 ms 57724 KB Output is correct
21 Correct 236 ms 58232 KB Output is correct