UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#197237#2385. 胜天半子tkswls1003252ms138004kbC++112.5kb2023-11-09 10:32:502023-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