896C
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的更多相关文章
- 【题解】Willem, Chtholly and Seniorious Codeforces 896C ODT
Prelude ODT这个东西真是太好用了,以后写暴力骗分可以用,写在这里mark一下. 题目链接:ヽ(✿゚▽゚)ノ Solution 先把原题解贴在这里:(ノ*・ω・)ノ 简单地说,因为数据是全部随 ...
- 【模板】珂朵莉树(ODT)(Codeforces 896C Willem, Chtholly and Seniorious)
题意简述 维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和 数据随机 题解思路 ODT是一种基于std::set的暴力数据结构. 每个节点对应一段区间,该区间内的数都相等. 核心操作spl ...
- Linux内核使用浮点运算问题
上一篇博文中 电池温度检测原理和示例代码 ,由于驱动要使用对数函数而从网上参看一个实现 double ln(double a) { ; int k,nk; double x,xx,y; x = (a- ...
- Chtholly Tree (珂朵莉树) ODT
ODT,OldDriverTree,又名ChthollyTree" role="presentation" style="position: relative; ...
- 「学习笔记」珂朵莉树 ODT
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...
随机推荐
- vue2 + typescript2 自定义过滤器
1.定义一个过滤器 // color-directive.ts import { DirectiveOptions } from 'vue' const directive: DirectiveOpt ...
- XSS过滤
XSS过滤封装用法 封装到app01/form.py文件中进行验证 from django.forms import Form,widgets,fields class ArticleForm(For ...
- React学习之常用概念
看见一篇不错的文章转载,文章源地址:https://blog.csdn.net/zwp438123895/article/details/69374940 一. State和 Props state ...
- vim 插件: ctrlp.vim
vim-scripts 里可以搜到这个插件. 安装好了之后,在 vim 的 normal 模式之下按 Ctrl+P 组合键即可弹出搜索窗口. * <f5> 更新目录缓存. * <c- ...
- php返回HTTP状态码
HTTP协议状态码,调用函数时候只需要将$num赋予一个下表中的已知值就直接会返回状态了.<?PHP /** * HTTP Protocol defined status codes* HTTP ...
- FeatureLayer.MODE_SNAPSHOT限制数量问题
我在加载FeatureLayer的时候,采用MODE_SNAPSHOT模式,发现有的图层少了一些数据,改回MODE_ONDEMAND又正常. 究其原因,MODE_SNAPSHOT 是一次性将数据从服务 ...
- P1355 神秘大三角
题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...
- 九度OJ 1120:全排列 (DFS)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4471 解决:1139 题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < ...
- 编写灵活、稳定、高质量的 HTML 和 CSS 代码的规范。
引用地址http://codeguide.bootcss.com/#html-ie-compatibility-mode <!DOCTYPE html> <html lang=& ...
- cc、gcc、g++区别
gcc是C编译器:g++是C++编译器:linux下cc一般是一个符号连接,指向gcc:gcc和g++都是GUN(组织)的编译器.而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Lin ...