POJ2528线段树段更新逆序异或(广告牌)
题意:
可以这样理解,有一条直线,然后用n条线段去覆盖,最后问全部都覆盖完之后还有多少是没有被完全覆盖的。
思路:
一开始想的有点偏,想到起点排序,然后..失败了,原因是忘记了题目输入的顺序就是覆盖的顺序,后来突然想到了逆序,这个题目想到逆序也就差不多了,我们可以逆序处理,然后用异或操作去判断当前这段是否全部都被覆盖了,只要异或不是1,那么就是还有没覆盖的,那么答案++,更新这段,把这段全都覆盖上。
#include<stdio.h>
#include<string.h>
#include<algorithm>#define N 20005
#define lson l ,mid ,t << 1
#define rson mid + 1 ,r ,t << 1 | 1using namespace std;typedef struct
{int l ,r;
}EDGE;EDGE E[N];
int X[N*4];
int mark[N*4];
int num[N] ,numt[N];void PushUp(int t)
{X[t] = X[t<<1] & X[t<<1|1];return ;
}void PushDown(int t)
{if(mark[t]){mark[t<<1] = mark[t<<1|1] = 1;X[t<<1] = X[t<<1|1] = 1;mark[t] = 0;}return ;
}void BuidTree()
{memset(X ,0 ,sizeof(X));memset(mark ,0 ,sizeof(mark));return ;
}void Update(int l ,int r ,int t ,int a ,int b)
{if(a <= l && b >= r){X[t] = mark[t] = 1;return ;}PushDown(t);int mid = (l + r) >> 1;if(a <= mid) Update(lson ,a ,b);if(b > mid) Update(rson ,a ,b);PushUp(t);
}int Query(int l ,int r ,int t ,int a ,int b)
{if(a <= l && b >= r)return X[t];PushDown(t);int mid = (l + r) >> 1;int s1 = -1 ,s2 = -1;if(a <= mid) s1 = Query(lson ,a ,b);if(b > mid) s2 = Query(rson ,a ,b);if(s1 == -1 && s2 == -1) return 0;if(s1 == -1) return s2;if(s2 == -1) return s1;return s1 & s2;
}int Search2(int n ,int a)
{int low = 1 ,up = n ,mid ,ans;while(low <= up){mid = (low + up) >> 1;if(a >= num[mid]){ans = mid;low = mid + 1;}else up = mid - 1;}return ans;
}int main ()
{int n ,i ,Ans ,t ,id ,nn;scanf("%d" ,&t);while(t--){scanf("%d" ,&n);for(id = 0 ,i = 1 ;i <= n ;i ++){scanf("%d %d" ,&E[i].l ,&E[i].r);numt[++id] = E[i].l;numt[++id] = E[i].r;}sort(numt + 1 ,numt + id + 1);nn = 0;for(i = 1 ;i <= id ;i ++)if(i == 1 || numt[i] != numt[i-1])num[++nn] = numt[i];BuidTree();for(Ans = 0 ,i = n ;i >= 1 ;i --){int l = Search2(nn ,E[i].l);int r = Search2(nn ,E[i].r);if(Query(1 ,nn ,1 ,l ,r)) continue;Ans ++;Update(1 ,nn ,1 ,l ,r);}printf("%d\n" ,Ans);}return 0;
}
POJ2528线段树段更新逆序异或(广告牌)相关推荐
- UVA11992不错的线段树段更新
题意: 给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v 把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v 把子矩阵的值全部都变成v 2 x ...
- hdu1556 线段树段更新(简单题)
题意: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个 ...
- hdu4267线段树段更新,点查找,55棵线段树.
题意: 给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新. 思路: ...
- POJ3277 线段树段更新,点询问+二分离散化+暴力
题意: x轴上有一些矩形,问你这些矩形覆盖的面积和是多少. 思路: 首先范围很大,n很小,果断离散化,然后我们就是求出任意区间的最大值作为当前区间的高,最后在算一遍答案就行了, ...
- hdu 5692 Snacks(dfs序+线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...
- poj-2528线段树练习
title: poj-2528线段树练习 date: 2018-10-13 13:45:09 tags: acm 刷题 categories: ACM-线段树 概述 这道题坑了我好久啊啊啊啊,,,, ...
- 【POJ - 3321】 Apple Tree(dfs序 + 线段树维护 或 dfs序 + 树状数组维护)
题干: There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the t ...
- HDUOJ----1166敌兵布阵(线段树单点更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu 3954(线段树区间更新)
转载标记处:http://www.cnblogs.com/wang-jue/articles/2920341.html 思路:这道题所得到的经验与每个英雄的等级有关,一般的可能就用线段树一直更新到每一 ...
最新文章
- 推荐60+ Flex开发参考网站
- Linux系统openssl升级,在Linux系统上升级OpenSSL的方法
- Multi GET API
- cad vba编程从入门到精通_【CAD教程】CAD2020零基础入门到精通全套视频教程
- 设计模式二:结构型模式
- vim编辑文件时显示行号
- Paper再现:MD+AI自动编码机探测蛋白变构(一):文章分析
- 线性代数 动手学深度学习 pytorch
- URL与URI的区别和联系
- 小米手机计算机连接设置方法,小米手机怎么连接电脑并上网?小米手机USB共享上网方法详细图解...
- word 参考文献插入整理
- 关于收发邮件中的一些概念解释(收件人 抄送人 密送人 回复 回复全部)
- Java-Mail Java程序发送Email
- 树的搜索问题1(深度优先、广度优先,爬山法和best-first)
- Java实现表格打印翻页_简单又实用的小文章来了----表格分页打印的那些小事(2)...
- 怎么在计算机中搜索可移动硬盘,电脑如何识别移动硬盘
- Vue动态组件、组件缓存、组件激活和非激活、组件插槽、组件name
- Nginx获取真实用户IP
- 用Java写一个五子棋小游戏
- 组战队,赢iPhone啦!