Q - Play With Sequence HDU - 3971 线段树 重新排序建树
Q - Play With Sequence
这个题目是一个线段树,比较特别的线段树,就是c询问一定次数之后重新排序建树来优化减低复杂度。
第一次碰到这种题目有点迷。
这个题目写还是很好写的,就是重新排序建树的位置不太好找。
不过可以知道的是,这是更新花费时间和排序花费时间的一个平衡,这个是一个二次函数,这个二次函数的最低点可以自己测出来。
现在可能有点听不懂,写完代码就很好理解了,
我测的每隔2000次C的操作就重新建树排序是最优的。
800,1000,2200,3000 都是可以的。
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <algorithm>
- #include <iostream>
- #include <queue>
- #include <string>
- #include <vector>
- #include <map>
- #define inf 0x3f3f3f3f
- #define inf64 0x3f3f3f3f3f3f3f3f
- using namespace std;
- const int maxn = 3e5 + ;
- typedef long long ll;
- ll a[maxn], lc[maxn], rc[maxn], num[maxn];
- string s[maxn];
- struct node
- {
- ll lazy, max, min, len;
- }tree[maxn*];
- void push_up(int id)
- {
- tree[id].max = max(tree[id << ].max, tree[id << | ].max);
- tree[id].min = min(tree[id << ].min, tree[id << | ].min);
- //printf("tree[%d].min=%lld tree[%d].max=%lld\n", id, tree[id].min, id, tree[id].max);
- }
- void build(int id,int l,int r)
- {
- tree[id].len = r - l + ;
- tree[id].lazy = ;
- if(l==r)
- {
- tree[id].max = tree[id].min = a[l];
- return;
- }
- int mid = (l + r) >> ;
- build(id << , l, mid);
- build(id << | , mid + , r);
- push_up(id);
- }
- void push_down(int id)
- {
- if(tree[id].lazy)
- {
- int val = tree[id].lazy;
- tree[id << ].max += val;
- tree[id << ].min += val;
- tree[id << | ].max += val;
- tree[id << | ].min += val;
- tree[id << ].lazy += val;
- tree[id << | ].lazy += val;
- // printf("tree[%d].max=%lld tree[%d].min=%lld\n", id << 1, tree[id << 1].max, id << 1, tree[id << 1].min);
- // printf("tree[%d].max=%lld tree[%d].min=%lld\n", id << 1 | 1, tree[id << 1 | 1].max, id << 1 | 1, tree[id << 1 | 1].min);
- tree[id].lazy = ;
- }
- }
- void update(int id,int l,int r,ll x,ll y,ll val)
- {
- push_down(id);
- // printf("id=%d l=%d r=%d x=%lld y=%lld val=%lld\n", id, l, r, x, y, val);
- if(tree[id].min>=x&&tree[id].max<=y)
- {
- tree[id].lazy = val;
- tree[id].min += val;
- tree[id].max += val;
- //printf("id=%d min=%lld max=%lld\n", id, tree[id].min, tree[id].max);
- return;
- }
- int mid = (l + r) >> ;
- if (tree[id << ].max >= x && tree[id << ].min <= y) update(id << , l, mid, x, y, val);
- if (tree[id << | ].max >= x && tree[id << | ].min <= y) update(id << | , mid + , r, x, y, val);
- push_up(id);
- }
- int query(int id,int l,int r,ll x,ll y)
- {
- push_down(id);
- if(tree[id].max<=y&&tree[id].min>=x)
- {
- return tree[id].len;
- }
- int mid = (l + r) >> , ans = ;
- if (tree[id << ].max >= x && tree[id << ].min <= y) ans += query(id << , l, mid, x, y);
- if (tree[id << | ].max >= x && tree[id << | ].min <= y) ans += query(id << | , mid + , r, x, y);
- return ans;
- }
- void push_alldown(int id,int l,int r)
- {
- if(l==r)
- {
- a[l] = tree[id].max;
- return;
- }
- push_down(id);
- int mid = (l + r) >> ;
- push_alldown(id << , l, mid);
- push_alldown(id << | , mid + , r);
- }
- int main()
- {
- int n, m;
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- for (int i = ; i <= n; i++) scanf("%lld", &a[i]);
- sort(a + , a + + n);
- build(, , n);
- int cnt = ;
- for(int i=;i<=m;i++)
- {
- cin >> s[i];
- if (s[i] == "C") scanf("%lld%lld%lld", &lc[i], &rc[i], &num[i]), cnt++;
- else scanf("%lld%lld", &lc[i], &rc[i]), num[i] = ;
- }
- int tot = ;
- for(int i=;i<=m;i++)
- {
- if(s[i]=="C")
- {
- ++tot;
- //push_alldown(1, 1, n);
- //printf("lc[%d]=%lld rc[%d]=%lld num[%d]=%lld\n", i, lc[i], i, rc[i], i, num[i]);
- update(, , n, lc[i], rc[i], num[i]);
- if(tot%==)
- {
- push_alldown(, , n);
- sort(a + , a + + n);
- build(, , n);
- }
- }
- else
- {
- int ans = query(, , n, lc[i], rc[i]);
- printf("%d\n", ans);
- }
- }
- }
- }
线段树 排序建树
Q - Play With Sequence HDU - 3971 线段树 重新排序建树的更多相关文章
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- hdu 4747 线段树
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- hdu 3954 线段树 (标记)
Level up Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1754 线段树(Max+单点修改)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1166 线段树(sum+单点修改)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- 前端笔记(关于css盒模型知识整理)
我以前整理的文章可能也不是特别深入.所以现在开始尝试即使多花点时间收集整理,也不只发浅层知识,这样对技术的深入理解是很有帮助的. 废话不多说,我们现在开始. 说到css盒模型,这是大多面试基础中会经常 ...
- 记录d3.js 力导向图的平移缩放,类似地图导航点击某一项移动到当前位置
项目中有用到d3.js用于图结构的查询, 需求如下: 右上角有个模糊搜索功能,查询出来的结果用列表展示 点击列表的某一列,要求画布移动到当前选中的节点的位置,基于画布正中间 搜索出来的结果列表展示用的 ...
- MySQL的事务隔离级别是什么?
我是平也,这有一个专注Gopher技术成长的开源项目「go home」 背景介绍 想必事务大家都已经非常熟悉了,它是一组SQL组成的一个执行单元,要么全执行要么全不执行,这也是它的一个特性--原子性. ...
- 移动硬盘临时文件太多怎么办,python黑科技帮你解决
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 星安果 PS:如果想了解更多关于python的应用,可以私信我,或者 ...
- springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题
pom.xm里写入swagger依赖: <dependency> <groupId>io.springfox</groupId> <artifactId> ...
- overload 与override的区别
Override 是重写: 方法名称.参数个数,类型,顺序,返回值类型都是必须和父类方法一致的.它的关系是父子关系Overload 是重载: 方法名称不变,其余的都是可以变更的.它的关系是同一个类 ...
- 重启mysql服务
重启mysql 启动mysql: 方式一:sudo /etc/init.d/mysql start 方式二:sudo service mysql start 停止mysql: 方式一:sudo /et ...
- google无法播放mp4 chrome无法播放h264
写在前面 我在chrome上无法播放h264+Acc的mp4,在firefox.ie都可以播放,而且此mp4在vlc终可以正常播放. 视频链接:http://106.14.221.185:7001/p ...
- 资料整理:python接口类
1开发原则(七大原则) 一:开放封闭原则 二:接口隔离原则(将不同接口对象一一展现出来,分别调用各自的接口,完成各自的功能) 三:依赖倒置原则 高级模块不能依赖低级模块,可以依赖抽象 规范的定义: 高 ...
- [函数] PHP取二进制文件头快速判断文件类型
一般我们都是按照文件扩展名来判断文件类型,但其实不太靠谱,因为可以通过修改扩展名来伪装文件类型.其实我们可以通过读取文件信息来识别,比如 PHP扩展中提供了类似 exif_imagetype 这样的函 ...