QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#55609 | #1823. Permutation CFG | ckiseki# | WA | 613ms | 104660kb | C++ | 6.5kb | 2022-10-14 19:58:36 | 2022-10-14 19:58:37 |
Judging History
answer
#include <bits/stdc++.h>
#ifdef CKISEKI
#define safe cerr<<__PRETTY_FUNCTION__<<" line " <<__LINE__<<" safe\n"
#define debug(a...) qwerty(#a, a)
#define orange(a...) dvorak(#a, a)
using std::cerr;
template <typename ...T>
void qwerty(const char *s, T ...a) {
cerr << "\e[1;32m(" << s << ") = (";
int cnt = sizeof...(T);
(..., (cerr << a << (--cnt ? ", " : ")\e[0m\n")));
}
template <typename Iter>
void dvorak(const char *s, Iter L, Iter R) {
cerr << "\e[1;32m[ " << s << " ] = [ ";
for (int f = 0; L != R; ++L)
cerr << (f++ ? ", " : "") << *L;
cerr << " ]\e[0m\n";
}
#else
#define safe ((void)0)
#define debug(...) ((void)0)
#define orange(...) ((void)0)
#endif
using namespace std;
const int maxn = 100025;
using Big = __int128;
struct Fenwick {
int cnt[maxn];
Big sum[maxn];
void add(int p, int u, Big v) {
for (++p; p < maxn; p += p & -p) {
cnt[p] += u;
sum[p] += v;
}
}
pair<int,Big> query(int p) {
int c = 0;
Big s = 0;
for (++p; p > 0; p -= p & -p)
c += cnt[p], s += sum[p];
return { c, s };
}
int bsearchSum(Big &k) {
Big orgk = k;
int p = 0;
for (int s = 1 << 20; s; s >>= 1) {
if (p + s < maxn && sum[p + s] < k) {
p += s;
k -= sum[p];
}
}
if (query(p).second == orgk) {
++p;
k = 0;
}
return p;
}
void init() {
memset(cnt, 0, sizeof(cnt));
memset(sum, 0, sizeof(sum));
}
} BIT;
struct ar : array<Big,6> {
ar & operator+=(const ar &rhs) {
for (int j = 0; j < 6; j++)
(*this)[j] += rhs[j];
return *this;
}
};
ar operator+(ar lhs, const ar &rhs) {
for (int j = 0; j < 6; j++)
lhs[j] += rhs[j];
return lhs;
}
struct Segtree {
ar st[maxn * 2];
int n;
void init(int _n) {
n = _n;
for (int i = 0; i < n * 2; i++)
st[i] = ar{};
}
void add(int p, ar val) {
for (st[p += n] += val; p > 1; p >>= 1)
st[p >> 1] = st[p] + st[p ^ 1];
}
ar query(int l, int r) {
ar res = {};
for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
if (l & 1) res += st[l++];
if (r & 1) res += st[--r];
}
return res;
}
} sgt;
// int C(int n, int k) {
// int64_t p = 1;
// for (int i = 0; i < k; i++)
// p *= n - i;
// for (int i = 1; i <= k; i++)
// p /= i;
// return p;
// }
ostream & operator<<(ostream &o, Big b) {
static auto tos = [](Big x) -> string {
assert (x >= 0);
if (!x) return "0";
string s;
while (x)
s += char(x % 10 + '0'), x /= 10;
reverse(s.begin(), s.end());
return s;
};
return o << tos(b);
};
int main() {
// freopen("g.in", "r", stdin);
// cerr << "reopen g.in" << endl;
cin.tie(nullptr)->sync_with_stdio(false);
int n, s, q;
cin >> n >> s >> q;
vector<int> p(n+1), pos(n+1);
vector<array<Big,6>> dp(n+1);
for (int i = 1; i <= n; i++)
dp[i][0] = 1;
for (int j = 1; j <= s; j++) {
dp[0][j] = 0;
for (int i = 1; i <= n; i++) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
// for (int j = 0; j <= s; j++) {
// for (int i = 0; i <= n; i++) {
// cout << dp[i][j] << ' ';
// }
// cout << endl;
// }
// for (int i = 1; i <= n; i++) p[i] = i;
for (int i = 1; i <= n; i++) cin >> p[i];
for (int i = 1; i <= n; i++)
pos[p[i]] = i;
vector<int> ql(q);
vector<vector<pair<Big,int>>> Q1(n+1), nQ1;
for (int i = 0; i < q; i++) {
int a;
cin >> ql[i] >> a;
Q1[n].emplace_back(a, i);
}
vector<vector<tuple<int,int,int>>> qs[7];
for (int j = 0; j <= s; j++)
qs[j].resize(n + 2);
for (int j = s - 1; j >= 0; j--) {
nQ1.assign(n+1, {});
BIT.init();
debug(j);
for (int i = 1; i <= n; i++) {
BIT.add(pos[i], 1, dp[i][j]);
// for (int k = 1; k <= n; k++)
// cerr << BIT.query(k).second-BIT.query(k-1).second << ' ';
// cerr << endl;
for (auto [a, qid]: Q1[i]) {
debug(a, qid, BIT.query(n).second);
int pp = BIT.bsearchSum(a); // `a` changes
// assert (ql[qid] <= i); // FIXME
qs[j][pp].emplace_back(ql[qid], i, qid);
if (a == 0) continue;
int nxt = p[pp];
nQ1[nxt].emplace_back(a, qid);
debug(a, qid, pp, nxt);
}
}
Q1 = nQ1;
}
vector<Big> ans(q);
const auto calc = [](ar powsum, int a, int b) {
// C(x - a + b, b)
vector<Big> poly{1};
for (int j = 0; j < b; j++) {
// poly *= (x - a + b - j)
vector<Big> newpoly(poly.size() + 1);
for (int k = 0; k < poly.size(); k++) {
newpoly[k + 1] += poly[k];
newpoly[k] += (-a + b - j) * poly[k];
}
poly = newpoly;
}
Big res = 0;
for (int j = 0; j < poly.size(); j++)
res += poly[j] * powsum[j];
Big div = 1;
for (int i = 1; i <= b; ++i)
div *= i;
res /= div;
return res;
};
for (int j = s; j >= 0; j--) {
vector<int> freq(n + 1);
sgt.init(n + 1);
for (int i = 1; i <= n + 1; i++) {
for (auto [l, r, qid]: qs[j][i]) {
/*
// debug(l, r, i, j);
for (int x = 1; x < i; x++) {
// cerr << "p[x] = " << p[x] << endl;
if (l <= p[x] && p[x] <= r) {
if (j == 0)
ans[qid] += p[x] == l;
else
ans[qid] += C(p[x] - l + j - 1, j - 1);
}
}
// debug(ans[qid]);
*/
if (j == 0) {
ans[qid] += freq[l];
} else {
auto powsum = sgt.query(l, r + 1);
ans[qid] += calc(powsum, l, j - 1);
}
}
if (i <= n) {
freq[p[i]] += 1;
ar tmp;
tmp[0] = 1;
for (int k = 1; k <= s; k++)
tmp[k] = tmp[k - 1] * p[i];
sgt.add(p[i], tmp);
}
}
}
for (int i = 0; i < q; i++)
cout << ans[i] << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 5696kb
input:
4 3 6 1 4 3 2 1 6 2 20 4 1 3 5 2 9 1 16
output:
3 6 0 1 2 8
result:
ok 6 numbers
Test #2:
score: 0
Accepted
time: 584ms
memory: 104156kb
input:
100000 5 200000 98129 52962 60307 83804 75634 55811 85666 40965 78529 40850 54600 83058 37001 92436 30323 54632 24238 77437 87162 75991 39863 74990 32168 99841 85430 66056 69893 7561 60704 40795 81535 89902 44331 20995 99461 93620 91817 97370 84025 98836 2455 77447 37078 90192 26249 84337 70311 4006...
output:
20217 9885 20204 20217 20218 20217 20217 727 20202 20218 20218 20214 20217 7790 20217 20217 20200 20217 20218 20217 20218 20218 20218 20217 20202 20217 20218 20218 5609 8419 20218 20200 20218 20216 11843 20218 20217 20207 20217 935 20203 5909 20218 20217 20218 20200 20217 20213 20203 20207 5654 4087...
result:
ok 200000 numbers
Test #3:
score: 0
Accepted
time: 558ms
memory: 104660kb
input:
100000 5 200000 59767 75967 97372 50276 20532 77164 30969 40418 84175 87555 79967 28404 26422 22441 4543 72719 9318 93986 12744 88814 25854 93658 9042 41389 24133 60155 80340 44920 58271 50431 92622 28573 30633 318 43850 78809 69750 67699 17767 8454 2543 26572 52552 77502 24901 94119 87156 19368 394...
output:
33305 33330 19455 33332 25500 1777 33332 33310 33337 33333 33297 33331 33337 33330 33317 33304 33332 33336 33331 33337 33335 5611 33334 33337 33333 33331 33337 33307 33334 22446 31995 27049 33337 5351 32269 33332 33334 33331 33299 33331 33334 24072 21451 33331 33338 33332 33331 33331 33319 23356 333...
result:
ok 200000 numbers
Test #4:
score: 0
Accepted
time: 528ms
memory: 103428kb
input:
97997 5 200000 92883 53079 12146 7142 47500 47118 60176 54625 8908 93576 33824 61522 79201 68956 25790 76970 63243 10575 33345 20943 77076 40068 30980 20739 90036 57454 38446 49088 90613 27293 39453 52577 94545 7934 73793 6201 33713 91255 45678 63783 65019 35224 65407 39863 38120 79943 69106 76540 6...
output:
21513 21504 21512 21513 21512 19613 21418 21511 21512 6191 21512 18462 4097 21511 21511 21510 21499 21502 21513 21512 21499 21512 21512 21513 21512 21512 21501 21512 10071 21513 21510 21511 21513 21512 21511 21498 21512 21511 21497 21513 21512 21512 21513 21512 21491 21513 16589 21508 21511 21500 20...
result:
ok 200000 numbers
Test #5:
score: 0
Accepted
time: 428ms
memory: 98840kb
input:
97997 5 200000 1 2 3 4 5 6 7 8 9 10 97997 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 ...
output:
36269 44641 44708 44743 44700 45423 39594 44743 44405 44918 43915 44740 44706 28640 44655 44062 45423 22483 18051 44678 44757 44686 44695 44645 44830 44723 44700 35460 37180 43835 18485 40508 33475 45038 44723 44665 41482 44778 44633 44714 41636 45203 43011 42876 40377 41790 45709 43725 44184 38340 ...
result:
ok 200000 numbers
Test #6:
score: 0
Accepted
time: 419ms
memory: 98220kb
input:
100000 4 200000 57295 10377 65950 19742 78625 70832 98216 11307 9435 8964 76095 1478 46489 61182 52528 10230 50341 83069 94103 42263 18143 52203 16940 68520 76816 98586 96583 28873 59764 20859 85162 22208 33614 52858 48657 87020 40526 40052 31847 30496 89165 52856 35045 71923 20595 57732 33398 21247...
output:
34970 34961 34984 34987 34983 34964 34976 34929 34980 34960 34952 34931 34985 34974 34942 34917 34983 34971 34989 34956 34976 34961 34934 34985 34942 34965 34989 34986 34975 34985 34932 34980 34987 34987 34981 34984 34987 34985 34963 34989 34953 34958 34975 34964 34927 34980 34969 34985 34944 34966 ...
result:
ok 200000 numbers
Test #7:
score: -100
Wrong Answer
time: 613ms
memory: 104660kb
input:
100000 5 200000 65145 22925 57683 48950 47 95014 89971 86419 68041 34514 54368 9070 62968 12058 2395 12953 52181 44707 15141 42970 42586 24500 7627 11589 2549 58411 97779 75300 26698 28015 65395 73656 93413 6314 67115 29279 47001 60377 25606 34502 91013 49546 42758 59346 59698 46487 44285 25907 1322...
output:
10900 1 22894 30657 9289 30701 30702 30701 30695 30695 30392 439 30491 30304 30696 30481 30355 30701 4108 0 30648 24531 0 6293 4639 8441 8856 30702 23474 30417 30634 8671 30702 30703 30703 30287 18522 8635 21217 0 30690 1205 30700 30684 13422 30680 5336 30459 6987 18437 3330 30686 20754 30702 30291 ...
result:
wrong answer 2nd numbers differ - expected: '0', found: '1'