#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#define LL long long
using namespace std;
const int N = 1e5+,mod=1e9+;
struct node{
int l,r;
mutable LL v;
node(int L,int R,LL V):l(L),r(R),v(V){}
inline bool operator < (const node& b)const{return l<b.l;}
};
set<node>s;
int n,m;
LL a[N],seed,vmax;
inline LL Rand(){
LL ret = seed;
seed = (seed* + )%mod;
return ret;
}
///快速幂
inline LL qpow(LL a,LL n,LL p){
LL ans=1LL;a%=p;
while(n){
if(n&)ans=ans*a%p;
a=a*a%p;
n>>=;
}
return ans;
}
typedef set<node>::iterator IT;
inline IT split(int pos){ ///把pos位置的区间分成左右两节
IT it = s.lower_bound(node(pos,pos,));
if(it!=s.end() && it->l==pos)return it; ///如果已经分好了 直接返回
///否则 我们找到这个区间的前一个区间 也就是l<pos 的区间
--it;
///将这个区间给分裂成 [l,pos-1]
///将这个区间给分裂成 [pos,r]
int l=it->l,r=it->r;LL v=it->v;
s.erase(it);
s.insert(node(l,pos-,v));
return s.insert(node(pos,r,v)).first;
}
///暴力区间加 直接把这个区间内的数全部+V
inline void add(int l,int r,LL v){
IT it1 = split(l),it2=split(r+);
for(;it1!=it2;++it1)it1->v+=v;
}
///区间赋值
inline void assigns(int l,int r,LL v){
///把区间断成[1-l-1] [l,r] [r+1,n]
IT it1 = split(l),it2=split(r+);
///清除[l,r]的多余的区间
s.erase(it1,it2);
///加入新赋值的区间
s.insert(node(l,r,v));
}
///区间第K大
inline void Rank(int l,int r,int k){
IT it1=split(l),it2=split(r+);
vector<pair<LL,int> >t;
for (;it1!=it2;++it1)t.push_back(pair<LL,int>(it1->v,it1->r - it1->l +));
sort(t.begin(),t.end());
LL ans=;
for (auto it : t){ ///便利类似容器的begin 到 end 可以直接用auto
if (k<=it.second){
ans=it.first;
break;
}else {
k-=it.second;
}
}
printf("%lld\n",ans);
}
inline void sum(int l,int r,int x,int p){
IT it1=split(l),it2=split(r+);
LL ans=;
for(;it1!=it2;++it1)ans=(ans+(LL)(it1->r - it1->l+)*qpow(it1->v,x,p))%p;
printf("%lld\n",ans);
}
int main(){
scanf("%d%d%lld%lld",&n,&m,&seed,&vmax);
for(int i=;i<=n;i++){
a[i]=Rand()%vmax+;
s.insert(node(i,i,a[i]));
}
s.insert(node(n+,n+,));
for(int i=;i<=m;i++){
int opt=Rand()%+;
int l=Rand()%n+;
int r=Rand()%n+;
if(l>r)swap(l,r);
int x=,y=;
if(opt==)x=Rand()%(r-l+)+;
else x=Rand()%vmax+;
if(opt==)y=Rand()%vmax+;
if(opt==)add(l,r,x);
else if (opt==)assigns(l,r,x);
else if (opt==)Rank(l,r,x);
else sum(l,r,x,y);
}
return ;
}

ODT 珂朵莉树 入门的更多相关文章

  1. [数据结构]ODT(珂朵莉树)实现及其应用,带图

    [数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段 ...

  2. ODT珂朵莉树

    关于ODT,据说是毒瘤lxl发明的,然后毒瘤鱼鱼因为我用ODT误导人D了我一回-- 这是一种基于 \(set\) 的暴力数据结构. 在使用时请注意,没看见这2东西千万别用-- 1.保证数据随机 2.有 ...

  3. 「学习笔记」珂朵莉树 ODT

    珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...

  4. [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解

    参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...

  5. 珂朵莉树(ODT)笔记

    珂朵莉树,又叫老司机树($Old\, Driver \, Tree$) 是一种暴力出奇迹,就怕数据不随机的数据结构. 适用 需要用线段树维护一些区间修改的信息…… 像是区间赋值(主要),区间加…… 原 ...

  6. 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...

  7. 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)

    传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...

  8. 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)

    传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...

  9. 洛谷P2082 区间覆盖(加强版)(珂朵莉树)

    传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...

随机推荐

  1. 2019.10.21 csp-s模拟测试81 反思总结

    T1: 把每一行状压,按行DP.设fi,j,k,i表示第几行,j是当前行的1覆盖状态,k是当前行选择按钮的状态.转移的时候枚举j和k,再枚举下一层的按钮选择情况l.如果l和j可以全覆盖当前层则转移合法 ...

  2. JSP-Cookie和Session

    1 会话技术简介 1.1 存储客户端状态 1.2 会话技术 2 Cookie技术 2.1 Cookie技术的购物 2.2 服务器端向客户端发Cookie //1.创建cookie对象 Cookie c ...

  3. linux挂载点 和 文件系统$ mount$ cat /etc/fstab$ vgs$ pvs$ lvs$ df -h$ lsof +D / /* beware not to kill your box */

    $ mount$ cat /etc/fstab$ vgs$ pvs$ lvs$ df -h$ lsof +D / /* beware not to kill your box */ 一共挂载了多少文件 ...

  4. webpack学习之—— Loaders

    loader 用于对模块的源代码进行转换.loader 可以使你在 import 或"加载"模块时预处理文件.因此,loader 类似于其他构建工具中“任务(task)”,并提供了 ...

  5. FPGA按键功能

    1.如何判断按键成功按下? 2.在什么时候采集数据? 按键在按下的过程中会产生大约2ms-3ms抖动,如果此时此刻采集数据来判断按键是不准确的,那么为了采集到准确的数据需要设置一个大约10ms左右的计 ...

  6. ecshop二次开发之视频上传

    1.前台展示效果: 2.后台展示效果: 3.代码实现: 后台实现过程: 1.在languages/zh_cn/admin/goods.PHP中插入 $_LANG['tab_video'] = '视频上 ...

  7. java路径中'/'的使用

    考虑java的跨系统:uinux和winw7中的‘/'标识方法不同,使用下放语句可避免 File.separator;//代表"/"

  8. Eight HDU-1043 (bfs)

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. Codeforces Round #416 (Div. 2) A. Vladik and Courtesy【思维/模拟】

    A. Vladik and Courtesy time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. [Vue CLI 3] 插件开发之 registerCommand 到底做了什么

    首先,我们看到在 package.json 中有 scripts 的定义: "scripts": { "serve": "vue-cli-servic ...