ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#197237 | #2385. 胜天半子 | tkswls | 100 | 3252ms | 138004kb | C++11 | 2.5kb | 2023-11-09 10:32:50 | 2023-11-09 12:03:23 |
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
struct node {
int l, r, sum, tag = 1;
};
inline int ksm(int p, int q = mod - 2) {
int base = 1;
while (q) {
if (q & 1)base = base * p % mod;
q >>= 1;
p = p * p % mod;
}
return base;
}
const int inv = ksm(2);
struct XDT {
node b[2000006];
inline void update(int p) {
b[p].sum = b[2 * p].sum + b[2 * p + 1].sum;
b[p].sum %= mod;
}
inline void push_down(int p) {
if (b[p].tag != 1) {
b[2 * p].tag *= b[p].tag;
b[2 * p + 1].tag *= b[p].tag;
b[2 * p].sum *= b[p].tag;
b[2 * p + 1].sum *= b[p].tag;
b[2 * p].tag %= mod;
b[2 * p + 1].tag %= mod;
b[2 * p].sum %= mod;
b[2 * p + 1].sum %= mod;
b[p].tag = 1;
}
}
void build(int p, int l, int r) {
b[p].l = l, b[p].r = r;
b[p].tag = 1;
if (l == r) {
b[p].sum = 1;
return;
}
build(2 * p, l, (l + r) >> 1);
build(2 * p + 1, ((l + r) >> 1) + 1, r);
update(p);
}
inline void change(int p, int l, int r, int w) {
if (b[p].l >= l && b[p].r <= r) {
b[p].tag = b[p].tag * w % mod;
b[p].sum = b[p].sum * w % mod;
return;
}
push_down(p);
int mid = (b[p].l + b[p].r) >> 1;
if (r <= mid) change(2 * p, l, r, w);
else if (l > mid) change(2 * p + 1, l, r, w);
else {
change(2 * p, l, mid, w);
change(2 * p + 1, mid + 1, r, w);
}
update(p);
}
inline int query(int p, int l, int r) {
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;
}
}
} s, t;
int n, m, a[500005], ans;
struct nnode {
int name, num;
} b[500005];
bool cmp(nnode p, nnode q) {
return p.num > q.num;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i].name = i;
b[i].num = a[i];
}
sort(b + 1, b + n + 1, cmp);
s.build(1, 1, n), t.build(1, 1, n);
int u, v;
for (int i = 1; i <= n; i++) {
u = s.query(1, 1, b[i].name) * ksm(s.query(1, b[i].name, b[i].name)) % mod;
v = t.query(1, b[i].name, n) * ksm(t.query(1, b[i].name, b[i].name)) % mod;
ans += u * v % mod * b[i].num % mod;
s.change(1, 1, b[i].name, inv);
t.change(1, b[i].name, n, inv);
ans %= mod;
}
ans = ans * inv % mod;
cout << ans;
}
Details
小提示:点击横条可展开更详细的信息
Test #1:
score: 10
Accepted
time: 3ms
memory: 126292kb
input:
10 391025536 534111809 87391850 717213748 549806037 146679483 332329431 354719733 915413648 936262795
output:
313455611
result:
ok 1 number(s): "313455611"
Test #2:
score: 10
Accepted
time: 4ms
memory: 126292kb
input:
100 954759219 905502779 807519582 781552230 758309007 723757145 711489415 654050518 652846076 637356...
output:
769415708
result:
ok 1 number(s): "769415708"
Test #3:
score: 10
Accepted
time: 0ms
memory: 126292kb
input:
100 988968776 972536122 956739770 952203362 941180364 928023078 862509294 840037070 811395553 739326...
output:
24673783
result:
ok 1 number(s): "24673783"
Test #4:
score: 10
Accepted
time: 8ms
memory: 126412kb
input:
5000 999055700 997981714 997127741 996687146 996645302 994183022 993839721 993577550 993132750 99218...
output:
240553746
result:
ok 1 number(s): "240553746"
Test #5:
score: 10
Accepted
time: 12ms
memory: 126412kb
input:
5000 999402420 999383899 998043142 998036168 996714542 995854467 994013899 993583353 993133300 99280...
output:
725794147
result:
ok 1 number(s): "725794147"
Test #6:
score: 10
Accepted
time: 175ms
memory: 128636kb
input:
100000 999983033 999969215 999939917 999913875 999878133 999851751 999832454 999754907 999722070 999...
output:
211792036
result:
ok 1 number(s): "211792036"
Test #7:
score: 10
Accepted
time: 174ms
memory: 128640kb
input:
100000 999931068 999770813 999721486 999719350 999707892 999696269 999667058 999642633 999639736 999...
output:
563213385
result:
ok 1 number(s): "563213385"
Test #8:
score: 10
Accepted
time: 935ms
memory: 137992kb
input:
500000 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 1...
output:
602574492
result:
ok 1 number(s): "602574492"
Test #9:
score: 10
Accepted
time: 913ms
memory: 137996kb
input:
500000 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 1...
output:
979709968
result:
ok 1 number(s): "979709968"
Test #10:
score: 10
Accepted
time: 1028ms
memory: 138004kb
input:
500000 999993657 999990841 999983142 999963508 999960723 999954634 999948225 999943432 999930307 999...
output:
499135918
result:
ok 1 number(s): "499135918"
Extra Test:
score: 0
Extra Test Passed