求大佬调试,已知change函数错误,二分不知道有没有坑
查看原帖
求大佬调试,已知change函数错误,二分不知道有没有坑
250036
Authentic_k楼主2021/5/28 20:02
#include<bits/stdc++.h>
using namespace std;
#define fxl_is_rk1 0
#define lp p << 1
#define rp p << 1 | 1
int a[110000],cz[110000];
int mid;
int n,m,q;
struct node
{
	int l,r,sum,add;
}T[110000];
struct ak
{
       int ask,l,r;	
}que[110000];
bool cmp(int b,int c)
{
	return b<c;
}
bool cmpp(int b,int c)
{
	return b>c;
}
void build(int p,int x,int y)
{
	 
	 T[p].l=x,T[p].r=y;
	 T[p].add=-1;
	 if(x==y)
	 { 
	    //cout<<" p="<<p<<" ";
	 	T[p].sum=cz[x];
	 	//cout<<cz[x]<<" "<<T[x].sum;
	 	return ;
	 }
	int midd=(x+y)/2;
	//cout<<midd<<endl;
	build(p*2,x,midd);
	build(p*2+1,midd+1,y);
	T[p].sum=T[p*2].sum+T[p*2+1].sum;
}
void spread(int p)
{
	 if(T[p].add!=-1)
	 {
	    T[lp].add=T[p].add;
	    T[rp].add=T[p].add;
	    T[lp].sum=(T[p].add)*(T[lp].r-T[lp].l+1);
	    T[rp].sum=(T[p].add)*(T[rp].r-T[rp].l+1);
	    T[p].add=-1;
	 }
}
void change(int p,int l,int r,int k)
{
	 if(r<=T[p].l||l>=T[p].r)
		return;
	 if(T[p].l>=l&&T[p].r<=r)
	 {
	 	T[p].sum=k*(T[p].r-T[p].l+1);
	 	T[p].add=k;
	 	return ;
	 }
	 spread(p);
     int mid=(T[p].l+T[p].r)/2;
	 if(l<=mid) change(p*2,l,r,k);
	 if(r>mid) change(p*2+1,l,r,k);
	 T[p].sum=T[p*2].sum+T[p*2+1].sum;
}
int ask(int p,int l,int r)
{
	if(T[p].l>=l&&T[p].r<=r)
	{
		return T[p].sum;
	}
	spread(p);
	int val=0;
	int midd=(T[p].l+T[p].r)>>1;
	if(l<=midd)
	{
		val+=ask(lp,l,r);
	}
	if(r>midd)
	{
		val+=ask(rp,l,r);
	}
	return val;
}
bool check(int r)
{
	 for(int i=1;i<=n;i++)
	 {
	 	//cout<<"mid="<<mid<<endl;
	 	if(a[i]<mid) cz[i]=0;
	 	else cz[i]=1;
	 }
	 build(1,1,n);
	 for(int i=1;i<=n;i++)
	 {
	 	cout<<ask(1,i,i)<<" ";
	 } cout<<endl;
	 for(int i=1;i<=m;i++)
	 {
	 	int ch=ask(1,que[i].l,que[i].r);
	 	if(que[i].ask==0)
	 	change(1,que[i].l,que[i].r-ch,0);
	 	change(1,que[i].r-ch+1,que[i].r,1);
		if(que[i].ask==1)
	 	change(1,que[i].l,que[i].l+ch-1,1);
	 	change(1,que[i].l+ch,que[i].r,0);
	 }
	 //cout<<"ask= "<<ask(1,q,q)<<endl;
	 return ask(1,q,q);
}
int main()
{
	//freopen("seq.in","r",stdin);
	//freopen("seq.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		//cz[i]=a[i];
	}
	for(int i=1;i<=m;i++)
	{
		cin>>que[i].ask>>que[i].l>>que[i].r;
	}
	cin>>q;
	int l=0,r=n;
	int ans;
	while(l<=r)
	{
	//	memset(T,0,sizeof(T));
	    mid=(l+r)/2;
		if(check(mid))
		{
			l=mid+1;
			ans=mid;
		}
		else r=mid-1;
	}
//	mid=2;
//	cout<<check(2)<<" "<<endl;
//    cout<<r<<endl;
//    mid=2;
//    if(check(2)); 
//	for(int i=1;i<=n;i++)
//	{
//		cout<<cz[i]<<" ";
//	}
    //mid=r;
    //if(check(r)) ans=r;
    //mid=5;
    //if(check(5))ans=5;
	cout<<ans;
	fclose(stdin);
    fclose(stdout);
    return fxl_is_rk1;
}
2021/5/28 20:02
加载中...