题目

支持区间加,区间推平,询问区间第\(k\)小,

以及询问区间\(\sum{a_i^x}\pmod y\),数据随机


分析

由于数据随机,那么区间推平的概率为\(\frac{1}{4}\),

考虑用珂朵莉树实现,用\(STL::set\)装下相同元素段,

对于取出一段区间,分离左右端点,直接修改即可


代码

#include <cstdio>
#include <cctype>
#include <set>
#include <algorithm>
#define rr register
using namespace std;
typedef long long lll;
struct rec{
int l,r; mutable lll w;
inline bool operator <(const rec &t)const{
return l<t.l;
}
};
struct Two{
lll w; int len;
inline bool operator <(const Two &t)const{
return w<t.w;
}
}b[100011];
typedef set<rec>::iterator ir; ir it0,it1,it;
set<rec>K; int n,m,seed,mx,mod;
inline void print(lll ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline signed Get(){
rr int ans=seed;
seed=(7ll*seed+13)%1000000007;
return ans;
}
inline lll ksm(lll x,lll y,lll p){
rr lll ans=1;
for (;y;y>>=1,x=x*x%p)
if (y&1) ans=ans*x%p;
return ans;
}
inline ir Split(int x){
it=K.lower_bound((rec){x,0,0});
if (it!=K.end()&&it->l==x) return it;
rr rec t=*(--it); K.erase(it);
K.insert((rec){t.l,x-1,t.w});
return K.insert((rec){x,t.r,t.w}).first;
}
inline void Assign(int l,int r,int w){
it1=Split(r+1),it0=Split(l);
K.erase(it0,it1);
K.insert((rec){l,r,w});
}
signed main(){
scanf("%d%d%d%d",&n,&m,&seed,&mx);
for (rr int i=1;i<=n;++i)
K.insert((rec){i,i,Get()%mx+1});
K.insert((rec){n+1,n+1,0});
for (rr int i=1;i<=m;++i){
rr int opt=Get()%4+1,l=Get()%n+1,r=Get()%n+1;
if (l>r) l^=r,r^=l,l^=r;
switch (opt){
case 1:{
rr int x=Get()%mx+1;
it1=Split(r+1),it0=Split(l);
for (;it0!=it1;++it0) it0->w+=x;
break;
}
case 2:{
rr int x=Get()%mx+1;
Assign(l,r,x);
break;
}
case 3:{
rr int kth=Get()%(r-l+1)+1,tot=0;
it1=Split(r+1),it0=Split(l);
for (;it0!=it1;++it0){
rr rec t=*it0;
b[++tot]=(Two){t.w,t.r-t.l+1};
}
sort(b+1,b+1+tot);
for (rr int i=1;i<=tot;++i){
kth-=b[i].len;
if (kth<=0) {print(b[i].w),putchar(10); break;}
}
break;
}
case 4:{
rr int y=Get()%mx+1,mod=Get()%mx+1; rr lll ans=0;
it1=Split(r+1),it0=Split(l);
for (;it0!=it1;++it0){
rr rec t=*it0;
ans=(ans+ksm(t.w,y,mod)*(t.r-t.l+1)%mod)%mod;
}
print(ans),putchar(10);
break;
}
}
}
return 0;
}

#珂朵莉树#CF896C Willem, Chtholly and Seniorious的更多相关文章

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

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

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

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

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

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

  4. 『珂朵莉树 Old Driver Tree』

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

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

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

  6. 【学习笔记】珂朵莉树(ODT)

    珂朵莉树 \(\tt 0x00\) 起源 起源于 CodeForces 的一题 CF896C,当时出题人提供了这种做法,在随机数据下均摊复杂度比较优秀. 正统名字好像叫颜色段均摊,由于题目也得名于 \ ...

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

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

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

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

  9. 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)

    传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...

  10. 洛谷P2082 区间覆盖(加强版)(珂朵莉树)

    传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...

随机推荐

  1. 掌握C语言指针,轻松解锁代码高效性与灵活性

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 指针与地址 1.1 概念 我们都知道计算机的数据必须存储在内存里,为了正确地访问这些 ...

  2. Linux开端---Centos

    Linux-Centos 虚拟化所需工具:https://pan.baidu.com/s/1643-kYcx9oPGnGEZM1pLOw?pwd=g0v5 提取码:g0v5 问题解决 正常注册网络适配 ...

  3. 【Azure 应用服务】在Azure App Service多实例的情况下,如何在应用中通过代码获取到实例名(Instance ID)呢?

    问题描述 App Service开启多实例后,如何在代码中获取当前请求所真实到达的实例ID(Instance ID)呢? 问题答案 App Service 通过 环境变量的方式 显示的输出实例ID等信 ...

  4. C++ //类模板对象做函数参数 //三种方式 //1.指定传入的类型 --直接显示对象的数据类型 //2.参数模板化 --将对象中的参数变为模板进行传递 //3.整个类模板化 --将这个对象类型 模板化进行传递

    1 //类模板对象做函数参数 2 //三种方式 3 //1.指定传入的类型 --直接显示对象的数据类型 4 //2.参数模板化 --将对象中的参数变为模板进行传递 5 //3.整个类模板化 --将这个 ...

  5. 独家消息:阿里云悄然推出RPA云电脑,已与多家RPA厂商开放合作

    独家消息:阿里云悄然推出RPA云电脑,已与多家RPA厂商开放合作 RPA云电脑,让RPA开箱即用算力无限? 文/王吉伟 这几天,王吉伟频道通过业内人士获得独家消息,阿里云近期推出了一个名为「RPA云电 ...

  6. [VueJsDev] 基础知识 - AutoNumber VsCode 插件开发

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html AutoNumber VsCode插件开发 ::: deta ...

  7. 流数据库-RisingWave

    参考: https://docs.risingwave.com/docs/current/architecture/ https://www.risingwavetutorial.com/docs/i ...

  8. 使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示

    前言 在.NET应用开发中数据集的交互式显示是一个非常常见的功能,如需要创建折线图.柱状图.饼图.散点图等不同类型的图表将数据呈现出来,帮助人们更好地理解数据.发现规律,并支持决策和沟通.本文我们将一 ...

  9. Android Progressbar进度条样式调整为圆角矩形,且改变颜色

    原文地址: Android Progressbar进度条样式调整为圆角矩形,且改变颜色 美工设计的进度条是圆角矩形的,与Android默认的样式有所区别,可以通过样式progressDrawable属 ...

  10. Android 语音播放(文字TTS)

    原文地址:Android 语音播放(文字TTS) | Stars-One的杂货小窝 基于Google内置的TTS引擎,封装了个语音播放的工具类 使用 //初始化 SpeechService.init( ...