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 | 1
using 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线段树段更新逆序异或(广告牌)的更多相关文章
- POJ2828线段树单点更新——逆序更新
		Description 输入n个有序对< pi, vi >,pi表示在第pi个位置后面插入一个值为vi的人,并且pi是不降的.输出最终得到的v的序列 Input 多组用例,每组用例第一行为 ... 
- UVA11992不错的线段树段更新
		题意: 给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v 把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v 把子矩阵的值全部都变成v 2 x ... 
- hdu4267线段树段更新,点查找,55棵线段树.
		题意: 给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新. 思路: ... 
- hdu1556 线段树段更新(简单题)
		题意: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个 ... 
- POJ3277 线段树段更新,点询问+二分离散化+暴力
		题意: x轴上有一些矩形,问你这些矩形覆盖的面积和是多少. 思路: 首先范围很大,n很小,果断离散化,然后我们就是求出任意区间的最大值作为当前区间的高,最后在算一遍答案就行了, ... 
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
		POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ... 
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
		POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ... 
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
		HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ... 
- POJ-2528 Mayor's posters(线段树区间更新+离散化)
		http://poj.org/problem?id=2528 https://www.luogu.org/problem/UVA10587 Description The citizens of By ... 
随机推荐
- three.js cannon.js物理引擎之齿轮动画
			郭先生今天继续说一说cannon.js物理引擎,并用之前已经学习过的知识实现一个小动画,知识点包括ConvexPolyhedron多边形.Shape几何体.Body刚体.HingeConstraint ... 
- 记一次Drone无法触发构建的问题
			问题 好巧不巧,当你晚上准备上线的时候,在下午临近下班的时候CI&CD工具出问题了,提交代码不能触发构建,不能上线了,Drone平台那边也下班了,正好CICD依赖的公司git仓库也出问题了(就 ... 
- 基于云原生DevOps服务自动化部署前端项目学习总结
			本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ... 
- Linux速通02 命令格式
			命令的格式 # 格式:命令 [选项][参数] * 命令:告诉 Linux操作系统执行什么 * 选项:说明命令运行的方式(可以改变命令的功能).以 "-"字符开始 * 参数:说明命令 ... 
- httpPost的两种方式
			1,post-Body流和post参数,以下客户端代码和服务端代码可共用 客户端代码 /** * post 方法 * 抛送给EDI * @param url http://127.0.0.1:9003 ... 
- 助力面试之ConcurrentHashMap面试灵魂拷问,你能扛多久
			目录 前言 ConcurrentHashMap 原理 JDK1.8 版本 ConcurrentHashMap 做了什么改进 为什么 key 和 value 不允许为 null ConcurrentHa ... 
- Mark一个代码量统计工具-Statistic
			安装方式 IDEA.Goland系列插件市场搜索Statistic 简单说明 统计纬度比较丰富 基本覆盖常见纬度,如代码行数,文件大小等,各指标取最大最小及平均值. 统计目录为当前项目目录 只有在当前 ... 
- 《进击吧!Blazor!》系列入门教程 第一章 7.图表
			<进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ... 
- JAVA面试核心知识点(一):计算机网络
			一·计算机网络 1.1 网络基础知识 OSI 七层协议(制定标准使用的标准概念框架): 物理层(传递比特流0101)->数据链路层(将比特流转换为逻辑传输线路)->网络层(逻辑编址,分组传 ... 
- [题解] [NOI Online 2021 入门组 T3] 重力球
			题目大意 在一个 \(n\times n\) 的矩形中,题目会给出 \(m\) 个障碍物.有两个小球,你可以选定四个方向(上下左右)的其中一个,小球会朝着这四个方向一直滚动,直到遇到障碍物或是矩形的边 ... 
