【传送门:BZOJ5029&BZOJ5168


简要题意:

  给出m段区间l[i],r[i],表示l[i]到r[i]的数全部变成i,求出最后有多少种不同的数


题解:

  线段树+离散化

  这是一道经典例题

  先离散化l和r,注意如果离散的时候,两个值相差大于1,就要新加一个值

  然后线段树维护区间颜色就行了


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct trnode
{
int l,r,lc,rc,c;
}tr[];int len;
void bt(int l,int r)
{
len++;int now=len;
tr[now].l=l;tr[now].r=r;tr[now].c=-;
tr[now].lc=tr[now].rc=-;
if(l<r)
{
int mid=(l+r)/;
tr[now].lc=len+;bt(l,mid);
tr[now].rc=len+,bt(mid+,r);
}
}
bool v[];
void wen(int now,int l,int r)
{
if(tr[now].c!=-)
{
v[tr[now].c]=true;
return ;
}
int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/;
if(r<=mid) wen(lc,l,r);
else if(l>mid) wen(rc,l,r);
else wen(lc,l,mid),wen(rc,mid+,r);
}
void change(int now,int l,int r,int k)
{
if(l==tr[now].l&&r==tr[now].r)
{
tr[now].c=k;
return ;
}
int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/;
if(tr[now].c>)
{
tr[lc].c=tr[now].c;
tr[rc].c=tr[now].c;
}
if(r<=mid) change(lc,l,r,k);
else if(mid<l) change(rc,l,r,k);
else
{
change(lc,l,mid,k);
change(rc,mid+,r,k);
}
if(tr[lc].c==tr[rc].c&&tr[lc].c!=-) tr[now].c=tr[lc].c;
else tr[now].c=-;
}
struct ask
{
int l,r,c;
bool bk;
ask()
{
bk=false;
}
}A[];
struct LSnode
{
int y,p,op;
}w[];int tot;
bool cmp(LSnode n1,LSnode n2){return n1.y<n2.y;}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
tot=;
for(int i=;i<=m;i++)
{
scanf("%d%d",&A[i].l,&A[i].r);A[i].c=i;
if(A[i].l>n) A[i].bk=true;
if(A[i].r>n) A[i].r=n;
tot++;w[tot].y=A[i].l,w[tot].p=i;w[tot].op=;
tot++;w[tot].y=A[i].r,w[tot].p=i;w[tot].op=;
}
sort(w+,w++tot,cmp);
int tt=,mmax=;
for(int i=;i<=tot;i++)
{
if(w[i].y!=w[i-].y) tt++;
if(w[i].y!=w[i-].y+&&w[i].y!=w[i-].y) tt++;
if(w[i].op==) A[w[i].p].l=tt;
else A[w[i].p].r=tt;
}
len=;bt(,tt);tr[].c=-;
for(int i=;i<=m;i++) if(A[i].bk==false) change(,A[i].l,A[i].r,A[i].c);
memset(v,false,sizeof(v));
wen(,,tt);
int ans=;
for(int i=;i<=m;i++) if(v[i]==true) ans++;
printf("%d\n",ans);
return ;
}

BZOJ5029: 贴小广告 & BZOJ5168: [HAOI2014]贴海报的更多相关文章

  1. bzoj5029: 贴小广告&&bzoj5168: [HAOI2014]贴海报

    以后做双精题请至少先跑个数据...输入都不一样... 做法就是离散化大力线段树. 记得在x+1和y-1插点 看这个数据: 1000 121 10050 8080 9950 981 56100 2002 ...

  2. bzoj5029 贴小广告

    Description 现在有一堵墙,墙上分为若干个单元.接下来会来n个人在墙上贴小广告.每次每个人选择墙上连续一段的单元贴上自己公司与众不同的小广告.因为小广告可能会出现被覆盖的情况,由于公司之间存 ...

  3. BZOJ5168: [HAOI2014]贴海报 线段树

    Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委 员 会为选民准备了一个张贴海报的electoral墙.张贴规则如下 ...

  4. 从运营商小广告到HTTPS

    相信很多人都试过这样的经历,浏览一个正常的网站时,右下突然角弹出一堆小广告,而且这些广告的内容和你浏览的网站格格不入: 前几天还有某微博用户爆料访问github时居然也有广告: 又或者,你有没有试过因 ...

  5. 【题解】Luogu P3740 [HAOI2014]贴海报

    woc,今天已经是day -1了 再写一颗珂朵莉树来++rp吧 否则就要AFO了qaq 这有可能是我最后一篇题解/博客qaq 原题传送门:P3740 [HAOI2014]贴海报 考前刷水题到底是对还是 ...

  6. 1682. [HAOI2014]贴海报

    1682. [HAOI2014]贴海报 ★★☆   输入文件:ha14d.in   输出文件:ha14d.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] Byteto ...

  7. PJzhang:关闭wps小广告和快速关闭445端口

    猫宁!!! ​​   kali linux上安装的wps,没有广告,而且轻巧简洁.   如果你在windows上安装wps,除了ppt.word.excel,还会有一个h5的应用,当然,最令人烦扰的当 ...

  8. cogs1682. [HAOI2014]贴海报 x

    1682. [HAOI2014]贴海报 ★★☆   输入文件:ha14d.in   输出文件:ha14d.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] Bytetow ...

  9. 淘宝小广告的鼠标移上实现html, JavaScript代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 'Upgrade' header is missing

    spring-websocket 握手失败是因为 有拦截器  注释掉拦截器就OK

  2. 写入~/.bashrc 文件

    1.进入~/.bashrc 文件 vim ~/.bashrc 2.按下I键,然后按Enter键 加入路径 3.按ESC键退出,再按:wq! 保存即可.

  3. makefile编写helloworld

    相信在unix下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其简单的例子: 现在我要编译一个Hello ...

  4. PatentTips - Controlling voltage and frequency

    BACKGROUND OF THE INVENTION Mobile devices, such as but not limited to personal data appliances, cel ...

  5. hadoop-17-hive数据库元数据查看

    hadoop-17-hive数据库元数据查看 存在本地的mysql中: user001用户中 : > mysql -uhive -phive mysql> use hive; mysql& ...

  6. Linux经常使用命令(九) - cat

    cat命令的用途是连接文件或标准输入并打印.这个命令经常使用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1. 命令格式: cat [选项] 文 ...

  7. struts2 validate验证

    转自:https://blog.csdn.net/houpengfei111/article/details/9038233 自定义拦截器 要自定义拦截器需要实现com.opensymphony.xw ...

  8. Linux中的find命令

    .递归查找(find 命令 是递归遍历文件夹的) 命令:find . -name “*.txt” //当前路径下递归查找以.txt结尾的文件夹 .不递归查找 find . -name “*.txt” ...

  9. Golang 在 Mac、Linux、Windows 下交叉编译

    Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能. Mac下编译Linux, Windows平台的64位可执行程序: CGO_ENABLED= GOOS=linux GOARCH= ...

  10. iOS 集成Protobuf,转换proto文件

    原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...