题目原网址:http://acm.hdu.edu.cn/showproblem.php?pid=6183

题目中文翻译:

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 1677    Accepted Submission(s): 500

Problem Description

你喜欢画画吗? Little D不喜欢画画,特别是杂乱的彩色画。 现在Little B正在画画。 为了防止他画出凌乱的画作,Little D要求你写一个程序来维持以下的操作。 这些操作的具体格式如下。

0:清除所有点。

1 x y c:在点(x,y)处添加颜色为c的点, 注意这里一个点可以有很多种颜色,是不会被覆盖的。

2 x y1 y2:计算方形(1,y1)和(x,y2)中有多少种不同的颜色。 也就是说,如果存在着色点c(a,b),即1≤a≤x且y1≤b≤y2,则应计算颜色c。

3:退出。

Input

输入包含许多行。

每行包含一个操作。 它可以是'0','1 x y c'(1≤x,y≤106,0≤c≤50),'2 x y1 y2'(1≤x,y1,y2≤106)或'3'。

x,y,c,y1,y2都是整数。

假设最后一个操作是3,它只出现一次。

操作1和操作2的连续操作最多为150000次。

最多有10个操作0。

Output

对于每个操作2,输出整数表示答案。

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

解题思路:

这道题有50种颜色需要我们处理,比较麻烦,我们不妨先考虑只有一种颜色怎么解决.

因为这道题要我们求的方形是十分特殊的,为(1,y1)和(x,y2),那就说明这个方形是紧贴y轴分布的:

然后我们就会清楚地发现,只要这个颜色的点纵坐标在y1和y2之间,并且横坐标小于x即可.

然后我们在y轴上维护一个线段树,记录x最小值即可(因为只要小于x即可,所以我们只需要记录最小的那一个).


回归正题,我们刚才成功的处理了一种颜色的情况,现在再来考虑50种颜色的情况.

最容易想到的就是维护50个线段树,对于这道题而言时间限制完全可以,但是对于空间则不满足要求,所以我们引用一个优化的方法

----动态开点线段树,它的工作原理就是每当我要用到一个点来维护一个区间时,现开一个空间给它,用不到的点我就不去开辟也不去访,只需提前开两倍的空间即可,大大降低空间浪费.

AC代码:

 #include<iostream>
#include<cstdio>
#include<algorithm> using namespace std; int noip,noi,root[],flag;
struct kkk {
int ls,rs,value;//因为用一棵线段树维护50种颜色,所以不能用2i和2i+1表示左右儿子了
kkk() {ls = rs = value = ;}
}e[]; void update(int &c,int l,int r,int v,int h) {
if(!c) {//如果当前点没被开辟,现开辟一个
c = ++noi;
e[c].value = v;
}
e[c].value = min(e[c].value,v);//因为要求最小值
if(l == r) return ;//如果是叶子节点,就返回
int mid = (l + r) >> ;
if(h <= mid) update(e[c].ls,l,mid,v,h);//开左儿子
else update(e[c].rs,mid + ,r,v,h);//开右儿子
} void yin_wei_bu_hui_zhe_ge_de_ying_wen_suo_yi_yong_zhong_wen_jiao_cha_xun(int c,int x,int l,int r,int ll,int rr) {
if(flag || !c) return ;//如果已经有一个点在方形内或这个点没被开辟,就返回
if(ll <= l && rr >= r) {//如果纵坐标满足要求
if(e[c].value <= x) flag = ;//横坐标满足要求,说明在方形内,标记一下
return ;
}
int mid = (l + r) >> ;
if(ll <= mid) yin_wei_bu_hui_zhe_ge_de_ying_wen_suo_yi_yong_zhong_wen_jiao_cha_xun(e[c].ls,x,l,mid,ll,rr);
if(rr > mid) yin_wei_bu_hui_zhe_ge_de_ying_wen_suo_yi_yong_zhong_wen_jiao_cha_xun(e[c].rs,x,mid + ,r,ll,rr);
} int main() {
while(scanf("%d",&noip)) {
if(noip == ) break;
if(noip == ) {
for(int i = ;i <= noi; i++) e[i].ls = e[i].rs = e[i].value = ;
for(int i = ;i <= ; i++) memset(root,,sizeof(root));
noi = ;
}
if(noip == ) {
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
update(root[c],,,x,y);
}
if(noip == ) {
int x,x1,y1;
scanf("%d%d%d",&x,&x1,&y1);
int ans = ;
for(int i = ;i <= ; i++) {
flag = ;
yin_wei_bu_hui_zhe_ge_de_ying_wen_suo_yi_yong_zhong_wen_jiao_cha_xun(root[i],x,,,x1,y1);
if(flag) ans++;
}
printf("%d\n",ans);
}
}
return ;
}

