求助为什么会WA+MLE悬2关
  • 板块灌水区
  • 楼主ChenZQ
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/5 11:57
  • 上次更新2024/7/5 14:38:55
查看原帖
求助为什么会WA+MLE悬2关
745358
ChenZQ楼主2024/7/5 11:57

https://www.luogu.com.cn/problem/P2824 搞了一上午了tat

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int seg[400010];
int n,m,q;
int op[N],l[N],r[N];
int a[N],f[N];
int tag[N];
void build_tree(int l,int r,int u)
{
	tag[u]=0;
	if(l==r)
	{
		seg[u]=f[l];
		return;
	}
	
	int mid=(l+r)>>1;
	build_tree(l,mid,u<<1);
	build_tree(mid+1,r,u<<1|1);
	seg[u]=seg[u<<1]+seg[u<<1|1];
}
void pushdown(int u,int l,int r)
{
	if(!tag[u]) return;
	int m=(l+r)>>1;
	if(tag[u]==1)
	{
		seg[u<<1]=m-l+1;seg[u<<1|1]=r-m; 
		tag[u<<1]=tag[u<<1|1]=1;
	}
	else seg[u<<1]=seg[u<<1|1]=0,tag[u<<1]=tag[u<<1|1]=2;
}
int query(int l,int r,int ll,int rr,int u)
{
	if(l>=ll && r<=rr) return seg[u];
	if(l>rr || r<ll) return;
 	int mid=(l+r)>>1;
	int ans=0;
	if(mid>=ll) ans+=query(l,mid,ll,rr,u<<1);
	if(mid+1<=rr) ans+=query(mid+1,r,ll,rr,u<<1|1);
	return ans;
}
void update(int l,int r,int ll,int rr,int u,int p)
{
	if(l>=ll && r<=rr)
	{
		tag[u]=p;
		if(p==1) seg[u]=(r-l+1);
		else seg[u]=0;
		return;
	}
	int mid=(l+r)>>1;
	if(mid>=ll) update(l,mid,ll,rr,u<<1,p);
	if(mid+1<=rr) update(mid+1,r,ll,rr,u<<1|1,p);
	seg[u]=seg[u<<1]+seg[u<<1|1];
}
bool check(int k)
{
	for(int i=1;i<=n;i++)
	{
		if(a[i]>k) f[i]=1;
		else f[i]=0;
	}
	build_tree(1,n,1);
	for(int i=1;i<=m;i++)
	{
		int cnt=query(1,n,l[i],r[i],1);
		if(op[i])
		{
			update(1,n,l[i],l[i]+cnt-1,1,1);
			update(1,n,l[i]+cnt,r[i],1,2);
		}
		else
		{
			update(1,n,l[i],r[i]-cnt,1,2);
			update(1,n,r[i]-cnt+1,r[i],1,1);
		}
	}
	return query(1,n,q,q,1);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=m;i++) scanf("%d%d%d",&op[i],&l[i],&r[i]);
	int ll=1,rr=n,best=-1;
	scanf("%d",&q);
	while(ll<=rr)
	{
		int mid=(ll+rr)/2;
		if(check(mid)) ll=mid+1,best=mid;
		else rr=mid-1;
	}
	cout<<best<<endl;
	
} 
2024/7/5 11:57
加载中...