总会有地上的生灵,敢于直面雷霆的威光|

sLMxf

园龄:1年6个月粉丝:2关注:0

题解:SP138 POSTERS - Election Posters

Sol

Subtask 1

有一种简单的方式:将所有的海报先贴上去,然后在看每个位置是哪一张海报。

这个时间复杂度是 O(T(rl)log(rl))O(T(r-l)\log (r-l)) 的,肯定会 TLE。

Subtask 2

因为 nn 很小,所以将其离散化即可。

时间复杂度 O(Tnlogn)O(Tn\log n),非常充裕。

code

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int n=800005;
struct Segment_tree{
int a[800005],w[4*800005],lzy[4*800005];
void pushup(int u)
{
w[u]=w[u<<1]+w[u<<1|1];
}
void build(int u=1,int l=1,int r=n)
{
if(l==r)
{
w[u]=a[l];
return;
}
int mid=(l+r)/2;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
bool InRangeOf(int L,int R,int l,int r)
{
return (l<=L)&&(R<=r);
}
bool OutRangeOf(int L,int R,int l,int r)
{
return (L>r)||(R<l);
}
void maketag(int u,int len,int x)
{
w[u]=x*len;
lzy[u]=x;
}
void pushdown(int u,int l,int r)
{
int mid=(l+r)/2;
if(lzy[u]){maketag(u<<1,mid-l+1,lzy[u]);
maketag(u*2+1,r-mid,lzy[u]);}
lzy[u]=0;
}
void update(int l,int r,int x,int u=1,int L=1,int R=n)
{
if(InRangeOf(L,R,l,r)) maketag(u,R-L+1,x);
else if(!OutRangeOf(L,R,l,r))
{
int mid=(L+R)/2;
pushdown(u,L,R);
update(l,r,x,u<<1,L,mid);
update(l,r,x,u<<1|1,mid+1,R);
pushup(u);
}
}
int query(int l,int r,int u=1,int L=1,int R=n)
{
if(InRangeOf(L,R,l,r)) return w[u];
else if(!OutRangeOf(L,R,l,r))
{
int mid=(L+R)/2;
pushdown(u,L,R);
return query(l,r,u<<1,L,mid)+query(l,r,u<<1|1,mid+1,R);
}
else return 0;
}
}a;
map<int,int>dy,py;
int tot=0,p[1000005],l[1000005],r[1000005];
bool f[1000005];
void lsh()
{
sort(p+1,p+tot+1);
int len=unique(p+1,p+tot+1)-p-1;
for(int i=1;i<=len;i++) dy[p[i]]=i,py[i]=p[i];
}
int Main()
{
int m,ans=0;
cin>>m;
for(int i=1;i<=1000000;i++) f[i]=0;
for(int i=1;i<=m;i++)
{
cin>>l[i]>>r[i];
p[++tot]=l[i];
p[++tot]=r[i];
}
lsh();
for(int i=1;i<=m;i++) l[i]=dy[l[i]],r[i]=dy[r[i]];
for(int i=1;i<=n;i++) a.a[i]=0;
a.build();
for(int i=1;i<=m;i++) a.update(l[i],r[i],i);
for(int i=1;i<=n;i++)
{
int x=a.query(i,i);
if(f[x]==0&&x!=0)
{
f[x]=1;
ans++;
}
}
cout<<ans<<endl;
for(int i=1;i<=m;i++)
dy[py[l[i]]]=dy[py[r[i]]]=0,py[l[i]]=py[r[i]]=0;
return 0;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
for(;T--;Main());
return 0;
}

本文作者:sLMxf

本文链接:https://www.cnblogs.com/SLMXF/p/18564525

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   sLMxf  阅读(2)  评论(0编辑  收藏  举报  
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示