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< ...
随机推荐
- ckfinder图片上传成功,但无法打开This image failed to load.
原因是basedir和baseurl的问题 本地调试的时候 可以用 这种方式实现,但是部署到线上,就有问题
- java list转换json格式
/** * 处理返回值(转换json格式和补零) * * @param resultDto5List * @param dateList * @return */ private JSONObject ...
- 学习JDK1.8集合源码之--ArrayDeque
1. ArrayDeque简介 ArrayDeque是基于数组实现的一种双端队列,既可以当成普通的队列用(先进先出),也可以当成栈来用(后进先出),故ArrayDeque完全可以代替Stack,Arr ...
- 集训队日常训练20180525-DIV2
A.2295 求有多少素数对和等于n. 暴力. #include <bits/stdc++.h> using namespace std; int ss(int n) { ,a=sqrt( ...
- NOIP模拟题17.9.26
B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...
- CF1132G
听说,一个好的Oier都是题目喂出来的. 题目 定义一个序列的最长贪心严格上升子序列为:若选出的子序列为 \(a\),对于其中相邻两项 \(i,j\),不存在 b\(i<k<j\),满足在 ...
- 微信网页授权demo1
要授权首先要网页域名授权 然后就index.php代码如下 <?php require_once("./function.php"); $url = 'http://'.$_ ...
- ListView设置的点点滴滴
去掉ListView的分界线 1. ListView的属性Divider设为#FFCC00 这种对任何背景都适用 2. 把ListView的属性Divider设为和背景一样的颜色 3.and ...
- 一个不错的插件(软件).NET开发
http://www.gcpowertools.com.cn/products/default.htm 葡萄城 先记录一下!
- This Product is covered by one or more of the folloWing patents
借用一下网络图片,作为描述: 原因: 启动方式使用了网络启动, 解决方案: 进入bios,修改启动方式,禁用网卡驱动,使用从硬盘启动或者从U盘启动即可.