ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#198211 | #2789. 极差 | tkswls | 100 | 7610ms | 90272kb | C++11 | 4.2kb | 2023-11-21 10:04:07 | 2023-11-21 14:07:32 |
answer
#include <bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const ll mod = 998244353;
struct node {
int l, r;
ll tag, sum;
};
int n, a[500005], re[500005], rre[500005];
ll ans;
struct nnode {
int name, num;
} c[500005];
struct XDT {
node b[2000006];
inline void update(int p) {
b[p].sum = (b[2 * p].sum + b[2 * p + 1].sum) % mod;
}
inline void push_down(int p) {
if (b[p].tag != 1) {
b[2 * p].sum = b[2 * p].sum * b[p].tag % mod;
b[2 * p].tag = b[2 * p].tag * b[p].tag % mod;
b[2 * p + 1].sum = b[2 * p + 1].sum * b[p].tag % mod;
b[2 * p + 1].tag = b[2 * p + 1].tag * b[p].tag % mod;
b[p].tag = 1;
}
}
inline void build(int p, int l, int r) {
b[p].l = l;
b[p].r = r;
b[p].tag = b[p].sum = 0;
b[p].tag = 1;
if (l == r) return;
build(2 * p, l, (l + r) >> 1);
build(2 * p + 1, ((l + r) >> 1) + 1, r);
}
inline void add(int p, int l, int r) {
if (l > r) return;
if (b[p].l >= l && b[p].r <= r) {
b[p].sum = b[p].sum * 2 % mod;
b[p].tag = b[p].tag * 2 % mod;
return;
}
push_down(p);
int mid = (b[p].l + b[p].r) >> 1;
if (r <= mid) add(2 * p, l, r);
else if (l > mid) add(2 * p + 1, l, r);
else {
add(2 * p, l, mid);
add(2 * p + 1, mid + 1, r);
}
update(p);
}
inline void change(int p, int q, int w) {
if (b[p].l == b[p].r) {
b[p].sum = b[p].sum * w % mod;
return;
}
push_down(p);
if (q <= (b[p].l + b[p].r) / 2) {
change(2 * p, q, w);
} else {
change(2 * p + 1, q, w);
}
update(p);
}
inline void init(int p, int q, int w) {
if (b[p].l == b[p].r) {
b[p].sum = w;
return;
}
push_down(p);
if (q <= (b[p].l + b[p].r) / 2) {
init(2 * p, q, w);
} else {
init(2 * p + 1, q, w);
}
update(p);
}
inline ll query(int p, int l, int r) {
if (l > r) return 0;
if (b[p].l >= l && b[p].r <= r) {
return b[p].sum;
}
push_down(p);
int mid = (b[p].l + b[p].r) >> 1;
if (r <= mid) return query(2 * p, l, r);
else if (l > mid) return query(2 * p + 1, l, r);
else {
return (query(2 * p, l, mid) + query(2 * p + 1, mid + 1, r)) % mod;
}
}
} l, r;
inline ll ksm(ll p, ll q) {
ll base = 1;
while (q) {
if (q & 1) base = base * p % mod;
q >>= 1;
p = p * p % mod;
}
return base;
}
bool comp1(nnode p, nnode q) {
return p.num < q.num;
}
bool comp2(nnode p, nnode q) {
return p.num > q.num;
}
inline int lowbit(int p) {
return p & -p;
}
int t[500005];
inline void add(int p, int q) {
while (p <= n) {
t[p] += q;
p += lowbit(p);
}
}
inline int query(int p) {
int cnt = 0;
while (p >= 1) {
cnt += t[p];
p -= lowbit(p);
}
return cnt;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
re[0] = 1;
rre[0] = 1;
for (int i = 1; i <= n; i++) {
re[i] = re[i - 1] * 2 % mod;
rre[i] = rre[i - 1] * 499122177 % mod;
}
for (int i = 1; i <= n; i++) {
cin >> a[i];
c[i] = nnode{i, a[i]};
}
l.build(1, 1, n), r.build(1, 1, n);
sort(c + 1, c + n + 1, comp1);
int u, v;
for (int i = 1; i <= n; i++) {
u = query(c[i].name - 1);
v = i - 1 - u;
r.add(1, c[i].name + 1, n);
l.add(1, 1, c[i].name - 1);
r.init(1, c[i].name, (n - c[i].name + 1)*re[u] % mod);
l.init(1, c[i].name, c[i].name * (re[v]) % mod);
add(c[i].name, 1);
ans += c[i].num * (r.query(1, c[i].name + 1, n) * rre[u + 1] % mod + r.query(1, c[i].name, c[i].name) * rre[u] % mod ) % mod * (l.query(1, 1, c[i].name - 1) * rre[v + 1] % mod + l.query(1, c[i].name, c[i].name) * rre[v] % mod ) % mod;
ans %= mod;
}
// cout << ans << "[]";
l.build(1, 1, n), r.build(1, 1, n);
memset(t, 0, sizeof(t));
sort(c + 1, c + n + 1, comp2);
for (int i = 1; i <= n; i++) {
u = query(c[i].name - 1);
v = i - 1 - u;
r.add(1, c[i].name + 1, n);
l.add(1, 1, c[i].name - 1);
r.init(1, c[i].name, (n - c[i].name + 1)*re[u] % mod);
l.init(1, c[i].name, c[i].name * (re[v]) % mod);
add(c[i].name, 1);
ans += mod - c[i].num * (r.query(1, c[i].name + 1, n) * rre[u + 1] % mod + r.query(1, c[i].name, c[i].name) * rre[u] % mod ) % mod * (l.query(1, 1, c[i].name - 1) * rre[v + 1] % mod + l.query(1, c[i].name, c[i].name) * rre[v] % mod ) % mod;
ans %= mod;
}
cout << ans;
}
这程序好像有点Bug,我给组数据试试?
Details
小提示:点击横条可展开更详细的信息
Test #1:
score: 10
Accepted
time: 2ms
memory: 5216kb
input:
10 822569775 140960465 675448100 378356373 881781963 632511858 517856306 355237516 318232566 701815470
output:
783495679
result:
ok "783495679"
Test #2:
score: 10
Accepted
time: 0ms
memory: 5216kb
input:
10 449281704 767368983 682106748 506365083 122199784 498808182 538569145 55437432 155268974 94445018
output:
68844302
result:
ok "68844302"
Test #3:
score: 10
Accepted
time: 0ms
memory: 5220kb
input:
10 591970549 421988862 413830573 240490034 164237038 902977274 59135052 95107365 250425253 324531999
output:
147766221
result:
ok "147766221"
Test #4:
score: 10
Accepted
time: 13ms
memory: 6436kb
input:
5000 646617726 824464102 323759947 246753612 585842690 504415490 14828815 693037963 801159103 946215...
output:
67443460
result:
ok "67443460"
Test #5:
score: 10
Accepted
time: 16ms
memory: 6440kb
input:
5000 654241726 72924489 266088677 295706937 963146543 634317920 182210355 549745450 893149778 174946...
output:
389625531
result:
ok "389625531"
Test #6:
score: 10
Accepted
time: 9ms
memory: 6436kb
input:
5000 38701861 203013652 438779672 247355223 112434120 403380796 731125167 338765345 868447685 883741...
output:
770908379
result:
ok "770908379"
Test #7:
score: 10
Accepted
time: 990ms
memory: 45804kb
input:
200000 695831669 804173945 82349222 653935161 167064728 232585930 988716260 695383039 585257840 3008...
output:
745841684
result:
ok "745841684"
Test #8:
score: 10
Accepted
time: 2299ms
memory: 90256kb
input:
500000 5 8 7 10 7 9 7 4 4 4 5 0 0 10 6 0 0 7 10 6 5 3 9 7 3 8 6 10 3 1 9 6 4 10 1 8 5 3 1 9 2 5 5 9 ...
output:
225099176
result:
ok "225099176"
Test #9:
score: 10
Accepted
time: 2263ms
memory: 90268kb
input:
500000 494353572 796134262 130578837 890308560 320968753 455636669 324898154 477464175 320403450 543...
output:
396578562
result:
ok "396578562"
Test #10:
score: 10
Accepted
time: 2018ms
memory: 90272kb
input:
500000 303781858 81904833 166578999 116580840 916556701 186538262 945202043 778425019 138280242 9981...
output:
394870719
result:
ok "394870719"
Extra Test:
score: 0
Extra Test Passed