Color it

Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)

Problem Description

Do you like painting? Little D doesn’t like painting, especially messy color paintings. Now Little B is painting. To prevent him from drawing messy painting, Little D asks you to write a program to maintain following operations. The specific format of these operations is as follows.

0 : clear all the points.

1 x y c : add a point which color is c at point (x,y).

2 x y1 y2 : count how many different colors in the square (1,y1) and (x,y2). That is to say, if there is a point (a,b) colored c, that 1≤a≤x and y1≤b≤y2, then the color c should be counted.

3 : exit.

Input

The input contains many lines.

Each line contains a operation. It may be ‘0’, ‘1 x y c’ ( 1≤x,y≤106,0≤c≤50 ), ‘2 x y1 y2’ (1≤x,y1,y2≤106 ) or ‘3’.

x,y,c,y1,y2 are all integers.

Assume the last operation is 3 and it appears only once.

There are at most 150000 continuous operations of operation 1 and operation 2.

There are at most 10 operation 0.

Output

For each operation 2, output an integer means the answer .

Sample Input

0

1 1000000 1000000 50

1 1000000 999999 0

1 1000000 999999 0

1 1000000 1000000 49

2 1000000 1000000 1000000

2 1000000 1 1000000

0

1 1 1 1

2 1 1 2

1 1 2 2

2 1 1 2

1 2 2 2

2 1 1 2

1 2 1 3

2 2 1 2

2 10 1 2

2 10 2 2

0

1 1 1 1

2 1 1 1

1 1 2 1

2 1 1 2

1 2 2 1

2 1 1 2

1 2 1 1

2 2 1 2

2 10 1 2

2 10 2 2

3

Sample Output

2

3

1

2

2

3

3

1

1

1

1

1

1

1

Source

2017ACM/ICPC广西邀请赛-重现赛(感谢广西大学)

Recommend

liuyiding | We have carefully selected several similar problems for you: 6297 6296 6295 6294 6293

这是一道经典的线段树简单题,对于操作0,直接手动清零(你可以直接当做这道题有多组数据来看),然后就是相对来说思维难度略高一点的另外两个操作(操作3略)。

先思考一个问题,这道题如何维护答案?

观察数据范围可以发现,c" role="presentation" style="position: relative;">cc的取值范围很小,只有[0,50]" role="presentation" style="position: relative;">[0,50][0,50],这不禁让我们想到对于每一种颜色建一颗线段树,然后每次询问时我们跑一个O(50logn)" role="presentation" style="position: relative;">O(50logn)O(50logn)来查询,看看时限和数据范围应该没啥问题。所以怎么维护这种信息呢?

我们知道,所有点的x" role="presentation" style="position: relative;">xx坐标都满足1≤xi" role="presentation" style="position: relative;">1≤xi1≤xi,这样的话,我们可以维护每一个y" role="presentation" style="position: relative;">yy坐标上所对应的x" role="presentation" style="position: relative;">xx坐标的最小值。然后查询时就看在当前y" role="presentation" style="position: relative;">yy坐标范围内的最小值是否小于x" role="presentation" style="position: relative;">xx就行了。

还剩了一个问题:空间的处理。这个可以使用动态开点的方法,这样你实际使用的空间只与修改次数有关。(不过我每次写动态开点的问题感觉线段树格式写的都很丑)

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define Node 2500010
#define n 1000005
#define inf 0x3f3f3f3f
using namespace std;
int rt[60],son[Node<<2][2],minn[Node<<2],cnt=0;
inline void init(){
    memset(rt,0,sizeof(rt));
    cnt=0;
    son[0][1]=son[0][0]=0;
    minn[0]=inf;
}
inline void pushup(int p){minn[p]=min(minn[son[p][0]],minn[son[p][1]]);}
inline void update(int &p,int l,int r,int y,int x){
    if(!p){
        p=++cnt;
        son[p][0]=son[p][1]=0;
        minn[p]=x;
    }
    if(l==r){
        minn[p]=min(minn[p],x);
        return;
    }
    int mid=l+r>>1;
    if(y<=mid)update(son[p][0],l,mid,y,x);
    else update(son[p][1],mid+1,r,y,x);
    pushup(p);
}
inline int query(int p,int l,int r,int ql,int qr){
    if(!p)return inf;
    if(ql<=l&&r<=qr)return minn[p];
    int mid=l+r>>1;
    if(qr<=mid)return query(son[p][0],l,mid,ql,qr);
    if(ql>mid)return query(son[p][1],mid+1,r,ql,qr);
    return min(query(son[p][0],l,mid,ql,mid),query(son[p][1],mid+1,r,mid+1,qr));
}
int main(){
    init();
    int op;
    while(~scanf("%d",&op)){
        if(op==3)break;
        switch(op){
            case 0:{
                init();
                break;
            }
            case 1:{
                int qx,qy,c;
                scanf("%d%d%d",&qx,&qy,&c);
                update(rt[c],1,n,qy,qx);
                break;
            }
            default:{
                int x,ql,qr,ans=0;
                scanf("%d%d%d",&x,&ql,&qr);
                for(int i=0;i<=50;++i)ans+=(query(rt[i],1,n,ql,qr)<=x);
                printf("%d\n",ans);
                break;
            }
        }
    }
}

