BZOJ5029: 贴小广告 & BZOJ5168: [HAOI2014]贴海报
【传送门: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]贴海报的更多相关文章
- bzoj5029: 贴小广告&&bzoj5168: [HAOI2014]贴海报
以后做双精题请至少先跑个数据...输入都不一样... 做法就是离散化大力线段树. 记得在x+1和y-1插点 看这个数据: 1000 121 10050 8080 9950 981 56100 2002 ...
- bzoj5029 贴小广告
Description 现在有一堵墙,墙上分为若干个单元.接下来会来n个人在墙上贴小广告.每次每个人选择墙上连续一段的单元贴上自己公司与众不同的小广告.因为小广告可能会出现被覆盖的情况,由于公司之间存 ...
- BZOJ5168: [HAOI2014]贴海报 线段树
Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委 员 会为选民准备了一个张贴海报的electoral墙.张贴规则如下 ...
- 从运营商小广告到HTTPS
相信很多人都试过这样的经历,浏览一个正常的网站时,右下突然角弹出一堆小广告,而且这些广告的内容和你浏览的网站格格不入: 前几天还有某微博用户爆料访问github时居然也有广告: 又或者,你有没有试过因 ...
- 【题解】Luogu P3740 [HAOI2014]贴海报
woc,今天已经是day -1了 再写一颗珂朵莉树来++rp吧 否则就要AFO了qaq 这有可能是我最后一篇题解/博客qaq 原题传送门:P3740 [HAOI2014]贴海报 考前刷水题到底是对还是 ...
- 1682. [HAOI2014]贴海报
1682. [HAOI2014]贴海报 ★★☆ 输入文件:ha14d.in 输出文件:ha14d.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] Byteto ...
- PJzhang:关闭wps小广告和快速关闭445端口
猫宁!!! kali linux上安装的wps,没有广告,而且轻巧简洁. 如果你在windows上安装wps,除了ppt.word.excel,还会有一个h5的应用,当然,最令人烦扰的当 ...
- cogs1682. [HAOI2014]贴海报 x
1682. [HAOI2014]贴海报 ★★☆ 输入文件:ha14d.in 输出文件:ha14d.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] Bytetow ...
- 淘宝小广告的鼠标移上实现html, JavaScript代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- 《鸟哥的Linux私房菜》读书笔记--第0章 计算机概论 硬件部分
一个下午看了不少硬件层面的知识,看得太多太快容易忘记.于是在博客上写下读书笔记. 有关硬件 个人计算机架构&接口设备 主板芯片组为“南北桥”的统称,南北桥用于控制所有组件之间的通信. 北桥连接 ...
- 使用 vue + thinkjs 开发博客程序记录
一入冬懒癌发作,给自己找点事干.之前博客程序写过几次,php 的写过两次,nodejs 用 ThinkJS 写过,随着 ThinkJS 版本从1.x 升级到 2.x 之前的博客程序也做过升级.但是因为 ...
- 紫书 例题8-14 UVa 1607 (二分)
题意非常难理解-- #include<cstdio> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namesp ...
- shell的通俗理解
(引自:https://zhidao.baidu.com/question/557066905.html) [一] shell的含义: 首先shell的英文含义是“壳”: 它是相对于内核来说的,因为它 ...
- MATLAB曲线拟合
转自原文 MATLAB曲线拟合 曲线拟合 实例:温度曲线问题 气象部门观测到一天某些时刻的温度变化数据为: t 0 1 2 3 4 5 6 7 8 9 10 T 13 15 17 14 16 19 2 ...
- springMVC 配置jdbcTemplate连接Oracle数据库出错
springMVC 配置jdbcTemplate连接Oracle数据库出错 错误信息: log4j:WARN No appenders could be found for logger (org.s ...
- ubuntu 各种窗体操作
通用 ctrl+alt+0~9 改变窗体大小和是否显示 alt+F4 关闭窗体菜单键+相应启动器位置的编号打开程序 ctrl+pageup/pagedown 在tab间移动 ctrle+shift+p ...
- Android中的Junit测试
在开发中Junit测试可以很方便的帮助开者尽可能早的发现并处理问题,而且使用也非常简单,只需要导入Junit测试相关的jar包并创建测试类,就可以对业务功能进行测试,而不用为了测试在代码中添加输出语句 ...
- mysql读写分离的解决方案
来源于网上整理 http://yanwt.iteye.com/blog/1460780 现有三种解决方式实现mysql读写分离 1 程序修改mysql操作类 优点:直接和数据库通信,简单快捷的读写分离 ...
- 洛谷P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树_标记永久化
Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...