P11217求调
查看原帖
P11217求调
767660
zhaohanwen楼主2024/10/20 21:35

考场为了获得部分分的代码,但是为什么WA了?按思路来说除了TLE的点都能AC

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define nhd1 cerr<<"nahida_is_lovely1"<<endl;
#define nhd2 cerr<<"nahida_is_lovely2"<<endl;
#define D(x) cerr<<#x<<'='<<x<<endl;
#define pb push_back
#define lb long double
#define mp make_pair
#define R(i,a) for(int i=1;i<=a;i++)
const int N=2e5+5;
int n,q,len;
template <typename T>
inline void read(T &x)
{
   T s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   x=s*w;
}
template <typename T>
inline void write(T x)
{
    if(x<0) {
        putchar('-');
        x = -x;
    }
    if(x>9) write(x / 10);
    putchar(x % 10 + '0');
}
ll W;
ll a[N],block[N],tag[N],id[N];
void build()
{
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		id[i]=(i-1)/len+1;
		block[id[i]]+=a[i];
	}
}
void pushdown(int k)
{
	if(tag[k])
	{
		for(int i=(k-1)*len+1;i<=k*len;i++)
		{
			a[i]+=tag[k];
		}
		tag[k]=0;
	}
}
void update(int l,int r,ll w)//区间加 
{
	int p1=id[l],p2=id[r];
	if(p1==p2)
	{
		for(int i=l;i<=r;i++)
		{
			a[i]+=w;
			block[p1]+=w;
		}
		return ;
	}
	for(int i=l;i<=p1*len;i++)
	{
		a[i]+=w;
		block[p1]+=w;
	}
	for(int i=(p2-1)*len+1;i<=min(r,n);i++)
	{
		a[i]+=w;
		block[p2]+=w;
	}
	for(int i=p1+1;i<=p2-1;i++)
	{
		block[i]+=1LL*len*w;
		tag[i]+=w;
	}
}
ll ans=0;
inline void query(int l,int r,ll k)//查询区间和,得改。 
{
	int p1=id[l],p2=id[r];
	pushdown(p1);pushdown(p2);
	if(p1==p2)
	{
		for(int i=l;i<=r;i++)
		{
			W-=(a[i]*k);
			if(W<=0)
			{
				return ;
			}
			ans++;
//			D(ans);D(W); 
		}
		query(l,r,k*2);
	}
	for(int i=l;i<=p1*len;i++)
	{
		W-=a[i]*k;
		if(W<=0)
		{
			return ;
		}
		ans++;
//		D(ans);D(W); 
	}
	for(int i=p1+1;i<=p2-1;i++)
	{
		W-=block[i]*k;
		if(W<=0)
		{
			W+=block[i]*k;
			pushdown(i);
			for(int j=(i)*len;j<=(i+1)*len-1;j++)
			{
				W-=(a[j]*k);
				if(W<=0)
				{
					return ;
				}
				ans++;
//				D(ans);D(W); 
			}
		}
		ans+=len;
//		D(ans);D(W); 
	}
	for(int i=(p2-1)*len+1;i<=min(r,n);i++)//调一个顺序 
	{
		W-=a[i]*k;
		if(W<=0)
		{
			return ;
		}
		ans++;
//		D(ans);D(W); 
	}
	query(l,r,k*2);
}
int main()
{
//	freopen("wxyt2.in","r",stdin);
//	freopen("wxyt2.out","w",stdout);
	read(n);read(q);read(W);
	ll nahida=W;
	for(int i=1;i<=n;i++) read(a[i]);
	build();
	while(q--)
	{
		int l,r;
		read(l);read(r);
		int k;
		read(k);
		update(l,r,k);
		W=nahida;
		query(1,n,1);
		write(ans);
		putchar('\n');
		ans=0;
	}
	return 0;
}
2024/10/20 21:35
加载中...