题意简述

维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和

数据随机

题解思路

ODT是一种基于std::set的暴力数据结构。

每个节点对应一段区间,该区间内的数都相等。

核心操作split可以将节点拆开,修改需要的部分。

每个操作都split(r+1),split(l),再遍历其中所有区间,修改或求值。

至于时间复杂度,由assign保证

代码

#include <set>
#include <vector>
#include <utility>
#include <iostream>
#include <algorithm>
#define IT set<Node>::iterator
typedef long long ll;
using std::set; using std::vector; using std::pair;
int n,m,seed,vmax,op,l,r,x,y;
struct Node {
int l,r;
mutable ll v;
Node(int L,int R,ll V):l(L),r(R),v(V) {}
bool operator<(const Node& x) const { return l<x.l; }
};
set<Node> s;
inline int rnd() { int ret=seed; seed=(seed*7ll+13)%1000000007; return ret; }
inline int _pow(ll x,int y,const int& p,int s=1) {
x%=p; for (;y;y>>=1,x=(ll)x*x%p) if (y&1) s=(ll)s*x%p; return s;
}
inline IT split(const int& pos) {
IT it=s.lower_bound(Node(pos,0,0));
if (it!=s.end()&&it->l==pos) return it;
--it; int L=it->l,R=it->r; ll V=it->v; s.erase(it);
s.insert(Node(L,pos-1,V));
return s.insert(Node(pos,R,V)).first;
}
inline void assign(const int& l,const int& r,const int& va) {
IT itr=split(r+1),itl=split(l); s.erase(itl,itr); s.insert(Node(l,r,va));
}
inline void add(const int& l,const int& r,const int& va) {
for (IT itr=split(r+1),itl=split(l);itl!=itr;++itl) itl->v+=va;
}
inline ll q_kth(const int& l,const int& r,int k) {
vector<pair<ll,int> > vec;
for (IT itr=split(r+1),itl=split(l);itl!=itr;++itl) vec.push_back(pair<ll,int>(itl->v,itl->r-itl->l+1));
std::sort(vec.begin(),vec.end());
for (vector<pair<ll,int> >::iterator it=vec.begin();it!=vec.end();++it) {
k-=it->second; if (k<=0) return it->first;
}
return -1;
}
inline int q_pwsm(const int& l,const int& r,const int& x,const int& y,int res=0) {
for (IT itr=split(r+1),itl=split(l);itl!=itr;++itl) res=(res+1ll*_pow(itl->v,x,y)*(itl->r-itl->l+1))%y;
return res;
}
int main() {
std::ios::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0);
std::cin>>n>>m>>seed>>vmax;
for (register int i=1;i<=n;++i) s.insert(Node(i,i,rnd()%vmax+1));
for (register int i=1;i<=m;++i) {
op=rnd()%4+1; l=rnd()%n+1; r=rnd()%n+1; if (l>r) std::swap(l,r);
if (op==3) x=rnd()%(r-l+1)+1; else x=rnd()%vmax+1;
if (op==4) y=rnd()%vmax+1;
if (op==1) add(l,r,x);
else if (op==2) assign(l,r,x);
else if (op==3) std::cout<<q_kth(l,r,x)<<'\n';
else std::cout<<q_pwsm(l,r,x,y)<<'\n';
}
}

【模板】珂朵莉树(ODT)(Codeforces 896C Willem, Chtholly and Seniorious)的更多相关文章

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

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

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

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

  3. 珂朵莉树(ODT)笔记

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

  4. Chtholly Tree (珂朵莉树) ODT

    ODT,OldDriverTree,又名ChthollyTree" role="presentation" style="position: relative; ...

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

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

  6. 题解 P3372 【【模板】线段树 1】(珂朵莉树解法)

    这道题可以用珂朵莉树做,但是由于数据比较不随机,而我也没有手写一颗平衡树,所以就被卡掉了,只拿了70分. 珂朵莉树是一种基于平衡树的(伪)高效数据结构. 它的核心操作是推平一段区间. 简而言之,就是把 ...

  7. 『珂朵莉树 Old Driver Tree』

    珂朵莉树 珂朵莉树其实不是树,只是一个借助平衡树实现的数据结构,主要是对于有区间赋值的数据结构题,可以用很暴力的代码很高效地完成任务,当然这是建立在数据随机的基础上的. 即使数据不是随机的,写一个珂朵 ...

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

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

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

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

随机推荐

  1. WebGL2系列之多采样渲染缓冲对象

    在很久很久以前,盘古开辟了天地,他的头顶着天,脚踩着地,最后他挂了.他的毛发变成了森林,他的血液变成了河流,他的肌肉变成了大地......卡! 哦,不对,在很久很久以前,你属于我,我拥有你.你还有没有 ...

  2. windows7(win7)64/32位激活工具

    win7激活工具中文绿色免费版是改自binbin的作品,我们修改的windows7激活工具grldr模拟激活是别人的东西,能激活win7旗舰.原作者是binbin,其他的激活工具都是基于grldr模拟 ...

  3. set.contains()分析

    先看一段代码 Set s = new HashSet(); List<String> list = new ArrayList<>(); list.add("a&qu ...

  4. AKKA 集群中的发布与订阅Distributed Publish Subscribe in Cluster

    Distributed Publish Subscribe in Cluster 基本定义 在单机环境下订阅与发布是很常用的,然而在集群环境是比较麻烦和不好实现的: AKKA已经提供了相应的实现,集群 ...

  5. 【CYH-02】NOIp考砸后虐题赛:成绩:题解

    这道题挺送水了吧... 两种做法. 其实空间都不需要那么大,我来提交界面一看一堆MLE的,于是还是良心的放开了时限. 这么简单,就不做解释了. 下面放出几种代码. 代码: 两个数组: #include ...

  6. springboot基础(随笔)

    <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...

  7. 【HDOJ】2104 hide handkerchief

    Problem Description The Children’s Day has passed for some days .Has you remembered something happen ...

  8. 小白开学Asp.Net Core《二》

    小白开学Asp.Net Core<二> ——数据仓储层(Repositroy) 一.历史现象 在后端开发中,数据库操作是最频繁的,每一个开发人员都会接触,甚至不少开发人员每天的工作就是与数 ...

  9. 我狠起来连自己都打---如何简单实现Azure resource自动打标签

    你是否还在为花费大量Azure Resource打标签而烦恼呢?你是否还在因为这样低效的重复劳动而痛苦呢? 在很长一段时间内,笔者既要做云架构调整,又要做日常系统维护,还要参与各种各样的项目,在这种情 ...

  10. 《VR入门系列教程》之9---谷歌纸盒

    谷歌纸盒---基于智能手机的廉价VR眼镜     如果用汽车来做类比,Oculus Rift和GearVR就是特斯拉和兰博基尼,它们物美但是价不廉.要是主机性能不好,那么几百美元的Oculus眼镜就是 ...