odtTLE求调
查看原帖
odtTLE求调
774876
HashHacker_Peas楼主2023/12/21 23:04

RT,对照tj看了一下也没什么,为什么会莫名奇妙TLE?

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define doit cout<<"OK"
typedef pair<ll,int> pii;
const int mod=1e9+7,maxn=1e5+10;
struct node{
    int l,r;
    mutable ll val;
    node(int le,int ri=0,ll v=0){
        l=le,r=ri,val=v;
    }
    bool operator<(const node &a)const{
        return l<a.l;
    }
};
set<node>odt;
int n,m,x,y,a[maxn],opt,l,r,vmax,seed;
ll rnd(){
    ll ret=seed;
    seed=(seed*7+13)%mod;
    return ret;
}
ll power(int a,int b,int p){
    ll ans=1;
    a%=p;
    while(b){
        if(b&1)
            ans=ans*a%p;
        a=a*a%p;
        b>>=1;
    }
    return ans;
}
auto split(int pos){
    auto it=odt.lower_bound(node(pos));
    if(it!=odt.end()&&it->l==pos)
        return it;
    it--;
    if(it->r<x)
        return odt.end();
    int l=it->l,r=it->r;
    ll val=it->val;
    odt.erase(it);
    odt.insert(node(l,pos-1,val));
    return odt.insert(node(pos,r,val)).first;
}
void assign(int l,int r,ll val){
    auto itr=split(r+1),itl=split(l);
    odt.erase(itl,itr);
    odt.insert(node(l,r,val));
}
void update(int l,int r,ll val){
    auto itr=split(r+1),itl=split(l);
    for(auto it=itl;it!=itr;it++)
        it->val+=val;
}
ll kth(int l,int r,int k){
    vector<pii>vec;
    auto itr=split(r+1),itl=split(l);
    for(auto it=itl;it!=itr;it++)
        vec.push_back(pii(it->val,it->r-it->l+1));
    sort(vec.begin(),vec.end());
    for(auto it=vec.begin();it!=vec.end();it++){
        k-=it->second;
        if(k<=0)
            return it->first;
    }
    return -1;
}
ll sum(int l,int r,int x,int y){
    ll ans=0;
    auto itr=split(r+1),itl=split(l);
    for(auto it=itl;it!=itr;it++)
        ans=(ans+power(it->val,x,y)*(it->r-it->l+1))%y;
    return ans;
}
int main(){
    scanf("%d%d%d%d",&n,&m,&vmax,&seed);
    for(int i=1;i<=n;i++){
        a[i]=rnd()%vmax+1;
        odt.insert(node(i,i,a[i]));
    }
    while(m--){
        opt=rnd()%4+1,l=rnd()%n+1,r=rnd()%n+1;
        if(l>r)
            swap(l,r);
        if(opt==3)
            x=rnd()%(r-l+1)+1;
        else
            x=rnd()%vmax+1;
        if(opt==4)
            y=rnd()%vmax+1;
        if(opt==1)
            update(l,r,x);
        if(opt==2)
            assign(l,r,x);
        if(opt==3)
           printf("%lld\n",kth(l,r,x));
        if(opt==4)
            printf("%lld\n",sum(l,r,x,y));
    }
    return 0;
}
2023/12/21 23:04
加载中...