T2 求 hack
  • 板块学术版
  • 楼主Tomwsc
  • 当前回复6
  • 已保存回复6
  • 发布时间2025/8/2 18:40
  • 上次更新2025/8/3 08:47:55
查看原帖
T2 求 hack
1418967
Tomwsc楼主2025/8/2 18:40

要 subtask 1 范围内的

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define inf (1ll << 62)
#define pb push_back
#define mp make_pair
#define PII pair<int , int>
#define fi first
#define se second
using namespace std;
const int mod = 998244353 , MAXN = 1e5 + 10;
vector<int>tree(MAXN << 2);

inline void pushup(int p) {
	tree[p] = tree[p << 1] + tree[p << 1 | 1];
	return;
}

void update(int l , int r , int x , int p) {
	if(l == r) {
		tree[p] ++;
		return;
	}
	int mid = (l + r) >> 1;
	if(x <= mid) update(l , mid , x , p << 1);
	else update(mid + 1 , r , x , p << 1 | 1);
	pushup(p);
	return;
}

int query(int l , int r , int x , int y , int p) {
	if(x <= l && r <= y) return tree[p];
	int mid = (l + r) >> 1 , ans = 0;
	if(x <= mid) ans += query(l , mid , x , y , p << 1);
	if(mid < y) ans += query(mid + 1 , r , x , y , p << 1 | 1);
	return ans;
}

inline void solve() {
	int n;
	cin >> n;
	vector<int>a(n) , b(n) , cnt(n);
	for(int i = 0;i < n;i ++) {
		cin >> a[i];
		b[i] = a[i];
	}
	sort(b.begin() , b.end());
	b.erase(unique(b.begin() , b.end()) , b.end());
	vector<ll>s(n + 1);
	for(int i = 0;i < n;i ++) {
		a[i] = lower_bound(b.begin() , b.end() , a[i]) - b.begin() + 1;
		if(query(0 , n , 0 , a[i] - 1 , 1) > 0)	cnt[i] = 1 , s[a[i]] ++;;
		update(0 , n , a[i] , 1);
	}
	for(int i = 1;i <= b.size();i ++) s[i] += s[i - 1];
	ll ans = 1;
	for(int i = 0;i < n;i ++) ans = (ans * (cnt[i] + 1)) % mod;
	for(ll i = 2;i <= b.size();i ++) {
		ll x = query(0 , n , i , i , 1);
		if(x == 1) continue;
		ans = (ans + mod - ((1 << x) - x - 1) % mod * (1 << s[i - 1]) % mod * (1 << (s[b.size()] - s[i])) % mod) % mod;
	}
	cout << ans << "\n";
	return;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t = 1;
	// cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
2025/8/2 18:40
加载中...