史山整体二分代码求调(悬1棺)
  • 板块灌水区
  • 楼主__DayLight__
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/4 15:43
  • 上次更新2024/5/4 15:45:23
查看原帖
史山整体二分代码求调(悬1棺)
642434
__DayLight__楼主2024/5/4 15:43

rt.


老师给的代码 1 和 l 非常难分清,我越调越离谱,输出都没有...

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m,ans[N];
struct node2
{
	int x,y,c,type,id;
}q[N],q1[N],q2[N];
struct node
{
	int l,r,f,sum;
}t[4*N];
void update(int node)
{
	t[node].sum=t[node*2].sum+t[node*2+1].sum;
}
void build(int node,int L,int R)
{
	t[node].l=L;
	t[node].r=R;
	if(L==R){t[node].sum=0;return;}
	int mid=L+R>>1;
	build(node*2,L,mid);
	build(node*2+1,mid+1,R);
	update(node);
}
void down(int node)
{
	int left_node=node*2;
	int right_node=node*2+1;
	if(t[node].f)
	{
		t[left_node].f+=t[node].f;
		t[left_node].sum+=(t[left_node].r-t[left_node].l+1)*t[node].f;
		t[right_node].f+=t[node].f;
		t[right_node].sum+=(t[right_node].r-t[right_node].l+1)*t[node].f;
		t[node].f=0;
	}
}
void add(int node,int L,int R,int x)
{
	int l=t[node].l;
	int r=t[node].r;
	int mid=l+r>>1;
	if(l>=L&&r<=R)
	{
		t[node].f+=x;
		t[node].sum+=(r-l+1)*x;
		return;
	}
	if(l>R||r<L)return;
	down(node);
	if(L<=mid)add(node*2,L,R,x);
	if(R>mid)add(node*2+1,L,R,x);
	update(node);
}
int qur(int node,int L,int R)
{
	int l=t[node].l;
	int r=t[node].r;
	int mid=l+r>>1;
	if(l>=L&&r<=R)return t[node].sum;
	if(l>R||r<L)return 0;
	int temp;
	down(node);
	if(L<=mid)temp+=qur(node*2,L,R);
	if(R>mid)temp+qur(node*2+1,L,R);
	return temp; 
}
void solve(int l,int r,int ql,int qr)
{
	if(l>r||ql>qr)return;
	int mid=l+r+l>>1;
	if(l==r)
	{
		for(int i=ql; i<=qr; i++)
			if(q[i].type==2)ans[q[i].id]=1;
		return;
	}
	int ct1=0,ct2=0;
	for(int i=ql; i<=qr; i++)
	{
		if(q[i].type==l)
		{
			if(q[i].c>=mid)
			{
				q2[++ct2]=q[i];
				add(l,q[i].x,q[i].y,1);
			}
			else q1[++ct1]=q[i];
		}
		else
		{
			int temp=qur(1,q[i].x,q[i].y);
			if(q[i].c<=temp)q2[++ct2]=q[i];
			else q[i].c-=temp,q1[++ct1]=q[i];
		}
	}
	for(int i=1; i<=ct2; i++)
		if(q2[i].type==1)add(1,q2[i].x,q2[i].y,-1);
	for(int i=1; i<=ct1; i++)
		q[ql+i-1]=q1[i];
	for(int i=1; i<=ct2; i++)
		q[ql+ct1+i-1]=q2[i];
	solve(l,mid-l,ql,ql+ct1-1);
	solve(mid,r,ql+ct1,qr);
	return;
}
signed main(){
	cin>>n>>m;
	build(1,1,n);
	int temp=0;
	for(int i=1; i<=m; i++)
	{
		int op,x,y,z;
		cin>>op>>x>>y>>z;
		if(op==1)q[i]={x,y,z,op,-1};
		else q[i]={x,y,z,op,++temp};
	}
	solve(-n,m,1,m);
	for(int i=1; i<=temp; i++)
		cout<<ans[i]<<endl;
	return 0;
}
2024/5/4 15:43
加载中...