ODT/珂朵莉树

原来这个东西很咸鱼,只能数据随机情况下nloglogn,不过作为卡常还是很好的

大概就是维护区间,值相同的并且连续当成一个区间存在set里,每次区间操作强行分裂就行了。

复杂度因为是随机保证

#include<bits/stdc++.h>
using namespace std;
int n, m, seed, mx;
int rnd()
{
int ret = seed;
seed = (1LL * seed * + ) % ;
return ret;
}
struct data {
int l, r;
long long x;
data() {}
data(int _, int __, long long ___) : l(_), r(__), x(___) {}
bool friend operator < (const data &a, const data &b) {
return a.l != b.l ? a.l < b.l : a.r < b.r;
}
};
bool cmp(const data &a, const data &b)
{
return a.x < b.x;
}
set<data> s;
vector<data> buf;
void cut(int p)
{
set<data> :: iterator it = prev(s.upper_bound(data(p, n + , -)));
if(it -> l == p) return;
data tmp = *it;
s.erase(it);
s.insert(data(tmp.l, p, tmp.x));
s.insert(data(p, tmp.r, tmp.x));
}
void merge(int l, int r)
{
cut(l);
cut(r);
buf.clear();
for(set<data> :: iterator it = s.lower_bound(data(l, -, -)); it != s.end() && it -> r <= r; ++it) buf.push_back(*it);
}
long long power(long long x, long long t, long long P)
{
long long ret = ;
x %= P;
for(; t; t >>= , x = x * x % P) if(t & ) ret = ret * x % P;
return ret;
}
int main()
{
scanf("%d%d%d%d", &n, &m, &seed, &mx);
for(int i = ; i <= n; ++i) s.insert(data(i, i + , rnd() % mx + ));
while(m--)
{
int opt = rnd() % + , l = rnd() % n + , r = rnd() % n + ;
long long x, y;
if(l > r) swap(l, r);
if(opt == ) x = (rnd() % (r - l + )) + ;
else x = rnd() % mx + ;
if(opt == ) y = rnd() % mx + ;
merge(l, r + );
if(opt == )
{
for(int i = ; i < buf.size(); ++i)
{
s.erase(buf[i]);
s.insert(data(buf[i].l, buf[i].r, buf[i].x + x));
}
}
if(opt == )
{
for(int i = ; i < buf.size(); ++i) s.erase(buf[i]);
s.insert(data(l, r + , x));
}
if(opt == )
{
sort(buf.begin(), buf.end(), cmp);
--x;
for(int i = ; i < buf.size(); ++i)
{
if(x < buf[i].r - buf[i].l)
{
printf("%lld\n", buf[i].x);
break;
}
else x -= buf[i].r - buf[i].l;
}
}
if(opt == )
{
long long ans = ;
for(int i = ; i < buf.size(); ++i) ans = (ans + power(buf[i].x, x, y) * (long long)(buf[i].r - buf[i].l) % y) % y;
printf("%lld\n", (ans % y + y) % y);
}
}
return ;
}

896C的更多相关文章

  1. 【题解】Willem, Chtholly and Seniorious Codeforces 896C ODT

    Prelude ODT这个东西真是太好用了,以后写暴力骗分可以用,写在这里mark一下. 题目链接:ヽ(✿゚▽゚)ノ Solution 先把原题解贴在这里:(ノ*・ω・)ノ 简单地说,因为数据是全部随 ...

  2. 【模板】珂朵莉树(ODT)(Codeforces 896C Willem, Chtholly and Seniorious)

    题意简述 维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和 数据随机 题解思路 ODT是一种基于std::set的暴力数据结构. 每个节点对应一段区间,该区间内的数都相等. 核心操作spl ...

  3. Linux内核使用浮点运算问题

    上一篇博文中 电池温度检测原理和示例代码 ,由于驱动要使用对数函数而从网上参看一个实现 double ln(double a) { ; int k,nk; double x,xx,y; x = (a- ...

  4. Chtholly Tree (珂朵莉树) ODT

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

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

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

随机推荐

  1. MRP routing设置释疑

    Jeffer9@gmail.com         工艺是指在不同工作中心执行的作业序列         作业的详细信息 Number of cycles 在该工作中心操作几个循环 Number of ...

  2. VueJS处理逻辑指令:v-if

    HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  3. Windows socket I/O模型 之 select(2)

    在Windows socket I/O模型 之  select(1)中.我们仅仅是在console中简单的模拟了select的处理方法. 还有非常多特性不能改动.比方仅仅能写,不能读. 没使用线程.也 ...

  4. web前端面试系列 - js中的prototype

    js中一切皆为对象,其中函数也是一种对象, 而每个函数都有一个prototype属性,其值也是一个对象. 一.prototype的作用 1. 在多个实例对象之间共享数据和方法. 2. 通过原型链实现继 ...

  5. Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例及配置文件具体解释

    Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例 一.调用java程序脚本(默认已经搭建好了Java环境) 1.jdk 安装路径 /usr/jdk/jdk1.7/-- 2.j ...

  6. Json API接口数据生成

    偶然发现,对前端数据模拟挺好用,没有跨域问题 https://myjson.com/

  7. php pack()函数详解与示例

    pack和unpack在一般的程序中还真的不容易见到,但是如果你用过很久以前的php生成excel你就会知道了.他的excel的头就是pack出来的最近在尝试与C交互的时候又用上了这玩意,所以不得不再 ...

  8. windows常用快捷键(转载)

    f1 显示当前程序或者windows的帮助内容. f2 当你选中一个文件的话,这意味着“重命名” f3 当你在桌面上的时候是打开“查找:所有文件” 对话框 f10或alt 激活当前程序的菜单栏 win ...

  9. JSP页面的编码设置(转载)

    1. pageEncoding:<%@ page pageEncoding="UTF-8"%> jsp页面编码: jsp文件本身的编码 2. contentType: ...

  10. 九度OJ 1128:求平均年龄 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2080 解决:1084 题目描述: 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位. 输入: 第 ...