mle了30来发 花了两个半小时 终于找到bug a了这题
a了之后不知道该开心还是该骂自己sb

题目思路

题目挺简单的就是区间染色 最后统计总区间的颜色个数
因为区间数不算大 但是区间的端点值可以很大
所以要对区间进行离散化
离散化的时候要注意两个点之间差值大于1时要插入一个他们中间的值进去
具体解释可以看这个博客
https://blog.csdn.net/zezzezzez/article/details/80230026
懂了这些之后就是套离散化和区间染色板子的板子题了

离散化板子
https://blog.csdn.net/daydreamer23333/article/details/107264305

区间染色板子

void build(){memset(tree,0,sizeof(tree));
}
// 有这样的情况,底层有规定颜色,那么就不能用memset而是要用for循环
void build(int color){for(int i = 1;i <= len;i++){tree[i] = color;}
}
void update_range(int node, int l, int r, int L, int R, int add) {if (l <= L && r >= R) {lz[node] = add;tree[node] = add; // 更新方式return;}push_down(node, L, R);int mid = (L + R) / 2;if (mid >= l) update_range(node * 2, l, r, L, mid, add);if (mid < r) update_range(node * 2 + 1, l, r, mid + 1, R, add);if (tree[node * 2] == tree[node * 2 + 1]) {tree[node] = tree[node * 2];}else {tree[node] = -1;}
}void push_down(int node) {if (lz[node]) {int mid = (l + r) / 2;lz[node * 2] = lz[node];lz[node * 2 + 1] = lz[node];tree[node * 2] = lz[node];tree[node * 2 + 1] = lz[node];lz[node] = 0;}
}void query_range(int node, int L, int R, int l, int r) {if (l <= L && r >= R) {if (tree[node] == 0) return;if (tree[node] == -1) {push_down(node, L, R);int mid = (L + R) / 2;if (mid >= l) query_range(node * 2, L, mid, l, r);if (mid < r) query_range(node * 2 + 1, mid + 1, R, l, r);}else {if (color[tree[node]] == 0) {ans++;color[tree[node]] = 1;}}return;}push_down(node, L, R);int mid = (L + R) / 2;if (mid >= l) query_range(node * 2, L, mid, l, r);if (mid < r) query_range(node * 2 + 1, mid + 1, R, l, r);
}

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include  <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1000000007;
//998244353
int t[maxn<<2],lz[maxn<<2];
int color[maxn],n,ans;
vector<int>vec;
int li[maxn],ri[maxn];int getid(int x)
{return lower_bound(vec.begin(),vec.end(),x)-vec.begin()+1;
}void build(int rt,int l,int r)
{lz[rt]=0;t[rt]=0;if(l==r){return;}int mid=(l+r)>>1;build(lson,l,mid);build(rson,mid+1,r);
}void push_down(int rt)
{if(lz[rt]){lz[lson]=lz[rt];lz[rson]=lz[rt];t[lson]=lz[rt];t[rson]=lz[rt];lz[rt]=0;}
}void update(int rt,int l,int r,int L,int R,int v)
{if(L<=l&&r<=R){t[rt]=v;lz[rt]=v;return;}push_down(rt);int mid=(l+r)>>1;if(mid>=L)update(lson,l,mid,L,R,v);if(mid<R)update(rson,mid+1,r,L,R,v);if(t[lson]==t[rson])t[rt]=t[lson];elset[rt]=-1;
}void query(int rt,int l,int r,int L,int R)
{if(L<=l&&r<=R){if(t[rt]==0)return;if(t[rt]==-1){push_down(rt);int mid=(l+r)>>1;if(mid>=L)query(lson,l,mid,L,R);if(mid<R)query(rson,mid+1,r,L,R);}else{if(color[t[rt]]==0){ans++;//printf("t %d\n",t[rt]);color[t[rt]]=1;}}return;}push_down(rt);int mid=(l+r)>>1;if(mid>=L)query(lson,l,mid,L,R);if(mid<R)query(rson,mid+1,r,L,R);
}int main()
{int t;scanf("%d",&t);while(t--){vec.clear();scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&li[i],&ri[i]);vec.push_back(li[i]);vec.push_back(ri[i]);}sort(vec.begin(),vec.end());vec.erase(unique(vec.begin(),vec.end()),vec.end());int te=vec.size();//这里一定要注意 for(int i=1;i<te;i++)//如果直接写vec.size()的话会mle 坑了我两个小时{if(vec[i]-vec[i-1]>1)vec.push_back((vec[i-1]+1));}sort(vec.begin(),vec.end());build(1,1,vec.size());int cot=0;for(int i=1;i<=n;i++){int x1=getid(li[i]);int y1=getid(ri[i]);int ends=vec.size();update(1,1,ends,x1,y1,i);}for(int i=1;i<=n;i++)color[i]=0;ans=0;query(1,1,vec.size(),1,vec.size());printf("%d\n",ans);}
}

POJ - 2528 (线段树区间染色 + 离散化)相关推荐

  1. poj 2777(线段树+区间染色)

    解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的s ...

  2. 线段树区间染色 浮水法 学习小记 Poj 2777 + Poj 2528

    复习过的东西必须时常拿来练练,虽说都是水题.... Poj 2777 典型的区间染色问题,貌似我的写法为了不数组越界必须多开一倍的数组空间.....还没有想到解决方法,有机会参考一下别人的写法. Po ...

  3. poj 2528 线段树离散化+染色

    题目链接 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 2645 ...

  4. Hotel POJ - 3667(线段树 + 区间合并

    题意: 给定长度为n的区间 ,有2个操作: 操作1: 在区间中靠左放k个元素,输出新放入元素中最左边的位置,如果放不下输出 0: 操作2 : 清空 l 到 l+w-1这一段区间的元素 这里有一个状态转 ...

  5. POJ - 2528 线段树+离散化

    其实很早就在白书上的常用技巧上 看到离散化的操作,但是之前一直没遇到过需要离散化的题目(应该是我太菜的缘故),所以一直也没怎么重视,下面说说这道题目的考点,也就是离散化. 什么是离散化呢?请先自行百度 ...

  6. CodeForces - 1285E Delete a Segmen(线段树+区间合并+离散化)

    题目链接:点击查看 题目大意:给出n个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 题目分析:看到区间不难想到线段树了,虽然这个题也可以用stl贪心做, ...

  7. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  8. 线段树——区间离散化/压缩

    一.基本概念 线段树:线段树基本概念 离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率.通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小. 例如: 原数据 ...

  9. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

最新文章

  1. 一文带你了解Java的命名规范!
  2. Python+Matplotlib制作动画
  3. java中final是修饰符么_Java final修饰符详解
  4. c#官方推荐md5通用加密类
  5. Visualize real-time data streams with Gnuplot
  6. JetBrains:修改C盘中的JetBrains家族软件如PyCharm、WebStorm等的缓存文件位置
  7. 风扇转速/CPU温度监控工具推荐
  8. 北大中文核心期刊计算机类前30%名录
  9. SPI协议学习Cubmx——读写Flash W25Q64
  10. 实时监控input输入框,获取输入的内容,去除拼音
  11. Git和GitHub的关系和区别
  12. 2021我的前端开发年度总结
  13. 关于用C#实现宽带的连接
  14. 凸优化基础知识—凸集(Convex Sets)
  15. html5制作一个六角星,儿童节手工折纸六角星制作教程
  16. 2021-05-04 统计单词个数
  17. 博士申请 | 香港大学赵恒爽老师招收CV/ML/AI方向全奖博士/博后/RA
  18. MATLABnbsp;nbsp;median函数amp;nbs…
  19. 留住前端面试官目光简历到底是怎样?4个方面把你简历问题一一突破
  20. Pytorch中 nn.Transformer的使用详解与Transformer的黑盒讲解

热门文章

  1. Django REST framework+Vue 打造生鲜超市(十)
  2. C++ 主函数几种语法
  3. Qt的信号和槽是如何工作的
  4. 2022腾讯云年终双十一活动攻略汇总!
  5. Intel系统编程指南第八章——8.4 多处理器(MP)初始化
  6. 2021年晋城二中高考成绩查询,太骄傲 | 晋城八大高中高考成绩全记录!请为晋城学子点赞!...
  7. ACW830. 单调栈
  8. 如何讲述个人职业生涯
  9. HTML网页设计制作大作业(div+css)---浩瀚天文 (13页有二级菜单)
  10. 浅析:OMS和ERP、WMS、TMS之间的关系?