再次求助ODTwa#3
查看原帖
再次求助ODTwa#3
209923
PRIMITIVE_LIGHTS楼主2022/3/12 08:47
#include<iostream> 
#include<set>
#include<vector>
#include<algorithm>
#define int long long
#define IT set<node>::iterator
using namespace std;
int n,m;
int seed;
int vmax;
int a[1000001];
struct node{
    int l,r;mutable int val;
    node(int L=0,int R=0,int VAL=0){l=L,r=R,val=VAL;}
     bool operator <(const node &b) const{return l<b.l;} 
};
set <node> ODT;
IT split(int pos){
    IT p=ODT.lower_bound((node){pos,pos,0});
    if(p!=ODT.end()&&p->l==pos) return p;
    --p;
    int v=p->val;
    int R=p->r;
    int L=p->l;
    ODT.erase(p);
    ODT.insert((node){L,pos-1,v});
    return ODT.insert((node){pos,R,v}).first;
}
void assign(int l,int r,int k){
    IT pos2=split(r+1),pos1=split(l);
    ODT.erase(pos1,pos2);
    ODT.insert((node){l,r,k});
}
void add(int l,int r,int k){
    IT pos2=split(r+1),pos1=split(l);
    for(IT it=pos1;it!=pos2;++it)   it->val+=k;
}
int kth(int l,int r,int k){
    IT pos2=split(r+1),pos1=split(l);
    vector<node> P;P.clear();
    int cnt=0;
    for(IT it=pos1;it!=pos2;++it) {
        P.push_back(*it);
    }
    sort(P.begin(),P.end());
    for(auto it:P){
        cnt+=(it.r-it.l+1);
        if(cnt>=k) return it.val;
    }
    return 0;
}
int ksm(int base,int p,int mod){
    base%=mod;
    int ans=1;
    while(p){
        if(p&1) ans=(ans*base)%mod;
        base=(base*base)%mod;
        p>>=1;
    }
    return ans;
}
int ask_pow(int l,int r,int k,int y){
    IT pos2=split(r+1),pos1=split(l);
    int cnt=0;
    for(IT it=pos1;it!=pos2;++it){
        cnt+=((it->r-it->l+1)*ksm(it->val,k,y))%y;
        cnt%=y;
    }
    return cnt;
}
int rnd(){
    int ret=seed;
    seed=(seed*7+13)%1000000007;
    return ret;
}
void getin(){
    for(int i=1;i<=n;i++){
        a[i]=(rnd()%vmax)+1;
    }
    for(int i=1;i<=n;i++){
        ODT.insert((node){i,i,a[i]});
    }
//  ODT.insert((node){n+1,n+1,0});
    for(int i=1;i<=m;i++){
        int op,l,r,x,y;
        op=(rnd()%4)+1;
        l=(rnd()%n)+1;
        r=(rnd()%n)+1;
        if(l>r) 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);
        }
        if(op==2){
            assign(l,r,x);
        }
        if(op==3){
            printf("%d\n",kth(l,r,x));
        }
        if(op==4){
            printf("%d\n",ask_pow(l,r,x,y));
        }
    }
}
signed main(){
    cin>>n>>m>>seed>>vmax;
    getin();
}

自闭了。 试过了快速幂模底数,也加上了long long

求调,万分感谢

2022/3/12 08:47
加载中...