博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2528 Mayor's posters 贴海报 线段树 区间更新
阅读量:6574 次
发布时间:2019-06-24

本文共 1538 字,大约阅读时间需要 5 分钟。

注意离散化!!!线段树的叶子结点代表的是一段!!!

给出下面两个简单的例子应该能体现普通离散化的缺陷:

1-10 1-4 5-10
1-10 1-4 6-10

普通离散化算出来的结果都会是2,但是第二组样例结果是3

如果相邻数字间距大于1的话,在其中加上任意一个数字,比如加成[1,2,3,6,7,10],然后再做线段树就好了.

线段树功能:update 成段更新,query 查询整个线段树

#include 
#include
#include
#include
#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1using namespace std;const int MAXN = 20010;int p[MAXN], mp[MAXN], pp[MAXN];int pst[MAXN<<4], ans;bool flag[MAXN];bool cmp(int A, int B){ return p[A] < p[B];}void push_down(int rt){ if(pst[rt] == 0) return; pst[rt<<1] = pst[rt<<1|1] = pst[rt]; pst[rt] = 0;}void update(int L, int R, int c, int l, int r, int rt){ if(L <= l && r <= R) { pst[rt] = c; return; } push_down(rt); int m = (l + r) >> 1; if(m >= L) update(L, R, c, lson); if(m < R) update(L, R, c, rson);}void query(int l, int r, int rt){ if(pst[rt] > 0) //只有大于0才有海报 { if(!flag[pst[rt]]) ans++; flag[pst[rt]] = 1; return; } if(l == r) return; push_down(rt); int m = (l + r) >> 1; query(lson); query(rson);}int main(){// freopen("in.txt", "r", stdin); int T, n; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=0; i
1) //大于1的插一个数 { N += 2; pp[mp[i]] = N; } else pp[mp[i]] = ++N; } memset(pst, 0, sizeof(pst)); for(int i=0; i

 

转载于:https://www.cnblogs.com/pach/p/7442620.html

你可能感兴趣的文章
得知发行组长老潘今天岗位上最后一天就要离开有感
查看>>
[转]WF事件驱动(1)
查看>>
异常关闭MyEclipse 8.6后,不能重启
查看>>
多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
查看>>
vue-cli中理不清的assetsSubDirectory 和 assetsPublicPath
查看>>
爆款 | Medium上6900个赞的AI学习路线图,让你快速上手机器学习
查看>>
Java基础知识梳理(五)从源码了解字符串
查看>>
从JDK源码角度看Short
查看>>
HTTP/2特性及其在实际应用中的表现
查看>>
解密Angular WebWorker Renderer (二)
查看>>
parceljs 中文文档24小时诞生记
查看>>
五年 Web 开发者 star 的 github 整理说明
查看>>
Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
查看>>
Android一种常见的布局困扰
查看>>
ReactNative字体大小不随系统字体大小变化而变化
查看>>
程序员思维看爱情是什么?
查看>>
android消息机制—Looper
查看>>
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>
为什么中台是传统企业数字化转型的关键?
查看>>
使用模板将Web服务的结果转换为标记语言
查看>>