社区讨论
线段树 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 条回复,欢迎继续交流。
正在加载回复...