Billboard HDU - 2795(树状数组,单点修改,区间查询)
题目链接:https://vjudge.net/problem/HDU-2795
思路:h = 1e9行不通,因为广告是1*w的,所以n个广告最多只需要 h = n的高度,那么h=2e5就可以接受了。
用树状数组维护区间最大值。
从前往后区间查询哪一大块块首先满足条件,然后一直缩小区间,直到区间长度等于1,输出答案,然后修改该点可用的w,
再修改区间最大值。
1 #include <iostream> 2 #include <algorithm> 3 #include <map> 4 #include <queue> 5 #include <string> 6 #include <stack> 7 #include <vector> 8 #include <list> 9 #include <cstdio> 10 #include <cstring> 11 #include <cmath> 12 using namespace std; 13 #define ll long long 14 #define pb push_back 15 #define fi first 16 #define se second 17 18 const int N = 2e5+10; 19 int a[N],c[N]; 20 int n,h,w; 21 22 inline int lb(int x){ 23 return x&(-x); 24 } 25 26 void update(int inx){ 27 for(int i = inx; i <= h; i += lb(i)){ 28 c[i] = a[i]; 29 int d = lb(i); 30 if(d == 1) continue; 31 for(int j = 1; j < d; j <<= 1) 32 c[i] = max(c[i], c[i-j]); 33 } 34 } 35 36 inline bool fun(int& l,int& r,int it){ 37 while(r <= h){ 38 // cout << "fun" << endl; 39 if(c[r] < it){ 40 l = r; 41 r += lb(r); 42 if(r > h) r = l+1;//要遍历所有的分块区间 43 } 44 else return 1; 45 } 46 return 0; 47 } 48 49 void solve(){ 50 while(~scanf("%d%d%d",&h,&w,&n)){ 51 h = h >= n ? n : h; 52 for(int i = 1; i <= h; ++i) a[i] = c[i] = w;//初始化 53 int it; 54 for(int p = 1; p <= n; ++p){ 55 scanf("%d",&it); 56 int l = 1,r = 1,ok = 0; 57 while(fun(l,r,it)){//找是否有满足的区间 58 // cout << "main" << endl; 59 ok = 1; 60 if(l == r){ 61 printf("%d\n",l); 62 a[l] -= it; 63 update(l); 64 break; 65 } 66 else r = ++l;//缩小区间 67 } 68 if(!ok) printf("-1\n"); 69 } 70 } 71 } 72 73 int main(){ 74 75 // ios::sync_with_stdio(false); 76 // cin.tie(0); cout.tie(0); 77 solve(); 78 79 return 0; 80 }
Billboard HDU - 2795(树状数组,单点修改,区间查询)相关推荐
- hdu2642二维树状数组单点更新+区间查询
http://acm.hdu.edu.cn/showproblem.php?pid=2642 题目大意:一个星空,二维的.上面有1000*1000的格点,每个格点上有星星在闪烁.一开始时星星全部暗淡着 ...
- HDU ACM 4031 Attack (树状数组--单点查询+区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=4031 用了树状数组的区间更新 单点查找(一般为单点更新 区间查找) 例如 区间(2,4)加1 则Updata(2 ...
- hdu 1166 树状数组解
树状数组解决 (关于树状数组参考大佬的博客https://www.cnblogs.com/hsd-/p/6139376.html) 然后就很好理解这题了,代码附上 /*hdu 1166 单点修改, ...
- 树状数组区间修改和区间求和
最一般树状数组能做到的操作是单点修改,区间求和,都是log(n)级别的.原理就是用树状数组维护a[i]的部分和. 想要做到修改区间,求单点值也很简单,用树状数组维护a[i]的差分数组d[i]的部分和既 ...
- HDU 4358 树状数组+思路
http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...
- hdu 4991(树状数组优化dp)
Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 校门外的树——树状数组+区间修改
校门外的树 [题目分析]题目描述的是一种区间修改,看起来好像要用线段树.但是对于这种区间内部没有差别并且查询的是区间内的类别的问题,是可以转化为树状数组进行的.毕竟树状数组更加简单. 我们的关注点应该 ...
- hdu 3333 树状数组+离线处理
思路:既然要求的是不同的元素的和,那么我们可以想办法让每个值在区间中只出现一次,于是想到了离线的算法:将查询按照右端点排序,位置在右端点之前的元素都插入到树状数组中,对于已经出现过的值,我们要先删除( ...
- hdu 4417(树状数组+离线算法)
解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样.关键是如何转换成树状数组的模型,这才是本题的难点. 我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了. ...
- hdu 1394(树状数组求逆序数)
解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...
最新文章
- c malloc 头文件_C 数据类型
- 网易云信集成视频教程(六):如何快速实现iOS下IM自定义消息收发?
- python编程发展_编程的发展史及Python简介
- sentinel 端口_双剑合璧Nacos结合Sentinel实现流量安全控制(一):Sentinel核心库和控制台...
- 加载程序中数据库账号密码加密策略wallet_04
- Linux定时器:无节拍机制tickless(CONFIG_NO_HZ)
- 为什么numba不能提高背包功能的速度?
- BZOJ.4337.[BJOI2015]树的同构(树哈希)
- paip.uapi 获取网络url内容html 的方法java php ahk c++ python总结.
- ubuntu安装文泉驿字体
- 免越狱版 iOS 抢红包插件
- VSTO开发Powerpoint插件
- Java首选项Preferences
- 来电弹屏--线程间操作无效: 从不是创建控件的线程访问它
- 如何用电脑破解WiFi
- android 动画闪屏问题,Android中闪屏实现方法小结(普通闪屏、倒计时闪屏、倒计时+动画...
- 《孩子,你慢慢来》的读书笔记与读后感2600字
- MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
- 干货分享|串流游戏软件大比拼
- 计算机类sci四大水刊,材料灌水的sci期刊_十大水榜sci杂志_四大垃圾sci杂志