http://codeforces.com/problemset/problem/896/C

题意:

对于一个随机序列,执行以下操作:

区间赋值

区间加

区间求第k小

区间求k次幂的和

对于随机序列,可以使用Old Driver Tree

就是将序列中,连续的相同值域合并为一段

然后暴力操作

#include<set>
#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; typedef long long LL; #define N 100001 int n,m,seed,vmax,ret;
int a[N]; struct node
{
int l,r;
mutable LL val;
bool operator < (node p) const
{
return l<p.l;
}
node(int l=,int r=,LL val=):l(l),r(r),val(val) { }
}; set<node>s; typedef set<node> :: iterator seti; vector<pair<LL,int> >par; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int rnd()
{
ret=seed;
seed=((LL)seed*+)%;
return ret;
} void split(int pos)
{
seti it=s.lower_bound(node(pos,-,-));
if(it==s.end() || it->l>pos)
{
--it;
int l=it->l,r=it->r;
LL val=it->val;
s.erase(it);
s.insert(node(l,pos-,val));
s.insert(node(pos,r,val));
}
} LL quickpow(LL a,LL x,LL mod)
{
LL res=;
for(;x;x>>=,a=a*a%mod)
if(x&) res=res*a%mod;
return res;
} int main()
{
read(n);
read(m);
read(seed);
read(vmax);
for(int i=;i<=n;++i) a[i]=rnd()%vmax+;
int r;
for(int i=;i<=n;)
{
r=i+;
while(a[r]==a[i]) r++;
s.insert(node(i,r-,(LL)a[i]));
i=r;
}
int op,l,x,y;
for(int i=;i<=m;++i)
{
op=rnd()%+;
l=rnd()%n+;
r=rnd()%n+;
if(l>r) swap(l,r);
if(op==) x=rnd()%(r-l+)+;
else x=rnd()%vmax+;
if(op==) y=rnd()%vmax+;
split(l);
if(r<n) split(r+);
seti itl=s.lower_bound(node(l,-,-));
seti itr=s.upper_bound(node(r,-,-));
if(op==)
{
for(seti it=itl;it!=itr;++it) it->val+=x;
}
else if(op==)
{
s.erase(itl,itr);
s.insert(node(l,r,x));
}
else if(op==)
{
par.clear();
for(seti it=itl;it!=itr;++it)
par.push_back(make_pair(it->val,it->r-it->l+));
sort(par.begin(),par.end());
for(int i=;i<par.size();++i)
{
x-=par[i].second;
if(x<=)
{
cout<<par[i].first<<'\n';
break;
}
}
}
else
{
LL ans=;
for(seti it=itl;it!=itr;++it)
{
LL val=quickpow(it->val%y,x,y);
val=val*(it->r-it->l+)%y;
ans=(ans+val)%y;
}
cout<<ans<<'\n';
}
}
return ;
}
C. Willem, Chtholly and Seniorious
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

— Willem...

— What's the matter?

— It seems that there's something wrong with Seniorious...

— I'll have a look...

Seniorious is made by linking special talismans in particular order.

After over 500 years, the carillon is now in bad condition, so Willem decides to examine it thoroughly.

Seniorious has n pieces of talisman. Willem puts them in a line, the i-th of which is an integer ai.

In order to maintain it, Willem needs to perform m operations.

There are four types of operations:

  • l r x: For each i such that l ≤ i ≤ r, assign ai + x to ai.
  • l r x: For each i such that l ≤ i ≤ r, assign x to ai.
  • l r x: Print the x-th smallest number in the index range [l, r], i.e. the element at the x-th position if all the elements ai such thatl ≤ i ≤ r are taken and sorted into an array of non-decreasing integers. It's guaranteed that 1 ≤ x ≤ r - l + 1.
  • l r x y: Print the sum of the x-th power of ai such that l ≤ i ≤ r, modulo y, i.e. .
Input

The only line contains four integers n, m, seed, vmax (1 ≤ n, m ≤ 105, 0 ≤ seed < 109 + 7, 1 ≤ vmax ≤ 109).

The initial values and operations are generated using following pseudo code:

def rnd():

    ret = seed
seed = (seed * 7 + 13) mod 1000000007
return ret for i = 1 to n: a[i] = (rnd() mod vmax) + 1 for i = 1 to m: op = (rnd() mod 4) + 1
l = (rnd() mod n) + 1
r = (rnd() mod n) + 1 if (l > r):
swap(l, r) if (op == 3):
x = (rnd() mod (r - l + 1)) + 1
else:
x = (rnd() mod vmax) + 1 if (op == 4):
y = (rnd() mod vmax) + 1

Here op is the type of the operation mentioned in the legend.

Output

For each operation of types 3 or 4, output a line containing the answer.

Examples
input
10 10 7 9
output
2
1
0
3
input
10 10 9 9
output
1
1
3
3
Note

In the first example, the initial array is {8, 9, 7, 2, 3, 1, 5, 6, 4, 8}.

The operations are:

  • 2 6 7 9
  • 1 3 10 8
  • 4 4 6 2 4
  • 1 4 5 8
  • 2 1 7 1
  • 4 7 9 4 4
  • 1 2 7 9
  • 4 5 8 1 1
  • 2 5 7 5
  • 4 3 10 8 5

