P3740 貼海報
阿新 • • 發佈:2018-06-24
algorithm man source return lse LG 離散化 AC 必須
P3740 貼海報
很顯然,這個題是讓我們維護一個區間的信息
可以考慮線段樹。可是這個題,正向思維可能並不可做。
所以我們考慮逆向思維。
打個比方,你是一名保潔人員。面對已經粘在墻上的,大大小小的廣告。你想要將他們撕下來。
而且你是一個有點強迫癥的的人(溜
你總是每天快要下班時打掃,而且他們貼小廣告的順序你也都知道。而且特別強迫癥地必須按照順序,一張一張地撕下來。
有可能你撕小廣告的時候,一張小廣告已經被撕成好多條,但你還是要必須將這幾條一起撕下來。
為了消遣,你想知道你一共撕下來多少張小廣告(重疊的算一張)
就像這樣:
你將最後貼的一張撕下來,變成了這樣:
,這就算一次
然後需要離散化
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int manx=1100;
int val[manx<<2],tag[manx<<2];
int data[manx<<1],tail;
int base[manx<<1],k;
struct node
{
int l,r;
};
node line[manx];
void make_base()
{
int now=-0x7fffffff;
for(int i=1;i<=tail;i++)
if (now!=data[i])
{
now=data[i];
base[++k]=now;
}
return ;
}
int find(int val)
{
int l=1,r=k;
int mid;
while(l<r)
{
mid=(l+r)>>1;
if(base[mid]<val) l=mid+1;
else r=mid;
}
return l;
}
void build(int root,int l,int r)
{
val[root]=base[r+1]-base[l];
tag[root]=0;
if(l==r) return ;
int mid=(l+r)>>1;
build(root<<1,l,mid);
build(root<<1|1,mid+1,r);
}
void push_down(int root)
{
if(tag[root])
{
val[root<<1]=0;val[root<<1|1]=0;
tag[root<<1]=1;tag[root<<1|1]=1;
tag[root]=0;
}
return ;
}
void push_up(int root)
{
val[root]=val[root<<1]+val[root<<1|1];
return ;
}
int check(int root,int l,int r,int al,int ar)
{
if(l>ar||r<al) return 0;
if(l>=al&&r<=ar) return val[root];
int mid=(l+r)>>1;
push_down(root);
return check(root<<1,l,mid,al,ar)+
check(root<<1|1,mid+1,r,al,ar);
}
void updata(int root,int l,int r,int al,int ar)
{
if(l>ar||r<al) return ;
if(l>=al&&r<=ar)
{
val[root]=0;
tag[root]=1;
return ;
}
int mid=(l+r)>>1;
push_down(root);
updata(root<<1,l,mid,al,ar);
updata(root<<1|1,mid+1,r,al,ar);
push_up(root);
return ;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int a,b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
data[++tail]=a;
data[++tail]=b+1;
line[i].l=a;line[i].r=b+1;
}
sort(data+1,data+1+tail);
make_base();
build(1,1,k-1);
int ans=0;
for(int i=m;i>=1;i--)
{
int pos1=find(line[i].l),pos2=find(line[i].r);
if(check(1,1,k-1,pos1,pos2-1)) ans+=1;
updata(1,1,k-1,pos1,pos2-1);
}
printf("%d",ans);
}
P3740 貼海報