求助,样例无输出
查看原帖
求助,样例无输出
159959
虫洞吞噬者楼主2021/10/6 00:14

RT。我的思路就是将序列化作01序列后进行二分答案(具体操作与题解思路相同),只是写出来后没有输出,静态查错良久也没有任何实质性进展

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,maxn=-1,ans,sum,kk;
int num[100100],sta[100100],ln[100100],rn[100100],op[100100];
struct node{
	int l,r,sum,lz;
	bool flag;
}tree[100100];
void pushup(int id)
{
	tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
void pushdown(int id)
{
	if(!tree[id].flag)return;
	tree[id*2].lz=tree[id].lz;
	tree[id*2].flag=1;
	tree[id*2+1].lz=tree[id].lz;
	tree[id*2+1].flag=1;
	int mid=(tree[id].l+tree[id].r)/2;
	tree[id*2].sum=tree[id].lz*(mid-tree[id].l+1);
	tree[id*2+1].sum=tree[id].lz*(tree[id].r-mid);
	tree[id].flag=0;
}
void build(int id,int l,int r,int k)
{
	tree[id],l=l;tree[id].r=r;tree[id].flag=0;
	if(l==r)
	{
		tree[id].sum=(num[l]>=k);
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid,k);
	build(id*2+1,mid+1,r,k);
	pushup(id);
}
void make(int id,int l,int r,int k)
{
	if(l<=tree[id].l&&tree[id].r<=r)
	{
		tree[id].flag=1;
		tree[id].lz=k;
		tree[id].sum=(tree[id].r-tree[id].l+1)*k;
		return;
	}
	pushdown(id);
	int mid=(tree[id].l+tree[id].r)/2;
	if(l<=mid)make(id*2,l,r,k);
	if(r>mid)make(id*2+1,l,r,k);
	pushup(id);
}
int find(int id,int l,int r)
{
	if(l<=tree[id].l&&tree[id].r<=r)return tree[id].sum;
	pushdown(id);
	int mid=(tree[id].l+tree[id].r)/2;
	int sum=0;
	if(l<=mid)sum+=find(id*2,l,r);
	if(r>mid)sum+=find(id*2+1,l,r);
	pushup(id);
	return sum;
}
int findp(int id,int k)
{
	if(tree[id].l==tree[id].r&&tree[id].l==k)return tree[id].sum;
	pushdown(id);
	int mid=(tree[id].l+tree[id].r)/2;
	pushup(id);
	if(k<=mid)return findp(id*2,k);
	return findp(id*2+1,k);
}
bool check(int qwq)
{
	build(1,1,n,qwq);
	for(int i=1;i<=m;++i)
	{
		int cnt=find(1,ln[i],rn[i]);
		if(op[i])
		{
			make(1,ln[i],ln[i]+cnt-1,1);
			make(1,ln[i]+cnt,rn[i],0);
		}
		else
		{
			cnt=rn[i]-ln[i]-cnt+1;
			make(1,ln[i],ln[i]+cnt-1,0);
			make(1,ln[i]+cnt,rn[i],1);
		}
	}
	return findp(1,kk);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)scanf("%d",&num[i]);
	for(int i=1;i<=m;++i)scanf("%d%d%d",&op[i],&ln[i],&rn[i]);
	scanf("%d",&kk);
	int x=1,y=n;
	while(x<=y)
	{
		int mid=(x+y)/2;
		if(check(mid))
		{
			ans=mid;
			x=mid+1;
		}
		else y=mid-1;
	}
	printf("%d",ans);
	return 0;
}
2021/10/6 00:14
加载中...