Willem, Chtholly and Seniorious
Willem, Chtholly and Seniorious
https://codeforces.com/contest/897/problem/E
— 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:
- 1 l r x: For each i such that l ≤ i ≤ r, assign ai + x to ai.
- 2 l r x: For each i such that l ≤ i ≤ r, assign x to ai.
- 3 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 that l ≤ i ≤ r are taken and sorted into an array of non-decreasing integers. It's guaranteed that 1 ≤ x ≤ r - l + 1.
- 4 l r x y: Print the sum of the x-th power of ai such that l ≤ i ≤ r, modulo y, i.e. .
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.
For each operation of types 3 or 4, output a line containing the answer.
10 10 7 9
2
1
0
3
10 10 9 9
1
1
3
3
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
ODT模板题
参考博客:https://blog.csdn.net/niiick/article/details/83062256
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define lson l,mid,rt<<1 4 #define rson mid+1,r,rt<<1|1 5 #define IT set<node>::iterator 6 #define sqr(x) ((x)*(x)) 7 #define pb push_back 8 #define eb emplace_back 9 #define maxn 100005 10 #define eps 1e-8 11 #define pi acos(-1.0) 12 #define rep(k,i,j) for(int k=i;k<j;k++) 13 typedef long long ll; 14 typedef pair<int,int> pii; 15 typedef pair<ll,ll>pll; 16 typedef pair<ll,int> pli; 17 typedef pair<pair<int,string>,pii> ppp; 18 typedef unsigned long long ull; 19 const long long MOD=1e9+7; 20 const double oula=0.57721566490153286060651209; 21 using namespace std; 22 23 struct node{ 24 int l,r; 25 mutable ll val; 26 node(int L,int R=-1,ll V=0):l(L),r(R),val(V){} 27 bool operator<(const node& t)const { 28 return l<t.l; 29 } 30 }; 31 set<node>se; 32 33 ll ksm(ll a,ll b,ll mod){ 34 ll ans=1; 35 a%=mod; 36 while(b){ 37 if(b&1){ 38 ans=(ans*a)%mod; 39 } 40 b>>=1; 41 a=(a*a)%mod; 42 } 43 return ans; 44 } 45 46 IT split(int pos){ 47 IT it=se.lower_bound(node(pos)); 48 if(it!=se.end()&&it->l==pos) return it; 49 it--; 50 int L=it->l,R=it->r; 51 ll V=it->val; 52 se.erase(it); 53 se.insert(node(L,pos-1,V)); 54 return se.insert(node(pos,R,V)).first;///返回L==pos的迭代器 55 } 56 57 void assign(int l,int r,ll v){ 58 IT itr=split(r+1),itl=split(l); 59 se.erase(itl,itr);///左闭右开 60 se.insert(node(l,r,v)); 61 } 62 63 void add(int l,int r,ll v){ 64 IT itr=split(r+1); 65 for(IT itl=split(l);itl!=itr;itl++){ 66 itl->val+=v; 67 } 68 } 69 70 ll Rank(int l,int r,int v){ 71 IT itr=split(r+1); 72 vector<pli>tmp; 73 for(IT itl=split(l);itl!=itr;itl++){ 74 tmp.pb({itl->val,itl->r-itl->l+1}); 75 } 76 sort(tmp.begin(),tmp.end()); 77 for(int i=0;i<tmp.size();i++){ 78 v-=tmp[i].second; 79 if(v<=0){ 80 return tmp[i].first; 81 } 82 } 83 } 84 85 ll query(int l,int r,ll x,ll y){ 86 IT itr=split(r+1); 87 ll ans=0; 88 for(IT itl=split(l);itl!=itr;itl++){ 89 ans=(ans+((ksm(itl->val,x,y)*(itl->r-itl->l+1))%y))%y; 90 } 91 return ans; 92 } 93 94 ll n,m,seed,vmax; 95 96 ll rnd(){ 97 ll ans=seed; 98 seed=(seed*7+13)%MOD; 99 return ans; 100 } 101 102 103 int main(){ 104 std::ios::sync_with_stdio(false); 105 106 cin>>n>>m>>seed>>vmax; 107 ll x,y; 108 for(int i=1;i<=n;i++){ 109 x=(rnd()%vmax)+1; 110 se.insert(node(i,i,x)); 111 } 112 int opt,L,R; 113 for(int i=1;i<=m;i++){ 114 opt=(rnd()%4)+1; 115 L=(rnd()%n)+1; 116 R=(rnd()%n)+1; 117 if(L>R) swap(L,R); 118 if(opt==3){ 119 x=(rnd()%(R-L+1))+1; 120 } 121 else{ 122 x=(rnd()%vmax)+1; 123 } 124 if(opt==4){ 125 y=(rnd()%vmax)+1; 126 } 127 if(opt==1){ 128 add(L,R,x); 129 } 130 else if(opt==2){ 131 assign(L,R,x); 132 } 133 else if(opt==3){ 134 cout<<Rank(L,R,x)<<endl; 135 } 136 else{ 137 cout<<query(L,R,x,y)<<endl; 138 } 139 } 140 }
posted on 2019-03-23 15:46 Fighting_sh 阅读(382) 评论(0) 编辑 收藏 举报