社区讨论

线段树 100pts hack没过,玄关求条

P3740[HAOI2014] 贴海报参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mm5pore5
此快照首次捕获于
2026/02/28 10:38
2 周前
此快照最后确认于
2026/03/02 10:10
上周
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,m,tot,cnt,a[1005],b[1005],num[10005],tag[N>>2],segtr[N>>2];
void build(int rt,int l,int r){
	if(l==r){
		segtr[rt]=0;
		return;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	segtr[rt]=segtr[rt<<1]&segtr[rt<<1|1];
}
void push_down(int rt){
	if(tag[rt])segtr[rt<<1]=segtr[rt<<1|1]=tag[rt<<1]=tag[rt<<1|1]=1,tag[rt]=0;
}
void update(int rt,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr){
		segtr[rt]=tag[rt]=1;
		return;
	}
	push_down(rt);
	int mid=l+r>>1;
	if(ql<=mid)update(rt<<1,l,mid,ql,qr);
	if(qr>mid)update(rt<<1|1,mid+1,r,ql,qr);
	segtr[rt]=segtr[rt<<1]&segtr[rt<<1|1];
}
int search(int x){
	return lower_bound(num+1,num+tot+1,x)-num;
}
int query(int rt,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr)return segtr[rt];
	push_down(rt);
	int mid=l+r>>1;
	bool ans=1;
	if(ql<=mid)ans&=query(rt<<1,l,mid,ql,qr);
	if(qr>mid)ans&=query(rt<<1|1,mid+1,r,ql,qr);
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		cin>>a[i]>>b[i];
		num[++cnt]=a[i],num[++cnt]=b[i],num[++cnt]=b[i]+1;
	}
	sort(num+1,num+cnt+1);
	tot=unique(num+1,num+cnt+1)-num-1;
	build(1,1,tot);
	int ans=0;
	for(int i=m;i>=1;--i){
		int l=search(a[i]),r=search(b[i]);
		if(!query(1,1,tot,l,r)){
			ans++;
			update(1,1,tot,l,r);
		}
	}
	cout<<ans<<endl;
	return 0;
}
https://www.luogu.com.cn/record/264558016,和这篇题解思路差不多但就是过不了,请大佬指教,可关。

回复

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

正在加载回复...