https://www.cnblogs.com/WAMonster/p/10181214.html

主要用于支持含有较难维护的区间操作与查询的问题,要求其中区间赋值操作(assign())是纯随机的。

注意要先split(r+1)再split(l),最好最后设一个点(n+1,n+1,0)

 #include<set>
#include<cstdio>
#include<algorithm>
#include<iostream>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,m,x,y,mx; ll seed;
struct P{ int l,r; mutable ll v; };
bool operator <(const P &a,const P &b){ return a.l<b.l; }
set<P>S;
typedef set<P>::iterator sit;
pair<ll,int>ve[N]; ll ksm(ll a,ll b,ll mod){
ll res=; a%=mod;
for (; b; a=a*a%mod,b>>=)
if (b & ) res=res*a%mod;
return res;
} sit split(int pos){
sit it=S.lower_bound((P){pos,,});
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((P){l,pos-,v});
return S.insert((P){pos,r,v}).first;
} void assign(int l,int r,ll v){
sit it2=split(r+),it1=split(l);
S.erase(it1,it2); S.insert((P){l,r,v});
} void add(int l,int r,ll v){
sit it2=split(r+),it1=split(l);
for (sit it=it1; it!=it2; it++) it->v+=v;
} ll kth(int l,int r,int k){
sit it2=split(r+),it1=split(l); int tot=;
for (sit it=it1; it!=it2; it++) ve[++tot]=pair<ll,int>(it->v,(it->r)-(it->l)+);
sort(ve+,ve+tot+);
rep(i,,tot){
k-=ve[i].second;
if (k<=) return ve[i].first;
}
return ;
} ll que(int l,int r,int x,ll y){
sit it2=split(r+),it1=split(l);
ll res=;
for (sit it=it1; it!=it2; it++) res=(res+((it->r)-(it->l)+)*ksm(it->v,x,y))%y;
return res;
} int rnd(){ int ret=(int)seed; seed=(seed*+)%; return ret; } int main(){
freopen("CF896C.in","r",stdin);
freopen("CF896C.out","w",stdout);
cin>>n>>m>>seed>>mx;
rep(i,,n) S.insert((P){i,i,rnd()%mx+});
S.insert((P){n+,n+,});
rep(i,,m){
int op=rnd()%+,l=rnd()%n+,r=rnd()%n+;
if (l>r) swap(l,r);
if (op==) x=rnd()%(r-l+)+; else x=rnd()%mx+;
if (op==) y=rnd()%mx+;
if (op==) add(l,r,x);
if (op==) assign(l,r,x);
if (op==) cout<<kth(l,r,x)<<endl;
if (op==) cout<<que(l,r,x,y)<<endl;
}
return ;
}

[CF896C]Willem, Chtholly and Seniorious(珂朵莉树)的更多相关文章

  1. [Codeforces896C] Willem, Chtholly and Seniorious (ODT-珂朵莉树)

    无聊学了一下珂朵莉树 珂朵莉树好哇,是可以维护区间x次方和查询的高效数据结构. 思想大致就是一个暴力(相对而言)的树形数据结构 lxl毒瘤太强了,发明了ODT算法(Old Driver Tree老司机 ...

  2. CF896C Willem, Chtholly and Seniorious(珂朵莉树)

    中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define ...

  3. 【ODT】cf896C - Willem, Chtholly and Seniorious

    仿佛没用过std::set Seniorious has n pieces of talisman. Willem puts them in a line, the i-th of which is ...

  4. 珂朵莉树(Chtholly Tree)学习笔记

    珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...

  5. [CF896C]Willem, Chtholly and Seniorious

    题目大意:有$n$个数,有$m$次$4$种操作: l r x :将$[l,r]$区间所有数加上$x$ l r x :将$[l,r]$区间所有数变成$x$ l r k :输出$[l,r]$区间第$k$大 ...

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

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

  7. 『珂朵莉树 Old Driver Tree』

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

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

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

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

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

随机推荐

  1. UML和模式应用4:初始阶段(1)--概述

    1.前言 UP开发包括四个阶段:初始阶段.细化阶段.构建阶段.移交阶段: 初始阶段是项目比较简短的起始步骤,主要目的是收集足够的信息来建立共同设想,调查项目的总体目标和可行性,确定是否值得进一步深入. ...

  2. vim 超强发行版

    推荐第一个: https://github.com/spf13/spf13-vim https://github.com/Spacevim/Spacevim https://github.com/JB ...

  3. sqlserver2008r2数据库使用触发器对sa及其他数据库账号访问进行IP限制

    一.只允许指定IP访问数据库 创建测试账号 CREATE LOGIN testuser WITH PASSWORD = '123' GO CREATE TRIGGER [tr_connection_l ...

  4. 内存分配方式,堆区,栈区,new/delete/malloc/free

    1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...

  5. nodejs服务器读取图片返回给前端(浏览器)显示

    1 前言 项目需要用nodejs服务器给前端传递图片,网上找了好多资料,多数都是怎么在前端上传图片的,然后通过看runoob.com菜鸟教程,发现其实是非常简单,用express框架就行了. 2 代码 ...

  6. SKlearn库学习曲线

    思想: # 1.现将所有样本用交叉验证方法或者(随机抽样方法) 得到 K对 训练集-验证集# 2.依次对K个训练集,拿出数量不断增加的子集如m个,并在这些K*m个子集上训练模型.# 3.依次在对应训练 ...

  7. Go语言规格说明书 之 类型(Types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  8. Spring Boot学习笔记 - 整合Swagger2自动生成RESTful API文档

    1.添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!--swagger2--> <dependency> <groupId>io.spr ...

  9. 使用git pull提示refusing to merge unrelated histories

    创建了一个origin,两个人分别clone 分别做完全不同的提交 第一个人git push成功 第二个人在执行git pull的时候,提示 fatal: refusing to merge unre ...

  10. Jmeter接口测试参数化实例图文示例

    在实际测试中,不可能查询值测试一个输入值,还有其他测试数据,故引入参数化的概念,让一条用例循环执行,直到所有测试数据均测试完成,如下示例: Jmeter参数化有4种方法,本例仅介绍最普遍及简单的1个方 ...