题意:

一个空的坐标系,有④种操作:①1 x y c表示在(x, y)点染上颜色c;②2 X y1 y2表示查询在(1, y1)到(X, y2)范围内有多少种不同的颜色:

③0表示清屏;④3表示程序退出(0<=x, y<=1000000, 0<=c<=50)

思路:开五十个线段树(一种颜色一个),以y为下表,保存min x,(因为查询x固定1---X)然后暴力查询50个就好了

但是显然碰到了一个问题,1e6 开50个线段树显然不现实。。所以需要空间优化一下。。。这里我们考虑动态来开辟线段树,有效的节点进行分配,无效则不分配。。。提问,这样空间为什么是合理的呢?其实因为一个add 最多开logn个节点,单组只有1.5e5次查询,显然,最多也就只开了qlogn个。那么这样空间复杂度就是合理的了。。具体动态开辟的实现也非常简单,类比trie,见代码。

代码:

#include<bits/stdc++.h>
using namespace std;
#define MEM(x,y) memset(x,y,sizeof(x));
const int maxn=3e6+10;
int root[55];
int L[maxn],R[maxn],tot,sum[maxn];
void update(int &rt,int idx,int val,int l,int r){if(rt==-1) rt=tot++;sum[rt]=min(val,sum[rt]);if(l==r) return;int mid=(l+r)/2;if(idx<=mid) update(L[rt],idx,val,l,mid);else update(R[rt],idx,val,mid+1,r);return;
}
int query(int rt,int l,int r,int ll,int rr){int ret=1e9;if(rt==-1) return ret;if(ll==l&&rr==r) return sum[rt];int mid=(ll+rr)/2;if(r<=mid) ret=query(L[rt],l,r,ll,mid);else if(l>mid) ret=query(R[rt],l,r,mid+1,rr);else ret=min(query(L[rt],l,mid,ll,mid),query(R[rt],mid+1,r,mid+1,rr));return ret;
}
int main(){int t,n,op,x,y,y1,y2,c,ret;while(scanf("%d",&op)){if(op==0){MEM(L,-1);MEM(R,-1);for(int i=0;i<maxn;++i) sum[i]=1e9;tot=52;}else if(op==1){scanf("%d%d%d",&x,&y,&c);update(c,y,x,1,1e6);}else if(op==2){scanf("%d%d%d",&x,&y1,&y2);ret=0;for(int i=0;i<=50;++i)ret+=(query(i,y1,y2,1,1e6)<=x);printf("%d\n",ret);}else if(op==3) break;}
}

转载于:https://www.cnblogs.com/zhangxianlong/p/10672487.html

hdu 6183 线段树的空间优化相关推荐

  1. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  2. hdu 4521(线段树优化dp)

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

  3. poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化

    第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...

  4. hdu 5367(线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...

  5. hdu 5266(线段树+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...

  6. hdu 5124(线段树区间更新+lazy思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...

  7. hdu 2795(线段树)

    解题思路:这道题很难想到是用线段树,确实转化的很巧妙 实际上,我们只需要利用线段树(记录1-h)维护哪个位置的剩余空间最大即可,即1,2,......,h是线段树的叶子节点,我们每次要找的就是叶子节点 ...

  8. CF981E Addition on Segments 线段树分治 + bitset优化

    传送门 文章目录 题意: 思路: 题意: 思路: 我们考虑如果我们选择的区间都包含某个位置,那么这个位置一定是最大值.那么对于每个位置,我们枚举包含其的区间,让后每次加xxx都用bitsetbitse ...

  9. HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

    [题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...

最新文章

  1. 实现页面打开后滚动到最底端的效果(转)
  2. Android+NDK+OpenGLES开发环境配置
  3. python桌面快捷图标_python 创建桌面快捷方式 | 学步园
  4. 使用jasmine.createSpyObj具有依赖关系的Angular服务进行单元测试
  5. ajax传递数组:属性traditional设置
  6. Visual C++中 #include stdafx.h 头文件的用法
  7. JAVA入门级教学之(public class和class的区别)
  8. pandas数据处理实践二(排序(sort_index()、sort_values())、连接(Concatenate(连接,串联)和Combine(结合、联合))
  9. 查看Mac上已连接WiFi的密码?
  10. 亲自动手从源码 构建 Groovy 2.3.8 发布包
  11. 华为FusionSphere虚拟化解决方案
  12. 曙光“城市大数据平台”冲破数据孤岛、创造数据价值
  13. linux sudoers文件损坏修复
  14. 本周解锁新技能:识简谱、弹音阶(2019 年 8 月 3日)
  15. error: expected ‘=‘, ‘,‘, ‘;‘, ‘asm‘ or ‘__attribute__‘ before ‘{‘ token
  16. linux三维动画软件,Blender2.9免费版下载
  17. 微服务之服务治理相关内容
  18. 入坑百度飞浆PP深度学习(一)
  19. iOS Keychain和keychain share
  20. python入门学习笔记——详细基础知识篇(第10章 正则表达式(重点)与JSON)

热门文章

  1. wget命令下载文件
  2. TCP/IP WebSocket MQTT
  3. PIL简单图片处理(上)
  4. [整理III]微软等数据结构+算法面试100题[最新第61-80题]
  5. Java NIO编写Socket服务器的一个例子
  6. 使用了JDK自带的jconsole查看Tomcat运行情况
  7. 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d详解(二)
  8. Please let us know in case of any issues
  9. Angular Material 攻略 04 Icon
  10. Centos中不从skel目录里向其中复制任何文件错误的解决方法