CODEVS1191|数轴染色|线段树

题目描述 Description
在一条数轴上有N个点,分别是1~N。一开始所有的点都被染成黑色。接着
我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色。请输出每个操作执行后
剩余黑色点的个数。
输入描述 Input Description
输入一行为N和M。下面M行每行两个数Li、Ri
输出描述 Output Description
输出M行,为每次操作后剩余黑色点的个数。
样例输入 Sample Input
10 3
3 3
5 7
2 8
样例输出 Sample Output
9
6
3
数据范围及提示 Data Size & Hint
数据限制
对30%的数据有1<=N<=2000,1<=M<=2000
对100%数据有1<=Li<=Ri<=N<=200000,1<=M<=200000

#include<iostream>
#include<cstdio>
using namespace std;

int x,y,n,m;
struct tree{
   int l,r,v;
}t[800001];

void build(int now,int x,int y)
{
    t[now].l=x; t[now].r=y;
    if (x==y) { t[now].v=1; return; }
    int mid=(x+y)>>1;
    build(now<<1,x,mid);
    build(now<<1|1,mid+1,y);
    t[now].v=t[now<<1].v+t[now<<1|1].v;
}

void change(int k,int x,int y)
{
    if (t[k].v==0) return;
    int l=t[k].l,r=t[k].r;
    if (l==x && r==y) { t[k].v=0; return; }
    int mid=(l+r)>>1;
    if (mid>=y) change(k<<1,x,y);
        else if (mid<x) change(k<<1|1,x,y);
        else
        {
            change(k<<1,x,mid);
            change(k<<1|1,mid+1,y);
        }
    t[k].v=t[k<<1].v+t[k<<1|1].v;
}

int main()
{

    cin >> n >> m;
    build(1,1,n);
    for (int i=1; i<=m; i++)
    {
        cin >> x >> y;
        change(1,x,y);
        printf("%d\n",t[1].v);
    }
    return 0;
}
时间: 2024-12-12 07:07:22

CODEVS1191|数轴染色|线段树的相关文章

【codevs1191】数轴染色 线段树 区间修改+固定区间查询

[codevs1191]数轴染色 2014年2月15日4317 题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输入 Sample Input 10 33 3

[SDOI2011][BZOJ2243] 染色|线段树|树链剖分

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3583  Solved: 1362[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完

bzoj4881 [ Lydsy2017年5月月赛 ] -- 二分图染色+线段树

以下是Claris的题解: 若线段 i 和 j 相交,那么在它们之间连一条边.若这个图不是二分图,那么无解,否则令cnt 为连通块个数,那么 ans = 2cnt. 在二分图染色的过程中,每个点只需要被访问一次.对于当前所在的点 x,它可以一步走到 [1, x) 里 p[i] > p[x] 的所有 i,以及 (x, n] 里 p[j] < p[x] 的所有 j. 用线段树维护所有没走过的点,记录每个区间 p 最小与最大的两个位置.每次贪心取出最大/小的,看看是否满足条件, 若满足则删除该点,然

HYSBZ 2243 染色 (线段树+树链剖分)

题意:中文题. 析:真是一个好题,但是我TLE了两天,就是因为输入那个询问数,我当作边数了,结果就是一个TLE... 大体思路,就是先进行用树链剖分,然后用线段树来维护,维护每个区间的不同数的个数,和每个数的值,在求的时候,在两个端点进行判断,是不是同一种,如果是就减去1,不是则不变. 而且发现一个问题,就是网上的代码所以输出的和我的不一样,但是都AC了,不知道是不是数据水.也不知道谁的对. 代码如下: #pragma comment(linker, "/STACK:1024000000,102

codevs 1191 树轴染色 线段树区间定值,求和

codevs 1191 树轴染色 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1191/ Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. Input 输入一行为N和M.下面M行每行两个数Li.Ri Output 输出M行,为每次操作后剩余黑色点的个数.

bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 7925  Solved: 2975[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完

bzoj2243: [SDOI2011]染色--线段树+树链剖分

此题代码量较大..但是打起来很爽 原本不用lca做一直wa不知道为什么.. 后来改lca重打了一遍= =结果一遍就AC了orz 题目比较裸,也挺容易打,主要是因为思路可以比较清晰 另:加读入优化比没加快了1.3s.. 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 100010; 6 struct node{

线段树&#183;题解报告

线段树·题解报告 参考资料 ·课件 线段树 --刘汝佳 统计的力量,线段树全接触 --张昆玮 ·Blog [完全版]线段树 从普通线段树到zkw线段树 [总结][数据结构]ZKW线段树详解 选题目录 · Hdu1166 敌兵布阵(单点更新,区间求和) · Hdu1754 I Hate It(单点更新,RMQ) · Hdu3308 LCIS(单点更新,区间并) · Poj3468 A Simple Problem with Integers(区间加减,区间求和) · Poj2777 Count C

POJ2528 Mayor&#39;s posters(线段树染色问题+离散化)

题目大意:有t组数据,每组数据给你n张海报(1<=n<=10000),下面n组数据分别给出每张海报的左右范围(1 <= l <= r <= 10000000),下一张海报会覆盖前一张海报,求最后可见(包括完全和不完全可见)的海报有几张. 例如: 1 5 1 4 2 6 8 10 3 4 7 10 如上图所示,答案为4. 解题思路:其实这是一道区间染色问题,但是由于查找区间太大,显然直接建树会导致MLE,所以这里通过使用对区间的离散化来缩小查找范围.参考了一些大牛博客,简单说一