zoukankan      html  css  js  c++  java
  • Willem, Chtholly and Seniorious

    Willem, Chtholly and Seniorious

    https://codeforces.com/contest/897/problem/E

    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 that l ≤ 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
    Copy
    10 10 7 9
    output
    Copy
    2
    1
    0
    3
    input
    Copy
    10 10 9 9
    output
    Copy
    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

    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 }
    View Code
  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/10584244.html
Copyright © 2011-2022 走看看