题目

支持区间加,区间推平,询问区间第\(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. 服务端高性能网络IO编程模型简析

    服务端高性能网络IO编程模型简析 一.客户端与服务器端 多数网络应用可以分为客户端(client)和服务器端(server)模型,然后中间通过各种定义的协议来进行两端的通信. 比如常用的 Nginx ...

  2. [WEB安全] XSS攻击防御 Vue

    一.概念 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序. 这些恶意网页程序通常是JavaScript,但实际上也可以 ...

  3. 在矩池云上使用R和RStudio

    租用机器 在矩池云租用机器的时候,系统环境里搜索:R,选择 R4.2 镜像,如果需要使用RStudio,还需要在高级选项中新增一个自定义端口:8787,然后点击租用即可. 使用 JupyterLab ...

  4. 【Azure Cloud Service】Cloud Service(Classic) 迁移失败,找不到解决方案怎么办?

    问题描述 很老很老的云服务,在迁移到 Cloud Service(Extended Support)[云服务外延支持] 时,迁移的验证步骤不通过,因为资源中没有包含虚拟网络(Virtual Netwo ...

  5. 【Azure Redis 缓存】Azure Reids是否可以开启慢日志(slowlog)和执行config指令

    问题描述 使用Azure Redis,是否可以开启慢日志来查看最近时间中执行比较耗时的指令呢? 同时,如何执行Redis的Config只能来修改配置呢? 根本原因 一:Azure Reids通过Red ...

  6. 【Azure 事件中心】使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢?

    问题描述 使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢? 问题解答 查看Kafka Consumer的配置参数,其中最只要的一个参数为:max.poll.re ...

  7. Nebula Graph|如何打造多版本文档中心

    本文首发于 Nebula Graph Community 公众号 世界上没有完美的产品,每个不完美的产品都需要一份文档. 为什么需要文档 打造出一款产品后,我们需要一份文档来回答以下问题: 设计这款产 ...

  8. Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

    目录 题目链接 题意 题解 代码 题目链接 C. Digital Logarithm 题意 给两个长度位\(n\)的数组\(a\).\(b\),一个操作\(f\) 定义操作\(f\)为,\(a[i]= ...

  9. RCC & GPIO库函数&传感器输入

    RCC: Reset and Clock Control,即复位和时钟控制.   一般在.h文件的末尾都是一些函数声明,RCC常用的三个函数(外设时钟控制,没有时钟外设不工作): void RCC_A ...

  10. 重新认识 tag 快照 git (项目临时添加需求,之前有分支合并,导致从节点拉分支不行了,因为没有tag快照)

    之前的tag认知 之前一直以为tag就是在git的提交commit上打一个标,然后可以拉出分支.之前没太重视. 因为我觉得 可以直接从某个commit直接拉出分支,这打不打tag无所谓 翻车现场 今天 ...