hdu 6183 Color it(线段树)

题目链接:hdu 6183 Color it

题意:

在一个二维平面上有n个操作。

1. x y c 在(x,y)这点上添加一个颜色c。

2. x y1 y2 询问二维平面[1,x]~[y1,y2]上有多少不同的颜色。

题解:

由于这题在x轴每次都是询问的[1,x],所以我们开50棵线段树,对于每种颜色维护每个y坐标的最小x,查询的时候就是区间查询[y1,y2]的最小x是否小于当前查询的x。

这里由于空间有限制,要用最原始版本的线段树,动态开点。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4
 5 const int M=3e6+7,N=1e6;
 6 struct Node{int l,r,v;}T[M];
 7 int tot,rt[51],flag,a,b,c,d;
 8
 9 void update(int x,int v,int &rt,int l=1,int r=N)
10 {
11     if(!rt)T[rt=++tot]=Node{0,0,v};
12     if(T[rt].v>v)T[rt].v=v;
13     if(l==r)return;
14     int mid=l+r>>1;
15     if(x<=mid)update(x,v,T[rt].l,l,mid);
16     else update(x,v,T[rt].r,mid+1,r);
17 }
18
19 void ask(int L,int R,int rt,int x,int l=1,int r=N)
20 {
21     if(flag||!rt)return;
22     if(L<=l&&r<=R)
23     {
24         if(T[rt].v<=x)flag=1;
25         return;
26     }
27     int mid=l+r>>1;
28     if(L<=mid)ask(L,R,T[rt].l,x,l,mid);
29     if(R>mid)ask(L,R,T[rt].r,x,mid+1,r);
30 }
31
32 int main(){
33     while(1)
34     {
35         scanf("%d",&a);
36         if(a==3)break;
37         if(a==0)
38         {
39             F(i,0,50)rt[i]=0;
40             tot=0;
41         }
42         if(a==1)
43         {
44             scanf("%d%d%d",&b,&c,&d);
45             update(c,b,rt[d]);
46         }
47         if(a==2)
48         {
49             scanf("%d%d%d",&b,&c,&d);
50             int ans=0;
51             F(i,0,50)
52             {
53                 flag=0;
54                 ask(c,d,rt[i],b);
55                 ans+=flag;
56             }
57             printf("%d\n",ans);
58         }
59     }
60     return 0;
61 }

时间: 2024-11-04 21:02:29

hdu 6183 Color it(线段树)的相关文章

HDU 4902 Nice boat(线段树)

HDU Nice boat 题目链接 题意:给定一个序列,两种操作,把一段变成x,把一段每个数字,如果他大于x,就变成他和x的gcd,求变换完后,最后的序列. 思路:线段树,每个结点多一个cover表示该位置以下区间是否数字全相同,然后每次延迟操作,最后输出的时候单点查询即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1

hdu 2795 Billboard(线段树)

Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10890    Accepted Submission(s): 4827 Problem Description At the entrance to the university, there is a huge rectangular billboard of

POJ 2777 Count Color (线段树区间更新加查询)

Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem. There is a very long board with length L centimeter, L is a positive integer, so we can evenly d

hdu 3016 Man Down (线段树 + dp)

题目大意: 是男人就下一般层...没什么可以多说的吧. 注意只能垂直下落. 思路分析: 后面求最大值的过程很容易想到是一个dp的过程 . 因为每一个plane 都只能从左边 从右边下两种状态. 然后我们所需要处理的问题就是 ,你如何能快速知道往左边下到哪里,往右边下到哪里. 这就是线段树的预处理. 讲线段按照高度排序. 然后按照高度从小到大加入到树中. 然后去寻找左端点 和 右端点最近覆盖的线段的编号. #include <cstdio> #include <iostream> #

poj 2777 Count Color(线段树区间修改)

题目链接:http://poj.org/problem?id=2777 题目意思:就是问你在询问的区间里有几种不同的颜色 思路:这题和一般的区间修改差不多,但是唯一不同的就是我们要怎么计算有种颜色,所以这时候我们就需要把延时标记赋予不同的意义,当某段区间有多种颜色时就赋值为-1,当为一种颜色时就把它赋值为这个颜色的号数.这儿我们要怎么统计询问区间不同的颜色数叻,为了不重复计算同一种颜色,那么我们就需要用一个数组来标记计算过的颜色,当我们下次遇到时就不需要再次计算了.... 代码核心处就在计数那儿

HDU 3954 Level up 线段树

---NotOnlySuccess 出的题--- 看了题之后觉得和HDU 4027有点像,给的K很小,只有10,目测只要有人升级的时候直接更新到叶子节点就ok了.不过不同于HDU 4027 的是,那题每一次更新都相当于这题的一次升级操作,这题里面可能会出现一次操作之后没有升级和出现升级两种情况,一时半会没了思路. 无奈去搜题解,发现我只要维护一个区间当中距离升级最近的人所需要的基础升级经验,即不算等级加成的裸的升级经验,如果在一次涨经验之后,出现当前区间当中有人会升级,直接将每一个要升级的人更新

多校训练hdu --Nice boat(线段树,都是泪)

Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 47 Accepted Submission(s): 10 Problem Description There is an old country and the king fell in love with a devil. The devil always ask

HDU 3308 LCIS(线段树)

Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (index counting from 0)Q A B: output the length of the longest consecutive increasing subsequence (LCIS) in [a, b]. Input T in the first line, indicating

PKU 2777 Count Color (线段树区间更新)

题意: 给你三个数:L (1 <= L <= 100000), T (1 <= T <= 30) and O (1 <= O <= 100000),表示有一长度为L的板(1~L), 有T种颜色(1~T),然后有O个操作,初始板1~L的颜色为1,"C A B C"表示在区间A,B图上C颜色, "P A B" 表示询问 A,B区间有几种不同的颜色. #include <stdio.h> #include <iostr