hiho1079 线段树区间改动离散化

题目链接:

hihocoder1079

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100050
using namespace std;
int cnt[maxn<<1];
int v[maxn<<2];
int vis[maxn<<2]={0};
int modify[maxn][2];
int ans=0;
void travel(int l,int r,int rt)
{
    if(v[rt])
    {
        if(!vis[v[rt]])
            vis[v[rt]]=1,ans++;
        return;
    }
    if(l==r)
        return;
    int m=(l+r)>>1;
    travel(lson);
    travel(rson);
}
void update(int L,int R,int w,int l,int r,int rt)
{
    if(L<=l&&R>=r)
    {
        v[rt]=w;
        return;
    }
    if(v[rt])
    {
        v[rt<<1|1]=v[rt<<1]=v[rt];
        v[rt]=0;
    }
    int m=(l+r)>>1;
    if(L<=m)
        update(L,R,w,lson);
    if(R>m)
        update(L,R,w,rson);
}
int main()
{
//    freopen("in.txt","r",stdin);
    int d,n,a,b,s=0;
    scanf("%d%d",&d,&n);
    for(int i=1; i<=d; i++)
    {
        scanf("%d%d",&modify[i][0],&modify[i][1]);
        cnt[s++]=modify[i][0];
        cnt[s++]=modify[i][1];
    }
    sort(cnt,cnt+s);
    s=unique(cnt,cnt+s)-cnt;
    for(int i=1; i<=d; i++)
    {
        a=lower_bound(cnt,cnt+s,modify[i][0])-cnt+1;  // x~x+1 才代表线段树中的一个点
        b=lower_bound(cnt,cnt+s,modify[i][1])-cnt;
        update(a,b,i,1,s,1);
    }
    travel(1,s,1);
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-31 00:52:33

hiho1079 线段树区间改动离散化的相关文章

hiho1079 线段树区间修改离散化

题目链接: hihocoder1079 代码: #include<iostream> #include<cstdio> #include<cstring> #include<set> #include<algorithm> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 100050 using namespace std; int cnt[ma

POJ 2528 Mayor&#39;s posters (线段树区间更新+离散化)

题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值.由于l和r范围比较大,内存就不够了,所以就用离散化的技巧 比如将1 4化为1 2,范围缩小,但是不影响答案. 写了这题之后对区间更新的理解有点加深了,重点在覆盖的理解(更新左右两个孩子节点,然后值清空),还是要多做做题目. 1 #include <iostream> 2 #include <

POJ 2528 Mayor&#39;s posters(线段树区间染色+离散化或倒序更新)

Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 59239   Accepted: 17157 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral post

LightOJ 1089 - Points in Segments (II) 线段树区间修改+离散化

http://www.lightoj.com/volume_showproblem.php?problem=1089 题意:给出许多区间,查询某个点所在的区间个数 思路:线段树,由于给出的是区间,查询的是点,考虑将其离线并离散化,普通线段树即可. /** @Date : 2016-12-17-20.49 * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : */ #include<bi

URAL 1019. Line Painting 线段树 区间合并 离散化

题目来源:URAL 1019. Line Painting 题意:求最长的一段全部为白色的区间 思路:线段树成段更新 区间合并 离散化 这里对应的是一段区间 所以每次不是m+1 而是 l m 和 m r 了 另外我加上了0 和 10^9 这两个点 每一段区间(l, r)我记录的是l和r之间有多少条线段 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

线段树区间更新+离散化——ZOJ 3299

对应ZOJ题目:点击打开链接 Fall the Brick Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Submit Status Description Now the God is very angry, so he wants to punish the lazy, greedy humans. He chooses to throw some lines of bricks (just

线段树+区间离散化

校赛1007 题意 给你一个n(n<1e5),表示n个比赛直播,然后n个区间,l,r(0<=l,r<=1e9),表示比赛开始的时间和结束的时间,要同时把所有比赛看完,问最少要借多少台电脑(自己有一台电脑) 其实就是求区间重叠的最大值由于区间太大,所以离散化处理 思路:线段树区间更新 + 离散化 以区间的端点作为标记离散化,离散化后映射到线段树,将重复的端点去掉,然后重新排序,对每个区间二分确定映射后的区间,这里注意二分的时候左端点和右端点二分的判断条件是不同的 AC代码: #includ

poj-----(2528)Mayor&#39;s posters(线段树区间更新及区间统计+离散化)

Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 43507   Accepted: 12693 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral post

POJ 2528 Mayor&#39;s posters (离散化+线段树区间更新)

Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally decided to build an electoral wall for