HDU 4417 Super Mario(划分树)
Super Mario
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1437 Accepted Submission(s): 690
For each test data:
The first line contains two integers n, m (1 <= n <=10^5, 1 <= m <= 10^5), n is the length of the road, m is the number of queries.
Next line contains n integers, the height of each brick, the range is [0, 1000000000].
Next m lines, each line contains three integers L, R,H.( 0 <= L <= R < n 0 <= H <= 1000000000.)
10 10
0 5 2 7 5 4 3 8 7 7
2 8 6
3 5 0
1 3 1
1 9 4
0 1 0
3 5 5
5 5 1
4 6 3
1 5 7
5 7 3
4
0
0
3
1
2
0
1
5
1
这题就是查询一个区间内小于等于一个数的数的个数。
用树状数组离线搞过。
修改下划分树模板也可以搞定
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- #include <string.h>
- using namespace std;
- const int MAXN = ;
- int tree[][MAXN];
- int sorted[MAXN];
- int toleft[][MAXN];
- void build(int l,int r,int dep)
- {
- if(l == r)return;
- int mid = (l+r)>>;
- int same = mid-l+;
- for(int i = l;i <= r;i++)
- if(tree[dep][i] < sorted[mid])
- same--;
- int lpos = l;
- int rpos = mid+;
- for(int i = l;i <= r;i++)
- {
- if(tree[dep][i] < sorted[mid])
- tree[dep+][lpos++] = tree[dep][i];
- else if(tree[dep][i] == sorted[mid] && same > )
- {
- tree[dep+][lpos++] = tree[dep][i];
- same--;
- }
- else
- tree[dep+][rpos++] = tree[dep][i];
- toleft[dep][i] = toleft[dep][l-] + lpos - l;
- }
- build(l,mid,dep+);
- build(mid+,r,dep+);
- }
- //查询区间[l,r]上比k小于等于的数的个数
- int query(int L,int R,int l,int r,int dep,int k)
- {
- //printf("%d %d %d %d %d %d\n",L,R,l,r,dep,k);
- if(l == r)
- {
- if(tree[dep][l] <= k)return ;
- else return ;
- }
- int mid = (L+R)>>;
- int cnt = toleft[dep][r] - toleft[dep][l-];
- if(sorted[mid] <= k)
- {
- int newr = r + toleft[dep][R] - toleft[dep][r];
- int newl = newr - (r-l+-cnt) + ;
- return cnt + query(mid+,R,newl,newr,dep+,k);
- }
- else
- {
- int newl = L + toleft[dep][l-] - toleft[dep][L-];
- int newr = newl + cnt -;
- if(newr >= newl)return query(L,mid,newl,newr,dep+,k);
- else return ;
- }
- }
- int main()
- {
- int T;
- int iCase = ;
- scanf("%d",&T);
- int n;
- while(T--)
- {
- iCase ++;
- int m;
- scanf("%d%d",&n,&m);
- memset(tree,,sizeof(tree));
- memset(toleft,,sizeof(toleft));
- for(int i = ;i <= n;i++)
- {
- scanf("%d",&tree[][i]);
- sorted[i] = tree[][i];
- }
- sort(sorted+,sorted+n+);
- build(,n,);
- int L,R,H;
- printf("Case %d:\n",iCase);
- while(m--)
- {
- scanf("%d%d%d",&L,&R,&H);
- L++;R++;
- printf("%d\n",query(,n,L,R,,H));
- }
- }
- return ;
- }
HDU 4417 Super Mario(划分树)的更多相关文章
- HDU 4417 - Super Mario ( 划分树+二分 / 树状数组+离线处理+离散化)
题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...
- HDU 4417 Super Mario(划分树问题求不大于k的数有多少)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4417 Super Mario(划分树+二分)
题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
- HDU 4417 Super Mario ( 离线树状数组 )
把数值和查询放在一起从小到大排序,纪录每个数值的位置,当遇到数值时就更新到树状数组中,遇到查询就直接查询该区间和. #include <cstdio> #include <cstri ...
- HDU 4417 Super Mario 主席树
分析:找一个区间里小于等于h的数量,然后这个题先离散化一下,很简单 然后我写这个题主要是熟悉一下主席树,其实这个题完全可以离线做,很简单 但是学了主席树以后,我发现,在线做,一样简单,而且不需要思考 ...
- HDU 4417 Super Mario 主席树查询区间小于某个值的个数
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> ...
- HDU 4417 Super Mario (划分树)(二分)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【划分树+二分】HDU 4417 Super Mario
第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- gnu app url[web][5星]
http://www.gnu.org/software/software.zh-cn.html http://linux.chinaunix.net/news/2010/12/07/1175310.s ...
- python的时间和日期--time、datetime应用
time >>> import time >>> time.localtime() #以time.struct_time类型,打印本地时间 time.struct_ ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做 ...
- 利用python对WiderFace数据解析及画框
#注:此代码稍作修改也可以用于WFLW人脸数据集的标注文件解析,#参见其README.md文件了解其每一行的信息,从中解析出相应字#段即可. import os import cv2 def draw ...
- Ruby-Clamp
require "clamp" class ClampTest < Clamp::Command # 1.命令行的参数使用主要分两类,一种是参数名称后面带参数值的方式, #我 ...
- cpu占用高 20180108
1.top 中的mysql占用高,在mysql中开启慢查询,用tail -f 监控慢查询日志,发现是有表的索引不合理: 2.top 中的php_fpm的进程数高,修改了一下php_fpm的配置文件p ...
- tomcat - gc日志输出
原创 2017年01月04日 14:32:37 2090 tomcat/bin catalina.sh JAVA_OPTS='-server -Xms4g -Xmx4g -Xss256k -XX:Pe ...
- redis之(六)redis的列表类型的命令
[一]向列表两端添加元素 -->命令:LPUSH key value [value ...] -->向列表的左侧添加元素,返回值表示增加元素后列表的长度 -->命令:RPUSH ke ...
- Windows7 + OSG3.6 + VS2017 + Qt5.11
一.准备工作 下载需要的材料: 1. OSG稳定版源代码, 3.6.3版本 2. 第三方库,选择VS2017对应的版本 https://download.osgvisual.org/3rdParty ...
- AC日记——Mato的文件管理 bzoj 3289
3289 思路: 莫队求区间逆序对个数,树状数组维护: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500 ...