UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#198211#2789. 极差tkswls1007610ms90272kbC++114.2kb2023-11-21 10:04:072023-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