HDU 6183 Color it(动态开点线段树)的更多相关文章

  1. [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)

    题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...

  2. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  3. 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 247  Solved: 113[Submit][Status][Discuss ...

  4. codeforces 893F - Physical Education Lessons 动态开点线段树合并

    https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...

  5. codeforces 915E - Physical Education Lessons 动态开点线段树

    题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...

  6. CF915E Physical Education Lessons 动态开点线段树

    题目链接 CF915E Physical Education Lessons 题解 动态开点线段树 代码 /* 动态开点线段树 */ #include<cstdio> #include&l ...

  7. 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)

    题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  8. NOIP2017 列队——动态开点线段树

    Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为  ...

  9. 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)

    题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...

随机推荐

  1. android笔记5——同一个Activity中Fragment的切换

    今天来模拟一个注冊的界面过程: 点击"下一步"之后: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZW5zb24xNjg1NQ==/f ...

  2. (转)我在北京工作这几年 – 一个软件工程师的反省

    我于2007年来到北京,在北京工作这些年,先后在NEC.风行.百度几家公司担任软件工程师的职务.NEC是一家具有百年历史的传统日企,在知春路的分公司叫日电电子,我们部门主要从事机顶盒.数字电视上嵌入式 ...

  3. C++类中使用new及delete小例子(续)

    在该示例中我们显式定义了复制构造函数来代替默认复制构造函数, 在该复制构造函数的函数体内, 不是再直接将源对象所申请空间的地址赋值给被初始化的对象, 而是自己独立申请一处内存后再将源对象的属性复制过来 ...

  4. WPF中如何使用代码操作数据模板生成的控件

    有一个Listbox,里面的Item是通过数据模板生成的,如下所示: <Border Margin="15" BorderBrush="Aqua" Bor ...

  5. MVC程序部署后页面指向login.aspx

    MVC程序在本地没有问题,但是部署到服务器后老是跳转到Login.aspx页面,但是我的MVC程序中根本没有Login页面,看了一下链接是这样的 htttp://localhost:26290/log ...

  6. 每天一个JavaScript实例-apply和call的使用方法

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. VUE 之 vuex 和 axios

    1.Vuex 部分 1.1 Vuex 是专门为vue.js设计的集中式状态管理架构,其实就是将数据存在一个store中,共各个组件共享使用 1.2 配置: 1.2.1 下载:--npm install ...

  8. JDK提供的几种常用的锁

    可重入互斥锁: Lock lock = new ReentrantLock() lock.lock(); ... lock.unlock(); 信号量: Semaphore semaphore = n ...

  9. bzoj4105: [Thu Summer Camp 2015]平方运算

    填坑 我不知道怎么算的,但是所有环的LCM数不会超过60 然后用线段树维护这个东西,每个节点记录子树内的循环节 没到循环节的暴力枚举 复杂度是nlogn再乘以循环节长度 #include<cst ...

  10. 2款JS脚本判断手机浏览器跳转WAP手机网站

    随着移动设备的普及,企业的网络宣传已经不能局限在PC端,而需要同时在移动端有所建树.对于公司网站来说,以前都是做的PC端的,当然手机等移动端也可以访问,但是用户体验肯定不如完全适合的手机端来的方便.我 ...