珂朵莉树模板题 WA 求调
查看原帖
珂朵莉树模板题 WA 求调
735713
Azure_F楼主2023/11/11 20:13

基本全是按照题解的命名和思路来写的,码风还算阳间。

样例都过不了,第 22 个样例 WA 了,求调 qwq。

// Problem: Willem, Chtholly and Seniorious
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF896C
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
#include<set>
#include<algorithm>
#include<vector>
#define int long long

const int MOD = 1e9 + 7;
const int N = 1e5 + 5;
int n, m, seed, vmax, a[N];

int rnd(){
	int ret = seed;
	seed = (seed * 7ll + 13) % MOD;
	return ret;
}

struct Node{
	int l, r;
	mutable int v;
	
	Node(int l, int r = 0, int v = 0): l(l), r(r), v(v) {};
	
	bool operator < (const Node &a) const{
		return l < a.l;
	} 
};

std::set<Node> s;

std::set<Node>::iterator split(int pos){
	std::set<Node>::iterator it = s.lower_bound(Node(pos));
	if(it != s.end() && it -> l == pos) return it;
	it--;
	if(it -> r < pos) return s.end();
	int l = it -> l, r = it -> r, v = it -> v;
	s.erase(it);
	s.insert(Node(l, pos - 1, v));
	
	return s.insert(Node(pos, r, v)).first;
}

void assign(int l, int r, int x){
	std::set<Node>::iterator itr = split(r + 1);
	std::set<Node>::iterator itl = split(l);
	s.erase(itl, itr);
	s.insert(Node(l, r, x));
}

void add(int l, int r, int x){
	std::set<Node>::iterator itr = split(r + 1);
	std::set<Node>::iterator itl = split(l);
	
	for(std::set<Node>::iterator it = itl; it != itr; ++it)
		it -> v += x;
}

struct rank{
	int num, cnt;
	
	bool operator < (const rank &a) const{
		return num < a.num;
	}
	
	rank(int num, int cnt): num(num), cnt(cnt){};
};

int get_rank(int l, int r, int x){
	std::set<Node>::iterator itr = split(r + 1);
	std::set<Node>::iterator itl = split(l);
	std::vector<rank> v;
	
	for(std::set<Node>::iterator it = itl; it != itr; ++it)
		v.push_back(rank(it -> v, it -> r - it -> l + 1));
	
	std::sort(v.begin(), v.end());
	int res = 0;
	for(; res < v.size(); ++res)
		if(v[res].cnt < x) x -= v[res].cnt;
		else break;
	
	return res;
}

int fpow(int x, int y, int p){
	int r = 1, base = x % p;
	while(y){
		if(y & 1) r = r * base % p;
		base = base * base % p;
		y >>= 1;
	}
	
	return r;
}

int get_power(int l, int r, int x, int y){
	std::set<Node>::iterator itr = split(r + 1);
	std::set<Node>::iterator itl = split(l);
	
	int ans = 0;
	for(std::set<Node>::iterator i = itl; i != itr; ++i)
		ans = (ans + fpow(i -> v, x, y) * (i -> r - i -> l + 1) % y);
	
	return ans;
}

signed main(){
	std::cin >> n >> m >> seed >> vmax;
	for(int i = 1; i <= n; ++i){
		a[i] = (rnd() % vmax) + 1;
		s.insert(Node(i, i, a[i]));
	}
	
	for(int i = 1; i <= m; ++i){
		int op = (rnd() % 4) + 1;
		int l = (rnd() % n) + 1;
		int r = (rnd() % n) + 1;
		int x = 0, y = 0;
		if(l > r) std::swap(l, r);
		if(op == 3) x = (rnd() % (r - l + 1)) + 1;
		else x = (rnd() % vmax) + 1;
		if(op == 4) y = (rnd() % vmax) + 1;
		
		switch(op){
			case 1: add(l, r, x); break;
			case 2: assign(l, r, x); break;
			case 3: std::cout << get_rank(l, r, x) << "\n"; break;
			case 4: std::cout << get_power(l, r, x, y) << "\n"; break;
			default: break;
		} 
	}
	
	return 0;
}
2023/11/11 20:13
加载中...