题意简述

维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和

数据随机

题解思路

ODT是一种基于std::set的暴力数据结构。

每个节点对应一段区间,该区间内的数都相等。

核心操作split可以将节点拆开,修改需要的部分。

每个操作都split(r+1),split(l),再遍历其中所有区间,修改或求值。

至于时间复杂度,由assign保证

代码

#include <set>
#include <vector>
#include <utility>
#include <iostream>
#include <algorithm>
#define IT set<Node>::iterator
typedef long long ll;
using std::set; using std::vector; using std::pair;
int n,m,seed,vmax,op,l,r,x,y;
struct Node {
int l,r;
mutable ll v;
Node(int L,int R,ll V):l(L),r(R),v(V) {}
bool operator<(const Node& x) const { return l<x.l; }
};
set<Node> s;
inline int rnd() { int ret=seed; seed=(seed*7ll+13)%1000000007; return ret; }
inline int _pow(ll x,int y,const int& p,int s=1) {
x%=p; for (;y;y>>=1,x=(ll)x*x%p) if (y&1) s=(ll)s*x%p; return s;
}
inline IT split(const int& pos) {
IT it=s.lower_bound(Node(pos,0,0));
if (it!=s.end()&&it->l==pos) return it;
--it; int L=it->l,R=it->r; ll V=it->v; s.erase(it);
s.insert(Node(L,pos-1,V));
return s.insert(Node(pos,R,V)).first;
}
inline void assign(const int& l,const int& r,const int& va) {
IT itr=split(r+1),itl=split(l); s.erase(itl,itr); s.insert(Node(l,r,va));
}
inline void add(const int& l,const int& r,const int& va) {
for (IT itr=split(r+1),itl=split(l);itl!=itr;++itl) itl->v+=va;
}
inline ll q_kth(const int& l,const int& r,int k) {
vector<pair<ll,int> > vec;
for (IT itr=split(r+1),itl=split(l);itl!=itr;++itl) vec.push_back(pair<ll,int>(itl->v,itl->r-itl->l+1));
std::sort(vec.begin(),vec.end());
for (vector<pair<ll,int> >::iterator it=vec.begin();it!=vec.end();++it) {
k-=it->second; if (k<=0) return it->first;
}
return -1;
}
inline int q_pwsm(const int& l,const int& r,const int& x,const int& y,int res=0) {
for (IT itr=split(r+1),itl=split(l);itl!=itr;++itl) res=(res+1ll*_pow(itl->v,x,y)*(itl->r-itl->l+1))%y;
return res;
}
int main() {
std::ios::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0);
std::cin>>n>>m>>seed>>vmax;
for (register int i=1;i<=n;++i) s.insert(Node(i,i,rnd()%vmax+1));
for (register int i=1;i<=m;++i) {
op=rnd()%4+1; l=rnd()%n+1; r=rnd()%n+1; if (l>r) std::swap(l,r);
if (op==3) x=rnd()%(r-l+1)+1; else x=rnd()%vmax+1;
if (op==4) y=rnd()%vmax+1;
if (op==1) add(l,r,x);
else if (op==2) assign(l,r,x);
else if (op==3) std::cout<<q_kth(l,r,x)<<'\n';
else std::cout<<q_pwsm(l,r,x,y)<<'\n';
}
}

最新文章

  1. JS高程3.基本概念(4)操作符
  2. 解决: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19
  3. 一个的unity学习系列的博客
  4. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
  5. Sign-Magnitude Representation
  6. swiper有时候不能自动滚动的问题
  7. Velocity(3)——字面值和转义
  8. 论文阅读(2014-1)----a new collaborative filtering-based recommender system for manufacturing appstore: which applications would be useful to your busines?
  9. 06---Java基础、面向对象
  10. android 41 Environment
  11. 转:100个高质量Java开发者博客
  12. Bull And Cows
  13. JS 在html中的位置
  14. [转]Mysql自动备份并保存近15天记录脚本
  15. CentOS下利用sshpass不用手动输入密码远程执行命令
  16. .NET基础——ASSCII码表
  17. JavascriptS中的各结构的嵌套和函数
  18. Installation of the JDK-9 on ubuntu(linux上安装jdk-9)
  19. node的安装及基本使用!
  20. [Linux]流媒体服务器概述

热门文章

  1. 网络下载器 EagleGet v2.0.4.60 Full 绿色便携版
  2. 数据结构丨N叉树
  3. 浅谈 Attention 机制的理解
  4. c++小游戏——杀手
  5. 个人永久性免费-Excel催化剂功能第38波-比Vlookup更好用的查找引用函数
  6. 机器学习-利用pickle加载cifar文件
  7. [leetcode] 929. Unique Email Addresses (easy)
  8. leetcode 198. House Robber (Easy)
  9. iOS程序员如何提升核心竞争力,防止自己被裁员?
  10. TP框架基础(一)