CE求调,悬关
  • 板块学术版
  • 楼主2333?
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/10/20 17:27
  • 上次更新2023/11/2 12:31:38
查看原帖
CE求调,悬关
467775
2333?楼主2023/10/20 17:27

) 找了好久看不出来有什么问题··· 所有代码:

#include <bits/stdc++.h>
using namespace std;
#define N 1000005
#define re(x) x=read()
#define lc (p<<1) 
#define rc (p<<1)|1
struct Tr{
	int l,r,num;
}t[N*4];
inline int read()
{
	int num=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<1)+(num<<3)+c-'0';c=getchar();}	
	return f*num;
}
int n,k,a[N],b[N];
void pushup(int p)
{
	t[p].num=min(t[lc].num,t[rc].num);
}
void updat(int p,int t,int x)
{
	if(t[p].l==t[p].r&&t[p].l==t)
	{
		t[p].num+=x; 
		return;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(mid<=t) updat(lc,t,x);
	else updat(rc,t,x);
	pushup(p);
}
void build(int p,int l,int r)
{
	t[p].l=l,t[p].r=r;
	if(l==r)
	{
		t[p].num=b[l];
		return;
	}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(p);
}
int ask(int p,int l,int r)
{
	if(t[p].l<=l&&t[p].r>=r)
		return t[p].num;
	int mid=(l+r)>>1;
	int min1=0x7f7f7f7f,min2=0x7f7f7f7f;
	if(mid>=r) min1=ask(lc,l,r);
	if(mid+1<=l) min2=ask(rc,l,r);
	return min(min1,min2);
}
int main()
{
	re(n);re(k);
	for(int i=1;i<=n;i++)
		re(a[i]);	
	for(int i=1;i<=n;i++)
		b[i]=a[i]-a[i-1];
		
//	for(int i=1;i<=n;i++)
//		cout<<b[i]<<' ';
		
	build(1,1,n);
	for(int i=1;i<=k;i++)
	{
		int op,l,r,x;
		re(op),re(l),re(r);
		if(r==n+1) r=n;
		if(op==1)
		{
			re(x);
			//b[l]+=x,b[r+1]-=x
			updat(1,l,x);
			updat(1,r+1,-x);
		
		}
		else
			if(ask(1,l,r)<0)
				printf("No\n");
			else
				printf("Yes\n");
	}
	return 0;
}

谢谢大佬orz

2023/10/20 17:27
加载中...