结构体动态开点求助!!!
  • 板块P2574 XOR的艺术
  • 楼主YGW6
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/7/8 21:46
  • 上次更新2024/7/10 07:39:38
查看原帖
结构体动态开点求助!!!
938950
YGW6楼主2024/7/8 21:46

写完正常代码后想写动态开点结果就祭了QAQ

麻烦各位dalao了QAQ

这是结构体动态开点(后面还有正常代码)

#include<iostream>
#include<cmath>
#include<string>
#include<string.h>
#include<algorithm>

using namespace std;

const int N=2e5+5;

int n,m,cnt=1;
int a[N];

struct node
{
	int l,r,sum;
	int f;
}t[N*2];

void push_up(int &k)
{
	t[k].sum=t[2*k].sum+t[2*k+1].sum;
}

void push_down(int k)
{
	t[2*k].f^=1;
	t[2*k+1].f^=1;
	t[2*k].sum=t[2*k].r-t[2*k].l+1-t[2*k].sum;
	t[2*k+1].sum=t[2*k+1].r-t[2*k+1].l+1-t[2*k+1].sum;
	t[k].f=0;
}

void build(int &k,int l,int r)
{
	if(!k)
		k=++cnt;
	t[k].l=l,t[k].r=r;
	if(l==r)
	{
		t[k].sum=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(t[k].l,l,mid);
	build(t[k].r,mid+1,r);
	push_up(k);
}

void update(int &k,int l,int r)
{
	if(!k)
		k=++cnt;
	if(t[k].l>=l&&t[k].r<=r)
	{
		t[k].f^=1;
		t[k].sum=t[k].r-t[k].l+1-t[k].sum;
		return ;
	}
	if(t[k].f)
		push_down(k);
	int mid=(t[k].l+t[k].r)/2;
	if(l<=mid)
		update(t[k].l,l,r);
	if(r>mid)
		update(t[k].r,l,r);
	push_up(k);
}

int query(int k,int l,int r)
{
	if(!k)
		return 0;
	if(t[k].l>=l&&t[k].r<=r)
		return t[k].sum;
	int mid=(t[k].l+t[k].r)/2,tot=0;
	if(t[k].f)
		push_down(k);
	if(l<=mid)
		tot+=query(t[k].l,l,r);
	if(mid<r)
		tot+=query(t[k].r,l,r);
	return tot;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		char c;
		cin>>c;
		a[i]=c-'0';
	}
	int temp=1;
	build(temp,1,n);
	for(int i=1;i<=m;i++)
	{
		int op,l,r,temp=1;
		cin>>op>>l>>r;
		if(op==0)
//		{
			update(temp,l,r);
//			cout<<query(1,1,n)<<endl;
//		}
		else
			cout<<query(1,l,r)<<endl;
	}
	return 0;
}

这是正常代码

#include<iostream>
#include<cmath>
#include<string>
#include<string.h>
#include<algorithm>

using namespace std;

const int N=2e5+5;

int n,m;
int a[N];

struct node
{
	int l,r,sum;
	int f;
}t[N*4];

void push_up(int u)
{
	t[u].sum=t[2*u].sum+t[2*u+1].sum;
}

void push_down(int u)
{
	t[2*u].f^=1;
	t[2*u+1].f^=1;
	t[2*u].sum=t[2*u].r-t[2*u].l+1-t[2*u].sum;
	t[2*u+1].sum=t[2*u+1].r-t[2*u+1].l+1-t[2*u+1].sum;
	t[u].f=0;
//	t[2*u].sum=len-len/2-t[2*u].sum;
//	t[2*u+1].sum=len/2-t[2*u+1].sum;
}

void build(int u,int l,int r)
{
	t[u].l=l,t[u].r=r;
	if(l==r)
	{
		t[u].sum=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(2*u,l,mid);
	build(2*u+1,mid+1,r);
	push_up(u);
}

void update(int u,int l,int r)
{
	if(t[u].l>=l&&t[u].r<=r)
	{
		t[u].f^=1;
		t[u].sum=t[u].r-t[u].l+1-t[u].sum;
		return ;
	}
	if(t[u].f)
		push_down(u);
	int mid=(t[u].l+t[u].r)/2;
	if(l<=mid)
		update(2*u,l,r);
	if(r>mid)
		update(2*u+1,l,r);
	push_up(u);
}

int query(int u,int l,int r)
{
	if(t[u].l>=l&&t[u].r<=r)
		return t[u].sum;
	int mid=(t[u].l+t[u].r)/2,tot=0;
	if(t[u].f)
		push_down(u);
	if(l<=mid)
		tot+=query(2*u,l,r);
	if(mid<r)
		tot+=query(2*u+1,l,r);
	return tot;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		char c;
		cin>>c;
		a[i]=c-'0';
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op,l,r;
		cin>>op>>l>>r;
		if(op==0)
//		{
			update(1,l,r);
//			cout<<query(1,1,n)<<endl;
//		}
		else
			cout<<query(1,l,r)<<endl;
	}
	return 0;
}
2024/7/8 21:46
加载中...