80pts线段树+树状数组求调
查看原帖
80pts线段树+树状数组求调
522981
海洋守卫者楼主2024/10/21 16:02

评测记录

TLE on 11-14,想不出更好的方法了

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<map>
#define int long long
using namespace std;
const int MAXN=3e6+5;
int n,q,c1,c2,w1,w2,a[MAXN],t[MAXN];
inline int read()
{
    int number=0,Fd=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
	{
        if(ch=='-')Fd=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')number=(number<<1)+(number<<3)+(ch^48),ch=getchar();
    return number*Fd;
}
inline void write(int number)
{
    if(number<0)putchar('-'),number=-number;
    if(number>9)write(number/10);
    putchar(number%10+'0');
}
struct Tree{
	int l,r,sum,laz;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define sum(x) tree[x].sum
	#define laz(x) tree[x].laz
}tree[MAXN<<1];
inline int Build(int p,int l,int r)
{
	l(p)=l,r(p)=r;
	if(l==r)return sum(p)=a[l];
	int mid=l+r>>1;
	return sum(p)=max(Build(p<<1,l,mid),Build(p<<1|1,mid+1,r));
}
inline int PushUp(int p)
{
	return sum(p)=max(sum(p<<1),sum(p<<1|1));
}
inline void PushDown(int p)
{
	if(laz(p))
	{
		sum(p<<1)+=laz(p);
		sum(p<<1|1)+=laz(p);
		laz(p<<1)+=laz(p);
		laz(p<<1|1)+=laz(p);
		laz(p)=0;
	}
}
inline void Change(int p,int l,int r,int d)
{
	if(l<=l(p)&&r(p)<=r)
	{
		sum(p)+=d,laz(p)+=d;
		return;
	}
	//printf("%lld ",p);
	PushDown(p);
	int mid=l(p)+r(p)>>1;
	if(l<=mid)Change(p<<1,l,r,d);
	if(mid<r)Change(p<<1|1,l,r,d);
	PushUp(p);
}
inline int Query(int p,int l,int r)
{
	if(l<=l(p)&&r(p)<=r)return sum(p);
	PushDown(p);
	int mid=l(p)+r(p)>>1,res=0;
	if(l<=mid)res=max(Query(p<<1,l,r),res);
	if(mid<r)res=max(Query(p<<1|1,l,r),res);
	return res;
}
inline int low(int x)
{
	return x&-x;
}
inline void add(int x,int d)
{
	while(x<=n)t[x]+=d,x+=low(x);
}
inline int query(int x)
{
	int res=0;
	while(x)res+=t[x],x-=low(x);
	return res;
}
main()
{
//	freopen("seq5.in","r",stdin);
//	freopen("seq5.out","w",stdout);
	n=read(),q=read(),c1=read(),c2=read(),w1=read(),w2=read();
	for(int i=1;i<=n;i++)a[i]=read(),add(i,a[i]);
	Build(1,1,n);
	while(q--)
	{
		int opt,x,y;
		opt=read(),x=read(),y=read();
		if(opt==1)add(x,y),Change(1,x,x,y),a[x]+=y;
		else{
			int tmp=Query(1,x,y);
			if(tmp>w1){
				puts("tetris");
				continue;
			}
			tmp=query(y)-query(x-1);
			if(tmp<=w1&&y-x+1<=c1){
				puts("cont");
				continue;
			}
			else if(tmp>=w2&&y-x+1<=c2){
				puts("tetris");
				continue;
			}
			else if(tmp<w2){
				puts("cont");
				continue;
			}
			tmp=query(x-1+c2)-query(x-1);
			int l=x,r=x-1+c2,TL=0,TR=0;
			while(r<=y)
			{
				if(tmp>=w2){
					TL=l;
					break;
				}
				tmp-=a[l++];
				tmp+=a[++r];
			}
			if(!TL)
			{
				puts("cont");
				continue;
			}
			tmp=query(y)-query(y-c2);
			l=y-c2+1,r=y,TR=0;
			while(l>=x)
			{
				if(tmp>=w2){
					TR=r;
					break;
				}
				tmp-=a[r--];
				tmp+=a[--l];
			}
			if(!TR)
			{
				puts("cont");
				continue;
			}
			tmp=query(TR)-query(TL-1);
			if(tmp<=w1&&TR-TL+1<=c1)puts("cont");
			else puts("tetris");
		}
	}
	return 0;
}
2024/10/21 16:02
加载中...