ODT 板子 WA #6 求调(悬关)
  • 板块灌水区
  • 楼主cjWYZtql
  • 当前回复6
  • 已保存回复7
  • 发布时间2024/8/6 09:12
  • 上次更新2024/8/6 10:18:38
查看原帖
ODT 板子 WA #6 求调(悬关)
335771
cjWYZtql楼主2024/8/6 09:12

Rt.板子是 cf896c.

似乎是因为操作 4 int overflow,但是取模了啊

#include "bits/stdc++.h"
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define ull unsigned long long
#define OPEN freopen ("structure.in", "r", stdin); freopen ("structure.out", "w", stdout);
#define pc __builtin_popcount
#define db double
#define pii pair<int, int>
#define fi first
#define se second
#define F(i,x,y) for (int i = (x); i <= (y); ++i)
#define D(i,x,y) for (int i = (x); i >= (y); --i)
#define lttm iterator
#define fp iterator
int n, m; ll seed, vmx;
 
ll a[140000];
 
ll rng() {
	ll ret = seed;
	seed = (seed * 7ll + 13ll) % mod;
	return ret;
}
 
struct Chthollytree {
	int l, r;
	mutable ll x;
	bool operator <(const Chthollytree& p) const {
		if (l == p.l) return r < p.r;
		return l < p.l;
	}
};
 
bool cmp (Chthollytree a1, Chthollytree a2) {
	return a1.x < a2.x;
}
 
set<Chthollytree> s;
 
void Build () {
	Chthollytree now;
	
	F(i, 1, n) {
		if (a[i] == a[i - 1]) {
			now.r = i;
		} else {
			if (i != 1) s.insert(now);
			now.l = now.r = i;
			now.x = a[i];
		}
	}
	s.insert(now);
}
 
set <Chthollytree> :: fp Split (int x) {
	set <Chthollytree> :: lttm it = s.lower_bound({x, 0, 0ll});
	if (it != s.end() && it -> l == x) return it;
	-- it;
	if (it -> r < x) return s.end();
	set <Chthollytree> :: fp res = s.insert({x, it -> r, it -> x}).first;
	s.insert({it -> l, x - 1, it -> x}).first;
    s.erase(it);
    return res;
	
}
 
void assign (int l, int r, ll x) {
	set <Chthollytree> :: fp itl, itr;
	itr = Split(r + 1); itl = Split(l);
	s.erase(itl, itr); s.insert({l, r, x});
}
 
void add (int l, int r, ll v) {
	set <Chthollytree> :: fp itl, itr;
	itr = Split(r + 1); itl = Split(l);
	for (set <Chthollytree> :: lttm it = itl; it != itr; ++ it) {
		it->x += v;
	}
}
 
ll Querykth (int l, int r, int k) {
	vector<Chthollytree> v;
	for (set <Chthollytree> :: lttm it = s.begin(); it != s.end(); ++ it) {
		int _l = it -> l, _r = it -> r;ll _x = it -> x;
		if (l <= _l && _r <= r) v.push_back({_l, _r, _x});
		else if (_l <= l && r <= _r) v.push_back({l, r, _x});
		else if (_l < l && l <= _r) v.push_back({l, _r, _x});
		else if (r < _r && _l <= r) v.push_back({_l, r, _x});
	}
	sort (v.begin(), v.end(), cmp);
	
	int qwq = 0;
	
	for (auto i : v) {
		qwq += (i.r - i.l + 1);;
		if (qwq >= k) {
			return i.x;
		}
	}
}
 
ll qpow(ll x, ll y, ll p) {
	if (y == 0ll) return 1ll;
	ll qwq = qpow(x, y >> 1ll, p) % p;
	if (y % 2ll) return ((qwq * qwq % p) * x) % p;
	else return qwq * qwq % p;
}
 
ll Getsum (int l, int r, ll w, ll p) {
	vector<Chthollytree> v;
	for (set <Chthollytree> :: fp it = s.begin(); it != s.end(); ++ it) {
		int _l = it -> l, _r = it -> r;ll x = it -> x;
		if (l <= _l && _r <= r) v.push_back({_l, _r, x});
		else if (_l <= l && r <= _r) v.push_back({l, r, x});
		else if (_l < l && l <= _r) v.push_back({l, _r, x});
		else if (r < _r && _l <= r) v.push_back({_l, r, x});
	}
	ll res = 0ll;
	for (auto i : v) {;
		res += (1ll * (i.r - i.l + 1)) * qpow(i.x, w, p) % p;
		res %= p;
	}
	return res;
}
 
int main() {
	cin >> n >> m >> seed >> vmx;
	
	F(i, 1, n) a[i] = rng() % vmx + 1;
	
	// F(i, 1, n) cerr << a[i] << ' '; cerr << '\n';
	Build();
	F(i, 1, m) {
		// cerr << i << ' ' << (double) clock() / CLOCKS_PER_SEC << '\n';
		int op = rng() % 4 + 1;
		int L = rng() % n + 1; int R = rng() % n + 1;
		if (L > R) swap(L, R);
		int k; ll x, p;
		if (op == 3) k = rng() % (R - L + 1) + 1;
		else x = rng() % vmx + 1;
		
		if (op == 4) p = rng() % vmx + 1;
		if (op == 1) add(L, R, x);
		else if (op == 2) assign(L, R, x);
		else if (op == 3) cout << Querykth(L, R, k) << '\n';
		else cout << Getsum(L, R, x, p) << '\n';
	}
}
2024/8/6 09:12
加载中...