第一次 耍划分树。。

模板是找第k小的

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
typedef long long LL;
const int MAXN = 100999;//点数的最大值
const int MAXM = 1000010;//边数的最大值
const LL INF = 1152921504;
/*
* 划分树(查询区间第k小)
*/
int tree[20][MAXN];//表示每层每一个位置的值
int sorted[MAXN];//已经排序好的数
int toleft[20][MAXN];//toleft[p][i]表示第p层从1到i有数分入左边
void build(int l,int r,int dep)
{if(l == r)return;int mid = (l+r)>>1;int same = mid - l + 1;//表示等于中间值并且被分入左边的个数for(int i = l; i <= r; i++) //注意是l,不是oneif(tree[dep][i] < sorted[mid])same--;int lpos = l;int rpos = mid+1;for(int i = l; i <= r; i++){if(tree[dep][i] < sorted[mid])tree[dep+1][lpos++] = tree[dep][i];else if(tree[dep][i] == sorted[mid] && same > 0){tree[dep+1][lpos++] = tree[dep][i];same--;}elsetree[dep+1][rpos++] = tree[dep][i];toleft[dep][i] = toleft[dep][l-1] + lpos - l;}build(l,mid,dep+1);build(mid+1,r,dep+1);
}
//查询区间第k小的数,[L,R]是大区间,[l,r]是要查询的小区间
int query(int L,int R,int l,int r,int dep,int k)
{if(l == r)return tree[dep][l];int mid = (L+R)>>1;int cnt = toleft[dep][r] - toleft[dep][l-1];if(cnt >= k){int newl = L + toleft[dep][l-1] - toleft[dep][L-1];int newr = newl + cnt - 1;return query(L,mid,newl,newr,dep+1,k);}else{int newr = r + toleft[dep][R] - toleft[dep][r];int newl = newr - (r-l-cnt);return query(mid+1,R,newl,newr,dep+1,k-cnt);}
}
int main()
{int n,m,t,cas=1;//   freopen("in.txt","r",stdin);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(tree,0,sizeof(tree));for(int i = 1; i <= n; i++){scanf("%d",&tree[0][i]);sorted[i] = tree[0][i];}sort(sorted+1,sorted+n+1);build(1,n,0);int l,r,num;printf("Case %d:\n",cas++);while(m--){scanf("%d%d%d",&l,&r,&num);l++,r++;int y=r-l+1,z=1;//边界while(z<=y){int x=(z+y)>>1;int sum=query(1,n,l,r,0,x);if(sum<=num)z=x+1;elsey=x-1;}z=r-l+1-z+1;printf("%d\n",r-l+1-z);}}return 0;
}

【划分树+二分】HDU 4417 Super Mario相关推荐

  1. HDU 4417 Super Mario

    划分树 + 二分 二分枚举第k小的数与h比较大小. #include <stdio.h> #include <string.h> #include <stdlib.h&g ...

  2. HDU 4417 Super Mario(划分树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. #HDU 4417 Super Mario (主席树 + 二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. hdu 4417 Super Mario 树状数组||主席树

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

  6. HDU 4417 Super Mario(莫队 + 树状数组 + 离散化)

    Super Mario 思路 区间查找问题,容易想到离线莫队,确实这题就是莫队,接下来我们考虑如何维护区间高度值问题. 既然是离线嘛,我们容易想到离散化和他挂钩,想想这题是否需要离散化,高度的最大值是 ...

  7. HDU 4417 Super Mario(线段树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. hdu 4417 Super Mario

    Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. hdu 4417 Super Mario 划分树+二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意: 给定一个长度为n的序列,求区间[L,R]中小于h的个数: 思路: 分三种情况: 1:如果该区间最小 ...

最新文章

  1. Mathtype写分段函数的方法
  2. Qt 加载QML 文件的几种方式
  3. 超越GPT-3!NormFormer:归一化提高预训练、缓解梯度不匹配
  4. java和c++的区别大吗_小自考本科含金量高吗?小自考和大自考有什么区别?
  5. 线性表的顺序表示和实现
  6. php计算1992年到现在,1992年以前 | 物质计算科学研究室 - Powered by MYPHP
  7. 【Elasticsearch】在Elasticsearch中支持纳秒时间戳
  8. JSP访问Spring中的bean
  9. 内核参数 linux dd,Linux dd 命令详解(测磁盘的吞吐量)
  10. MySql 5.6.21安装及配置(超详细)
  11. php连接mysql字符串函数_mysql 字符串函数
  12. 单元测试、集成测试、系统测试和验收测试、冒烟测试、回归测试、随机测试、探索性测试和安全测试
  13. php 文字合成图片,PHP图片和文字合成
  14. Katalon Recorder安装及使用
  15. matlab里vSAS,科学网—【MATLAB】saveas和print保存图片的格式 - 叶瑞杰的博文
  16. Python+Selenium PO模式Web自动化测试实战
  17. 无理数平方根计算_如何找到数字的平方根并手动计算
  18. 清华学霸用3年编写的Python学习清单共26章,学完托福雅思轻松拿
  19. Excel 的基本概念以及 Excel 文件的创建
  20. !!!---1588|Sum of All Odd Length Subarrays(新)

热门文章

  1. Android性能优化之电量篇(四)
  2. python入门基础语发_Python基础入门-基础语法
  3. uni-app 使用 web-view 页面之间互相跳转、通信
  4. 基于phathomjs token 不定时无响应问题排查
  5. Python的全局和局部变量
  6. 人生第一个快速幂的题(HDU - 1097--A hard puzzle )
  7. Python - 3.6 学习三
  8. SQL Server创建索引
  9. 设置树莓派SSH连接因超时闲置断开(转)
  10. 递归求嵌套数组中最大值