2018.07.08 hdu6183 Color it(线段树)的更多相关文章

  1. 2018.07.08 hdu5316 Magician(线段树)

    Magician Problem Description Fantasy magicians usually gain their ability through one of three usual ...

  2. hdu6183 Color it 线段树动态开点+查询减枝

    题目传送门 题目大意: 有多次操作.操作0是清空二维平面的点,操作1是往二维平面(x,y)上放一个颜色为c的点,操作2是查询一个贴着y轴的矩形内有几种颜色的点,操作3退出程序. 思路: 由于查询的矩形 ...

  3. 2018.07.31cogs2964. 数列操作η(线段树)

    传送门 线段树基本操作. 给出一个排列b,有一个初始值都为0的数组a,维护区间加1,区间统计区间∑(ai/bi)" role="presentation" style=& ...

  4. 2018.07.25 hdu5306Gorgeous Sequence(线段树)

    传送门 线段树基本操作. 要求维护区间取min" role="presentation" style="position: relative;"> ...

  5. 2018.07.23[PA2015]Siano(线段树)

    [PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...

  6. HDU6183 Color it (线段树动态开点)

    题意: 一个1e6*1e6的棋盘,有两个操作:给(x,y)加上颜色c,或查找(1,y1)到(x,y2)内的颜色种类数量,最多有50种颜色 思路: 建立50颗线段树,对每个颜色的线段树,维护每个y坐标上 ...

  7. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

  8. Count Color poj2777 线段树

    Count Color poj2777 线段树 题意 有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色. 解题思路 这里使用线段树,因为 ...

  9. 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...

随机推荐

  1. JSON.Stringify()和JSON.parse()的比较使用

    1.  JSON.Stringify() 将一个对象解析成字符串 <script> function myonclick() { var value = $('select option: ...

  2. jenkins 修改工作目录

    修改Jenkins路径 Jenkins的默认安装路径是/var/lib/jenkins 现在由于这个根目录的磁盘太小,所以切换到/data 目录下. Jenkins目录.端口.工作目录等信息在/etc ...

  3. 编写jQuery插件(二)——jQuery插件类型和机制

    jQuery插件类型 jQuery插件主要有3种类型: 1.封装对象方法的插件 这种插件类型是最常见的一种插件,它将对象方法封装起来,对通过选择器获取的jQuery对象进行操作. 2.封装全局函数的插 ...

  4. 判断TrueType字体

    function IsTrueTypeFont(FontName : string) : boolean;const  PITCH_MASK: byte = $0F;  var  TxMetric: ...

  5. spark cache table

    http://www.07net01.com/2015/11/961118.html http://www.cnblogs.com/charlotte77/p/5468968.html 文本读入和写出 ...

  6. 数学分析中jensen不等式由浅入深进行教学(转)

    中国知网:数学分析中Jensen不等式由浅入深进行教学

  7. XML与HTML

    一.什么是HTML 带着疑问走到这里,一句话:HTML(HyperTextMark-upLanguage)即超文本标记语言,是WWW的描述语言. 如果想了解更多请看以下博客: http://blog. ...

  8. Express 应用生成器

    [Express 应用生成器] 通过应用生成器工具 express 可以快速创建一个应用的骨架. 通过如下命令安装,-g意味着安装在全局目录下: 下面的示例就是在当前工作目录下创建一个命名为 myap ...

  9. js:二级联动示例

    联动原理 当用户点击省级的下拉选项,选择所在省,下一个下拉选项里的选项,则变成用户选择省下的所有市的信息,不会出现其它省市的信息. 省市数据 把省市数据,保存在js文件中,以json形式保存,以便读取 ...

  10. poj1015 正解--二维DP(完全背包)

    题目链接:http://poj.org/problem?id=1015 错误解法: 网上很多解法是错误的,用dp[i][j]表示选择i个人差值为j的最优解,用path[i][j]存储路径,循环次序为“ ...