ODT 珂朵莉树 入门
#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 珂朵莉树 入门的更多相关文章
- [数据结构]ODT(珂朵莉树)实现及其应用,带图
[数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段 ...
- ODT珂朵莉树
关于ODT,据说是毒瘤lxl发明的,然后毒瘤鱼鱼因为我用ODT误导人D了我一回-- 这是一种基于 \(set\) 的暴力数据结构. 在使用时请注意,没看见这2东西千万别用-- 1.保证数据随机 2.有 ...
- 「学习笔记」珂朵莉树 ODT
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...
- [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...
- 珂朵莉树(ODT)笔记
珂朵莉树,又叫老司机树($Old\, Driver \, Tree$) 是一种暴力出奇迹,就怕数据不随机的数据结构. 适用 需要用线段树维护一些区间修改的信息…… 像是区间赋值(主要),区间加…… 原 ...
- 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...
- 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...
- 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...
- 洛谷P2082 区间覆盖(加强版)(珂朵莉树)
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...
随机推荐
- 字符串无法分割 split无效: java split()使用“.” “\” "|" "*" "+"要转义
.是特殊字符 特殊字符需要转义. 改成split(“\\.”)
- Angular.js的自定义功能
1,自定义指令,在html中输入标签显示想要的指令 html script部分 2,标签中的属性的 有属性值时可以通过函数的参数返回属性值 没有属性值时可以设置属性值(自定义属性值) html部分 ...
- 门诊叫号系统系列-1.语音叫号 .net c#
最近收到一个需求,朋友诊室需要做到门诊叫号,流程如下:病人选择医生-刷身份证排队-医生点击病人姓名叫号. 经过团队的努力,一个简易的门诊叫号系统已经完成.现在把各个功能记录下来,方便以后查看. 1.语 ...
- 你知道forEach和each的区别吗?
要知道forEach和each的区别,你必须明白一点:forEach是js中的方法(针对数组),而each是jquery中的方法(针对jquery对象,即$( ) ).知道这一点,接下来我分别给举 ...
- pip list报错:DEPRECATION: The default format will switch to columns in the future.
一.现象: pip list 显示出以下错误: DEPRECATION: The default format will switch to columns in the future. Yo ...
- 【python之路14】发送邮件实例
1.发邮件的代码 from email.mime.text import MIMEText from email.utils import formataddr import smtplib msg ...
- Least Common Multiple (最小公倍数,先除再乘)
思路: 求第一个和第二个元素的最小公倍数,然后拿求得的最小公倍数和第三个元素求最小公倍数,继续下去,直到没有元素 注意:通过最大公约数求最小公倍数的时候,先除再乘,避免溢出 #include ...
- 【水滴石穿】react-native-app
项目地址:https://github.com/WQone/react-native-app 这个是一个非常优秀的小姐姐写的,希望大家能够以她为榜样,一起加油进步呀- 先看效果 分析package.j ...
- PHP原生DOM对象操作XML的方法解答
创建一个新的XML文件,并且写入一些数据到这个XML文件中. /** 创建xml文件*/ $info = array(array('obj' => 'power','info' => 'p ...
- LintCode_69 二叉树前序遍历
题目 给出一棵二叉树,返回其节点值的前序遍历. 和中序遍历基本相同 C++代码 vector<int> preorderTraversal(TreeNode *root) { // wri ...