#3wa了,心态炸了
查看原帖
#3wa了,心态炸了
250493
sssaberrrr楼主2021/7/7 14:50

这究竟是为什么呢?

#include<bits/stdc++.h>
#define int long long
#define si set<stu>::iterator

using namespace std;

struct stu{
	int l, r;
	mutable int val;
	
	bool operator<(const stu &a) const {return l < a.l;}
	
	stu(int L, int R, int Val):l(L), r(R), val(Val){};
	stu(int L):l(L){};
};

set<stu> s;

si split(int pos)
{
	si it = s.lower_bound(stu(pos));
	if(it!=s.end() && it->l==pos) return it;
	
	it--;
	int l=it->l, r=it->r, val=it->val;
	s.erase(it);
	s.insert(stu(l, pos-1, val));
	return s.insert(stu(pos, r, val)).first;
}

void assign(int l, int r, int val)
{
	si itl=split(l), itr=split(r+1);
	s.erase(itl, itr);
	s.insert(stu(l, r, val));
}

int n, m, seed, vmax;

int rnd()
{
	int ret = seed;
	seed = (seed*7+13)%1000000007;
	return ret;
}

int fp(int a, int b, int m)
{
//	printf("%lld %lld %lld\n", a, b, m);
    int t = 1;
    a %= m;
    while(b)
	{
        if(b&1) t = (t*a)%m;
        a = (a*a)%m;
        b >>= 1;
    }
//    printf("%lld\n", t);
    return t;
}

void add(int l, int r, int val)
{
	si itl=split(l), itr=split(r+1);
	for(si it=itl; it!=itr; it++)
		it->val += val;
}

int power(int l, int r, int x, int mod)
{
//	printf("%lld %lld %lld %lld\n", l, r, x, mod);
	si itl=split(l), itr=split(r+1);
	int res = 0;
	for(si it=itl; it!=itr; it++)
		res = (res+(it->r-it->l+1)*fp(it->val, x, mod))%mod;
	return res;
}

int query(int l, int r, int x)
{
	si itl=split(l), itr=split(r+1);
	vector<int> t;
	t.clear();
	
	for(si it=itl; it!=itr; it++)
		for(int i=1; i<=r-l+1; i++)
			t.push_back(it->val);
	
	if(x > t.size()) return -1;
	sort(t.begin(), t.end());
	return t[x];
}

signed main()
{
	scanf("%lld%lld%lld%lld", &n, &m, &seed, &vmax);
	
	for(int i=1; i<=n; i++)
	{
		int t = (rnd()%vmax)+1;
		s.insert(stu(i, i, t));
//		printf("%lld ", t);
	}
//	printf("\n");
	
	for(int i=1; i<=m; i++)
	{
		int op, l, r;
		op = (rnd()%4) + 1;
		l = (rnd()%n) + 1;
		r = (rnd()%n) + 1;
		if(l > r) swap(l, r);
		
		int x, y=-1;
		if(op == 3) x = (rnd()%(r-l+1)) + 1;
		else x = (rnd()%vmax) + 1;
		if(op == 4) y = (rnd()%vmax) + 1;
//		printf("%lld %lld %lld %lld %lld\n", op, l, r, x, y);
		
		if(op==1) add(l, r, x);
		else if(op==2) assign(l, r, x);
		else if(op==3) printf("%lld\n", query(l, r, x));
		else if(op==4) printf("%lld\n", power(l, r, x, y));
		
	}
	
    return 0;
}

2021/7/7 14:50
加载中...