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. HDU 4514并查集判环+最长路

    点击打开链接 题意:中文题...... 思路:先推断是否能成环,之前以为是有向图,就用了spfa推断,果断过不了自己出的例子,发现是无向图.并查集把,两个点有公共的父节点,那就是成环了,之后便是求最长 ...

  2. pascals-triangleI、II——生成规律的三角形

    1.Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Ret ...

  3. ollydbg快速定位方便调试

    在ollydbg调试的时候,会看到大量的汇编代码(远多于源代码),代码中有大量的函数嵌套调用,调试起来周期很长,难度比较大. 所以我们希望能快速定位到代码,以下是快速定位的四种方法: 1.Goto命令 ...

  4. 【每日Scrum】第六天(4.16) TD学生助手Sprint1阶段性成果

    TD学生助手Sprint1阶段性成果(4.16) 任务看板 站立会议内容 组员 昨天 今天 困难 签到 刘铸辉 (组长) 和叶姐,静姐修改页面布局和图片显示,保证界面的亲切. 和大家一起做演示PPT, ...

  5. java开发之随笔记录

    1.java 保留两位小数 DecimalFormat df = new DecimalFormat("#.##"); System.out.println(df.format(1 ...

  6. JavaScript事件在WebKit中的处理流程研究

    本文主要探讨了JavaScript事件在WebKit中的注冊和触发机制. JS事件有两种注冊方式: 通过DOM节点的属性加入或者通过node.addEventListener()函数注冊: 通过DOM ...

  7. Effective Java - [2. 创建与销毁对象]

    让对象的创建与销毁在掌控中. Item 1: 使用静态工厂方法而非使用构造函数 public static Boolean valueOf(boolean b) { return b ? Boolea ...

  8. bzoj-2251 外星联络

    题意: 给出一个字符串,求出现次数超过1的子串的出现个数. 字符串长度<=3000: 题解: 题目问的是子串的个数.那么首先我们要找到全部的子串. 而字符串的全部后缀的前缀能够不重不漏的表示全部 ...

  9. 使用unidac 连接FB 3.0 (含嵌入版)

    unidac  是delphi 最强大的数据库连接控件,没有之一.详细信息可以通过官网了解. Firebird是一个跨平台的关系数据库系统,目前能够运行在Windows.linux和各种Unix操作系 ...

  10. EasyPusher:基于live555的DarwinInjector实现的RTSP直播推送程序

    先简单介绍一下EasyPusher的功能,后面再对具体内部架构做介绍: EasyPusher:https://github.com/EasyDarwin/EasyPusher EasyPusher是什 ...