珂朵莉树
珂朵莉树,说白了是高级的暴力。
它维护的是区间,底层是平衡树。
就是让平衡树去维护区间,同时维护我们所需要的变量。
当需要进行区间修改时,我们将若干个区间取出,将[l,r]之内及边界处的区间删除.
在边界处的区间需要用一个操作:split去将一个大区间分裂,然后造出来两个小区间,接着方便操作。
然后其他操作就几乎是暴力了,将一段区间拿出来,总体操作,然后返回。
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define qr qr()
#define pa pair<ll,int>
#define ve vector
#define fi first
#define se second
#define es erase
#define itt set<nd>::iterator
using namespace std;
const int N=2e5+200,mod=1e9+7;
inline ll qr{
ll x=0;char ch=getchar();
while(ch>57||ch<48)ch=getchar();
while(ch>=48&&ch<=57)x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
struct nd{
mutable int l,r;
mutable ll v;
bool operator<(const nd &a)const{
return l<a.l;
}
};
ll n,m,seed;int vmax;
set<nd>s;
inline auto split(int pos){
auto it=s.lower_bound({pos});
if(it!=s.end()&&it->l==pos)return it;
--it;
if(it->r<pos)return s.end();//如果lowerbound左侧节点右界<pos,则可以发现没有该区间,因为等于在前面判过了.
int r=it->r;ll v=it->v;
// s.erase(it);
it->r=pos-1;//这里也是优化,少删一个区间.
// s.insert({l,pos-1,v});
return s.insert({pos,r,v}).fi;
}
inline void add(ll l,ll r,ll x){
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;++it)it->v+=x;
}
//inline void assign(int l,int r,ll x){
// auto itr=split(r+1),itl=split(l);
// s.erase(itl,itr);
// s.insert({l,r,x});
//}
void assign(int l,int r,int val){//优化版,少删一个区间.
auto itr=split(r+1),itl=split(l);
itl->r=r,itl->v=val;
t.erase(++itl,itr);
}
inline ll kth(ll l,ll r,ll x){
auto itr=split(r+1),itl=split(l);
ve<pa>v;
for(auto it=itl;it!=itr;++it)v.push_back({it->v,it->r-it->l+1});
sort(v.begin(), v.end());
unsigned int i;
for(i=0;i<v.size();++i){
if(v[i].se<x)x-=v[i].se;
else break;
}return v[i].fi;
}
inline ll qp(ll x,ll y,ll p){
ll r=1;x%=p;
while(y){
if(y&1)r=x*r%p;
x=x*x%p;
y>>=1;
}return r;
}
inline ll calP(ll l,ll r,ll x,ll y){
auto itr=split(r+1),itl=split(l);
ll ans=0;
for(auto it=itl;it!=itr;++it)
ans=(ans+qp(it->v,x,y)*(it->r-it->l+1))%y;
return ans;
}
inline int rd(){
int ret=seed;
seed=(seed*7+13)%mod;
return ret;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
n=qr,m=qr,seed=qr,vmax=qr;
for(int i=1;i<=n;++i)
s.insert({i,i,rd()%vmax+1});
for(int i=1;i<=m;++i){
ll op=rd()%4+1,l=rd()%n+1,r=rd()%n+1,x,y;
if(l>r)swap(l,r);
if(op==3)x=rd()%(r-l+1)+1;
else x=rd()%vmax+1;
if(op==4)y=rd()%vmax+1;
if(op==1)add(l,r,x);
else if(op==2)assign(l,r,x);
else if(op==3)cout<<kth(l,r,x)<<'\n';
else cout<<calP(l,r,x,y)<<'\n';
}
return 0;
}
https://www.cnblogs.com/shining-like-stars
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现