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
  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/10584244.html
Copyright © 2011-2022 走看看