社区讨论

这题是不能用线段树吗

P5057[CQOI2006] 简单题参与者 5已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lo3crwie
此快照首次捕获于
2023/10/24 04:31
2 年前
此快照最后确认于
2023/10/24 04:31
2 年前
查看原帖
还是我的线段树有问题/kk
以下是 TLE 代码。
CPP
#include<bits/stdc++.h>
using namespace std;
namespace Tree{
	const int maxn=100005;
	int val[maxn];
	int n,m;
	int ans=0;
	struct tree{
		int l,r;
		int lson,rson;
		int id;
	}a[maxn*2];
	int cnt=0;
	int Root;
	void Build(int &x,int l,int r){
		if(x==0){
			x=++cnt;
			a[x].l=l;
			a[x].r=r;
		}
		if(l==r){
			a[x].id=0;
			return ;
		}
		int mid=(l+r)/2;
		Build(a[x].lson,l,mid);
		Build(a[x].rson,mid+1,r);
	} 
	void change(int x,int l,int r){
		if(l>a[x].r||r<a[x].l)
			return ;
		if(a[x].l==a[x].r){
			a[x].id=(a[x].id==1)?0:1;
			return ;
		}
		change(a[x].lson,l,r);
		change(a[x].rson,l,r);
	}
	void ask(int x,int l){
		if(a[x].l>l||a[x].r<l)
			return ;
		if(a[x].l==a[x].r){
			ans=a[x].id;
			return ;
		}
		ask(a[x].lson,l);
		ask(a[x].rson,l);
	}
	int main(){
		scanf("%d%d",&n,&m);
		Build(Root,1,n);
		for(int i=1;i<=m;i++){
			int op;
			scanf("%d",&op);
			if(op==1){
				int l,r;
				scanf("%d%d",&l,&r);
				change(Root,l,r);
			}
			else{
				ans=0;
				int x;
				scanf("%d",&x);
				ask(Root,x);
				printf("%d\n",ans);
			}
		}
		return 0;
	}
}
int main(){return Tree::main();}

回复

10 条回复,欢迎继续交流。

正在加载回复...