#珂朵莉树#CF896C Willem, Chtholly and Seniorious
题目
支持区间加,区间推平,询问区间第\(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的更多相关文章
- CF896C Willem, Chtholly and Seniorious(珂朵莉树)
中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define ...
- 珂朵莉树(Chtholly Tree)学习笔记
珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...
- [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...
- 『珂朵莉树 Old Driver Tree』
珂朵莉树 珂朵莉树其实不是树,只是一个借助平衡树实现的数据结构,主要是对于有区间赋值的数据结构题,可以用很暴力的代码很高效地完成任务,当然这是建立在数据随机的基础上的. 即使数据不是随机的,写一个珂朵 ...
- 「学习笔记」珂朵莉树 ODT
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...
- 【学习笔记】珂朵莉树(ODT)
珂朵莉树 \(\tt 0x00\) 起源 起源于 CodeForces 的一题 CF896C,当时出题人提供了这种做法,在随机数据下均摊复杂度比较优秀. 正统名字好像叫颜色段均摊,由于题目也得名于 \ ...
- 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...
- 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...
- 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...
- 洛谷P2082 区间覆盖(加强版)(珂朵莉树)
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...
随机推荐
- Thinkpad T14 AMD版无线网卡不可用
硬件环境: Thinkpad T14 AMD 操作系统: Windows 10家庭版 问题描述: Windows 10在后台默默做了补丁更新,导致无线网卡和蓝牙鼠标都不可用(但是有线网却是能正常工作的 ...
- pytho代码分析示例
a = 5 b = 6 c = 10 for i in range(n): for j in range(n): x = i * j y = j * j z = i * j for k in rang ...
- deque双端队列
# 支持从任意一端增加和删除元素 d = collections.deque() d.extend('abcdefg') d.append('h') d.extendleft(range(6)) # ...
- beego中数据库表创建
package main import ( "fmt" "github.com/astaxie/beego/orm" _ "github.com/go ...
- 【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
问题描述 Azure Function部署后未执行,查看日志发现错误信息: 2023-12-19T11:12:27.145 [Verbose] Host configuration applied.2 ...
- 【Azure Redis】Redis-CLI连接Redis 6380端口始终遇见 I/O Error
问题描述 使用Redis-cli连接Redis服务,因为工具无法直接支持TLS 6380端口连接,所以需要使用 stunnel 配置TLS/SSL服务.根据文章(Linux VM使用6380端口(SS ...
- 【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn
问题描述 App Service 配置 Application Settings 访问Storage Account.如下: { "name": "WEBSITE_CON ...
- java数组案例
数组: 数组就是用来存储一批同类型数据的内存区域(容器) 数组中的最大值实现方法: 数据拿到程序中去,用数组装起来. 定义一个变量,用于记录最大值.这个变量建议默认存储第一个元素作 ...
- MySQL汇总数和分组数据
1.使用SQL语句对数据库表中的数据进行简单的汇总和分组,这里要注意 count(*) 是对表中的所有数据目进行计数,不管表列中包含的是空值还是非空值. 而使用count(column)是对特定的列中 ...
- vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码
vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码