为什么RE啊┭┮﹏┭┮
  • 板块CF52C Circular RMQ
  • 楼主dry_
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/26 20:25
  • 上次更新2023/11/26 22:21:35
查看原帖
为什么RE啊┭┮﹏┭┮
739299
dry_楼主2023/11/26 20:25
#include<bits/stdc++.h>
#define up1(a) a << 1
#define up2(a) a << a | 1
using namespace std;
int n,m,op,l,r,X;
const int maxn = 2000000 + 11;
long long in[maxn];
inline int read()
{
	register char in = getchar(),f = 0; register int t = 0;
	for(;in < '0' || in > '9';in = getchar())if(!(in ^ 45))f = 1;
	for(;in >= '0' && in <= '9';in = getchar())
	 t = (t << 1) + (t << 3) + (in ^ 48);
	if(in == ' ')op++; return f ? -t : t;
}
struct node
{
	int l; int r;
	long long num;
	long long add;
}tree[maxn << 1];
void build(int _l,int _r,int ind)
{
	tree[ind].l = _l;
	tree[ind].r = _r;
	if(tree[ind].l == tree[ind].r)
	{tree[ind].num = in[_l];return;}
	int m1 = (_l + _r) / 2; build(_l,m1,up1(ind));
	int m2 = m1 + 1; build(m2,_r,up2(ind));
	register long long p1 = tree[up1(ind)].num;
	register long long p2 = tree[up2(ind)].num;
	tree[ind].num = min(p1,p2);
}
void check(int ind)
{
	if(tree[ind].add)
	{
		tree[up1(ind)].num += tree[ind].add;
		tree[up2(ind)].num += tree[ind].add;
		tree[up1(ind)].add += tree[ind].add;
		tree[up2(ind)].add += tree[ind].add;
		tree[ind].add = 0;
	}
}
void amend(int l,int r,int ind,int x)
{
	if(tree[ind].l >= l && tree[ind].r <= r)
	{
		tree[ind].num = (tree[ind].num + x);
		tree[ind].add = (tree[ind].add + x);
		return;
	}
	check(ind);
	if(tree[ind].l == tree[ind].r)return;
	if(tree[up1(ind)].r >= l)amend(l,r,up1(ind),x);
	if(tree[up2(ind)].l <= r)amend(l,r,up2(ind),x);
	register long long p1 = tree[up1(ind)].num;
	register long long p2 = tree[up2(ind)].num;
	tree[ind].num = min(p1,p2);
}
long long find(int l,int r,int ind)
{
	if(tree[ind].l >= l && tree[ind].r <= r)
	 { return tree[ind].num; } check(ind);
	register long long p1 = LONG_LONG_MAX;
	if(tree[ind].l == tree[ind].r)return p1;
	if(tree[up1(ind)].r >= l)p1 = min(p1,find(l,r,up1(ind)));
	if(tree[up2(ind)].l <= r)p1 = min(p1,find(l,r,up2(ind)));
	return p1;
}
void CHECK(int l,int r)
{
	if(l <= r) printf("%lld\n",find(l,r,1));
	else printf("%lld\n",min(find(l,n,1),find(1,r,1)));
}
void CHECK2(int l,int r,int X)
{
	if(l <= r) amend(l,r,1,X);
	else amend(l,n,1,X),amend(1,r,1,X);
}
signed main()
{
	scanf("%d",&n);
	for(int i = 1;i <= n;i++)
	 scanf("%lld",&in[i]);
	build(1,n,1);
	scanf("%d",&m);
	for(register int i = 1;i <= m;i++)
	{
		op = 0,l = read(),r = read();l++,r++;
		if(op == 2) X = read(),CHECK2(l,r,X);
		if(op == 1) CHECK(l,r); op = 0;
	}
}

re了第七个点,就离谱

2023/11/26 20:25
加载中...