刚学ODT,求助QAQ
查看原帖
刚学ODT,求助QAQ
160839
Prean楼主2020/7/22 09:17

样例过了,WA了。。。

不会是我随机数取错了吧

#include<algorithm>
#include<utility>
#include<cstdio>
#include<vector>
#include<set>
typedef long long ll;
inline ll pow(ll a,ll b,ll mod){
    ll ans=1;a%=mod;
    for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;
    return ans;
}
struct Node{
    int L,R;
    mutable ll val;
    Node(int L,int R=-1,ll val=0):L(L),R(R),val(val){}
    inline bool operator<(const Node&b) const {
        return L<b.L;
    }
};
typedef std::set<Node>::iterator Iter;
std::set<Node>Chtholly;
inline Iter spilt(int pos){
    Iter iter=Chtholly.lower_bound(Node(pos));
    if(iter!=Chtholly.end()&&iter->L==pos)return iter;
    --iter;
    int L=iter->L,R=iter->R,V=iter->val;
    Chtholly.erase(iter);
    Chtholly.insert(Node(L,pos-1,V));
    return Chtholly.insert(Node(pos,R,V)).first;
}
inline void Add(int L,int R,ll val=1){
    Iter iter=spilt(L),end=spilt(R+1);
    for(;iter!=end;++iter)iter->val+=val;
}
inline void assign(int L,int R,ll val=0){
    Iter terL=spilt(L),terR=spilt(R+1);
    Chtholly.erase(terL,terR);
    Chtholly.insert(Node(L,R,val));
}
inline ll Rank(int L,int R,int k){
    std::vector<std::pair<ll,int> >s;
    Iter iter=spilt(L),end=spilt(R+1);
    for(;iter!=end;++iter){
        s.push_back(std::pair<ll,int>(iter->val,iter->R-iter->L+1));
    }
    std::sort(s.begin(),s.end());
    for(std::vector<std::pair<ll,int> >::iterator iter=s.begin();iter!=s.end();++iter){
        k-=iter->second;
        if(k<=0)return iter->first;
    }
    return -1ll;
}
inline ll Sum(int L,int R,ll k,ll mod){
    Iter iter=spilt(L),end=spilt(R+1);
    ll ans=0;
    for(;iter!=end;++iter){
        ans=(ans+(iter->R-iter->L+1)*pow(iter->val,k,mod)%mod)%mod;
    }
    return ans;
}
ll n,m,seed,vmax;
const int MOD=1e9+7;
inline ll rnd(){
	ll ret=seed;
	seed=(seed*7+13)%MOD;
	return ret;
}
signed main(){
    int i;
    scanf("%lld%lld%lld%lld",&n,&m,&seed,&vmax);
    for(i=1;i<=n;++i)Chtholly.insert(Node(i,i,rnd()%vmax+1));
    Chtholly.insert(Node(n+1,n+1,0));
    for(i=1;i<=m;++i){
		int op=rnd()%4+1,L=rnd()%n+1,R=rnd()%n+1,x,y;
		if(L>R)L^=R^=L^=R;
        x=rnd()%(op==3?R-L+1: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("%lld\n",Rank(L,R,x));
        }
        if(op==4){
            printf("%lld\n",Sum(L,R,x,y));
        }
    }
}
2020/7/22 09:17
加载中...