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< ...
随机推荐
- div代码大全 DIV代码使用说明
一.DIV代码语法 - TOP DIV代码是放入小于与大于符号内,即“<div>”. DIV是一对闭合标签,即“”开始,“结束”的盒子标签. 语法结构: <div>我是内容&l ...
- IIS 配置问题
1 IIS错误需要重新运行配置 重新注册.netframework. 解决方式:cmd C:\Windows\Microsoft.NET\Framework\v4.0.30319 aspnet_r ...
- Django项目:CRM(客户关系管理系统)--04--02PerfectCRM创建ADMIN页面02
十.CRM项目创建模板页面 {#king_base.html#} {## ————————02PerfectCRM创建ADMIN页面————————#} {#模板文件 king_base.html#} ...
- Python学习笔记(一)初识Python以及安装Python
一.Python简介 1.Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的. Python 本身也是由诸多 ...
- elipse egit的使用
- uni-app官方教程学习手记
本人微信公众号:前端修炼之路,欢迎关注 背景介绍 大概在今年的十月份左右,我了解到Dcloud推出了uni-app.当时下载了一个Hbuilder X,下载了官方提供的hello示例教程.经过一番努力 ...
- C++ 之手写strcpy
char *strcpy(char* strDest, const char*strSrc){ assert(strDest != NULL&&strSrc != NULL); cha ...
- 2019-10-18-dotnet-修复找不到-System.ServiceProcess-定义
title author date CreateTime categories dotnet 修复找不到 System.ServiceProcess 定义 lindexi 2019-10-18 21: ...
- 【心有猛虎】react-pxq
这是一个比较完整的简单的react移动端项目,说起来页面少,其实,构思若是精巧,也并不容易做 先放源码:https://github.com/bailicangdu/react-pxq 接下来我们简单 ...
- $.ajax中contentType: “application/json” 的用法
不使用contentType: “application/json”则data可以是对象 $.ajax({ url: actionurl, type: "POST", datTyp ...