CF&&CC百套计划1 Codeforces Round #449 C. Willem, Chtholly and Seniorious (Old Driver Tree)的更多相关文章

  1. CF&&CC百套计划1 Codeforces Round #449 B. Ithea Plays With Chtholly

    http://codeforces.com/contest/896/problem/B 题意: 交互题 n张卡片填m个1到c之间的数,1<=n*ceil(c/2)<=m 最后填出一个单调非 ...

  2. CF&&CC百套计划1 Codeforces Round #449 A. Nephren gives a riddle

    http://codeforces.com/contest/896/problem/A 第i个字符串嵌套第i-1个字符串 求第n个字符串的第k个字母 dfs #include<map> # ...

  3. CF&&CC百套计划4 Codeforces Round #276 (Div. 1) A. Bits

    http://codeforces.com/contest/484/problem/A 题意: 询问[a,b]中二进制位1最多且最小的数 贪心,假设开始每一位都是1 从高位i开始枚举, 如果当前数&g ...

  4. CF&&CC百套计划4 Codeforces Round #276 (Div. 1) E. Sign on Fence

    http://codeforces.com/contest/484/problem/E 题意: 给出n个数,查询最大的在区间[l,r]内,长为w的子区间的最小值 第i棵线段树表示>=i的数 维护 ...

  5. CF&&CC百套计划3 Codeforces Round #204 (Div. 1) A. Jeff and Rounding

    http://codeforces.com/problemset/problem/351/A 题意: 2*n个数,选n个数上取整,n个数下取整 最小化 abs(取整之后数的和-原来数的和) 先使所有的 ...

  6. CF&&CC百套计划3 Codeforces Round #204 (Div. 1) D. Jeff and Removing Periods

    http://codeforces.com/problemset/problem/351/D 题意: n个数的一个序列,m个操作 给出操作区间[l,r], 首先可以删除下标为等差数列且数值相等的一些数 ...

  7. CF&&CC百套计划3 Codeforces Round #204 (Div. 1) E. Jeff and Permutation

    http://codeforces.com/contest/351/problem/E 题意: 给出一些数,可以改变任意数的正负,使序列的逆序对数量最少 因为可以任意加负号,所以可以先把所有数看作正数 ...

  8. CF&&CC百套计划3 Codeforces Round #204 (Div. 1) B. Jeff and Furik

    http://codeforces.com/contest/351/problem/B 题意: 给出一个n的排列 第一个人任选两个相邻数交换位置 第二个人有一半的概率交换相邻的第一个数>第二个数 ...

  9. CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries

    https://www.codechef.com/DEC17/problems/CHEFEXQ 题意: 位置i的数改为k 询问区间[1,i]内有多少个前缀的异或和为k 分块 sum[i][j] 表示第 ...

随机推荐

  1. 第1阶段冲刺成果—简单运算game(APP)

    第1阶段冲刺成果 由于我们团队都没有Android的基础,所以在这一块花了很长的时间去学习探索,就连简单的Android的电脑配置也花了很长的时间,所以其他的DONE的都没有完成,这是失败的地方.但是 ...

  2. Internet History, Technology and Security (Week2)

    Week2. History: The First Internet - NSFNet coursera address Supercomputers Justify a National Netwo ...

  3. 小学四则运算结对项目报告【GUI】

    写在前面 这次的结对项目我做了很长时间,感触也很多.在这次项目中我使用了Java GUI作为和用户的交互方式,但是在上Java课的时候我对GUI和事件驱动这里并没有学的多好,可能是当时对编程还没有什么 ...

  4. 用CSS3的animation轻松实现背景动画:漂浮的云

    背景动画如果用的恰当,会给网页带来意想不到的效果.在过去,我们只能用flash或Javascript来实现.幸运的是,CSS3的流行使得我们完全可以使用它来实现这种效果,不再依赖其它编程技术.一段简单 ...

  5. angularJS1笔记-(20)-模块化加载机制seajs

    SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制. 与jQuery等JavaScript框架不同,SeaJS不会扩展封装语言特性,而 ...

  6. AWS EC2安装docker时的问题

    在AWS EC2的实例(Ubuntu)里面安装docker时,使用通常的安装步骤 :~$ sudo apt-get update :~$ sudo apt-get install docker 安装完 ...

  7. 蜗牛慢慢爬 LeetCode 6. ZigZag Conversion [Difficulty: Medium]

    题目 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...

  8. [转帖]SSD的工作原理、GC和TRIM、写入放大以及性能评测

    SSD的工作原理.GC和TRIM.写入放大以及性能评测 https://blog.csdn.net/scaleqiao/article/details/50511279   SSD的物理结构和工作原理 ...

  9. 【版本管理】git本地操作

    1.初始化一个Git仓库,使用git init命令. 2.添加文件到Git仓库,分两步: • 第一步,使用命令git add 文件名,注意,可反复多次使用,添加多个文件: • 第二步,使用命令git ...

  10. The Best Path HDU - 5883(欧拉回路 && 欧拉路径)

    The Best Path Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...