Stone Games (nowcoder)(主席树)

题目地址
配套地址
在这里插入图片描述

对于一个连续的序列,例如[1 … k ] 那么一定能构造出 1到 1 + 2 + … + k 的数。
假设当前已经能够形成 [ 1 … x ] 的序列,此时x是最大能构造数,
接下来判断x+1是否能被构造,将小于等于(x + 1)的数的总和求出来,为sum.

  1. 如果sum != x,则能构造出[1 … sum] 序列。
  2. 否则,x+1就是最小不能构造的值。

一直迭代,直到得到答案。这个迭代类似于斐波那契。
初始x为0.

将区间中小于等于(x + 1)的值加起,用主席树维护。

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
//#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int N = 1e6 + 10;
const int mod = 1e9 + 7;

#define ls(x) t[x].ls
#define rs(x) t[x].rs
#define sum(x) t[x].sum

struct LSegmentTree{
	int ls,rs;
	ll sum;
}t[N << 5];
int idx = 0,rt[N];
ll len = 1e9 + 10;

int update(int p,int l,int r,int v){
	int root = ++idx;
	ls(root) = ls(p),rs(root) = rs(p),sum(root) = sum(p) + v;
	if(l == r) return root;
	int mid = (l + r) >> 1;
	if(v <= mid) ls(root) = update(ls(root),l,mid,v);
	else rs(root) = update(rs(root),mid+1,r,v);
	return root;
}

ll query(int lp,int rp,int l,int r,ll v){
	if(l == r) return sum(rp) - sum(lp);
	int mid = (l + r) >> 1;
	if(v <= mid) return query(ls(lp),ls(rp),l,mid,v);
	else return query(rs(lp),rs(rp),mid+1,r,v) + sum(ls(rp)) - sum(ls(lp));
}

signed main(){
    int n,m; scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		int a; scanf("%d",&a);
		rt[i] = update(rt[i-1],1,len,a);
	}
	ll last = 0;
	while(m --){
		int l,r; scanf("%d %d",&l,&r);
		l = (l + last) % n + 1;
		r = (r + last) % n + 1;
		if(l > r) swap(l,r);
		ll now = 0;
		while(true){
			ll ne = query(rt[l-1],rt[r],1,len,min(now+1,len));
			if(ne == now) break;
			now = ne;
		}
		printf("%lld\n",now+1);
		last = now + 1;
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值