关于珂朵莉树
查看原帖
关于珂朵莉树
252549
Iwara楼主2024/1/23 21:34

RT

#include<bits/stdc++.h>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
const ll MAXN=1e5+5,MOD=1e9+7;
ll n,m;
ll seed,vmax;
ll ret;
ll op,_l,_r,_x,_y;
ll rnd(){
	ret=seed;
	seed=(seed*7+13)%MOD;
	return ret;
}
ll a[MAXN];
struct col_t{
	ll l,r;
	mutable ll v;
	bool operator < (const col_t &oth)const{
		l<oth.l;
	}
};
set<col_t> tree;
auto split(ll num){
	cout<<"num: "<<num<<endl;
	if(num>n)return tree.end();
	set<col_t>::iterator it = --tree.upper_bound((col_t){num,0,0});
	for(auto itt:tree)cout<<itt.l<<" "<<itt.r<<" debug"<<endl;
	if(it==tree.end())cout<<"?"<<endl;//here 
	if(it->l == num)return it;
	ll now_l = it->l,now_r = it->r,now_v = it->v;
	cout<<now_l<<" "<<now_r<<" "<<now_v<<endl;
	tree.erase(it);
	tree.insert((col_t){now_l,num-1,now_v});
	return tree.insert((col_t){num,now_r,now_v}).first;
}
void assign(ll l,ll r,ll k){
	cout<<l<<" - "<<r<<endl;
	auto it_r=split(r+1),it_l=split(l);
	tree.erase(it_l,it_r);
	tree.insert((col_t){l,r,k});
	return;
}
void add(ll l,ll r,ll k){
	auto it_r=split(r+1),it_l=split(l);
	for(;it_l!=it_r;++it_l)it_l->v +=k;
	return;
}
struct Rank{
	ll val,sz;
	bool operator < (const Rank &oth)const{
		return val<oth.val;
	}
};
ll rk(ll l,ll r,ll k){
	auto it_r=split(r+1),it_l=split(l);
	vector<Rank> vec;
	for(;it_l!=it_r;++it_l)vec.push_back((Rank){it_l->v,it_l->r - it_l->l + 1});
	sort(vec.begin(),vec.end());
	int i=0;
	for(i=0;i<vec.size();i++){
		if(vec[i].sz<k)k-=vec[i].sz;
		else break;
	}
	return vec[i].val;
}
ll fpow(ll x,ll y,ll p){
	ll ans=1;
	while(y){
		if(y&1)ans=ans*x%p;
		x=x*x%p;
		y>>=1;
	}
	return ans;
}
ll query(ll l,ll r,ll k,ll p){
	auto it_r=split(r+1),it_l=split(l);
	ll ans=0;
	for(;it_l!=it_r;++it_l){
		ans=(ans+(it_l->r-it_l->l+1)*fpow(it_l->v,k,p)%p)%p;
		cout<<"L"<<endl;
	}
	cout<<"???"<<endl;
	return ans;
}
int main(){
	cin>>n>>m>>seed>>vmax;
	for(int i=1;i<=n;i++)a[i]=(rnd()%vmax)+1;
	tree.clear();
	for(int i=1;i<=n;i++)tree.insert((col_t){i,i,a[i]});
	for(int i=1;i<=m;i++){
		op=rnd()%4+1;
		_l=rnd()%n+1;
		_r=rnd()%n+1;
		if(_l>_r)swap(_l,_r);
		if(op==3)_x=rnd()%(_r-_l+1)+1;
		else _x=rnd()%vmax+1;
		if(op==4)_y=rnd()%vmax+1;
		
		cout<<op<<" "<<_l<<" "<<_r<<" "<<_x<<" "<<_y<<endl;
		if(op==1)add(_l,_r,_x);
		else if(op==2)assign(_l,_r,_x);
		else if(op==3)cout<<rk(_l,_r,_x)<<'\n';
		else cout<<query(_l,_r,_x,_y)<<'\n';
	}
	return 0;
}

这份代码在样例一中第一个操作输出了?(代码第30行),但是它为什么会这样呢?

为什么二分会出错呢?

2024/1/23 21:34
加载中...