HDU 4417 Super Mario (树状数组)
来源:互联网 发布:好易网络手机电视直播 编辑:程序博客网 时间:2024/06/06 01:26
思路:
- 首先我们先回顾一下树状数组。树状数组的的直接目的即区间求和(logn)。但由于具有logn单点修改的功能使得区间求和更为方便。
- 对于这道题来说,我们先对m个询问中的h升序排序,利用了<=h1的元素一定也<=h2这个递推式,然后将n个数也排序,但同时需要记录这些数原本的位置信息。
- 对于每个询问,我们将符合hi条件的点加入树状数组,注意,我们是将这个点原来的位置加入树状数组(数量是1)。这样构造出来的数组即是满足当前所有点<=hi的情况下,getsum_tree[i]得到的即是小于等于位置i的满足条件的点的个数。
- 对于某个区间i,j来说,getsum_tree[j] - getsum_tree[i]。注意根据实际情况讨论边界。
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <string.h>using namespace std;int n,m;int c[100010];struct san{ int val,p; san(){} san(int vv,int i){val = vv,p = i;}}lisan[100010];struct node1{ int l,r,h,num; node1(){} node1(int ll,int rr,int hh,int numm){ l = ll,r = rr, h = hh, num = numm; }}query[100010];void insert(int i,int x){ while(i <= n){ c[i] += x; i += (i&-i); }}int getsum(int i){ int sum = 0; while(i > 0){ sum += c[i]; i -= (i&-i); } return sum;}int ans[100010];bool cmp(const san&a, const san&b){return a.val<b.val;}bool cmp2(const node1&a, const node1&b){return a.h<b.h;}int main(){ int t; cin>>t; int nca = 0; while(t--){ memset(c,0,sizeof(c)); memset(lisan,0,sizeof(lisan)); nca++; scanf("%d%d",&n,&m); int temp; for(int i = 1;i <= n;i++){ scanf("%d",&temp); lisan[i] = san(temp,i); } for(int i = 1;i <= m;i++){ scanf("%d%d%d",&query[i].l,&query[i].r,&query[i].h); query[i].num = i; } sort(lisan+1,lisan+1+n,cmp); sort(query+1,query+1+m,cmp2); int now = 1; for(int i = 1;i <= n;i++){ if(lisan[i].val <= query[now].h){ insert(lisan[i].p,1); } else if(now <= m-1){ ans[query[now].num] = getsum(query[now].r+1) - getsum(query[now].l) ; now++; i--; } else break; } for(int i = now;i <= m;i++){ ans[query[i].num] = getsum(query[i].r+1) - getsum(query[i].l); } printf("Case %d:\n",nca); for(int i = 1;i <= m;i++){ printf("%d\n",ans[i]); } } return 0;}
0 1
- hdu 4417 Super Mario (树状数组)
- HDU 4417 Super Mario (树状数组)
- HDU 4417 Super Mario 树状数组
- hdu 4417 Super Mario(划分树或树状数组)
- HDU 4417 Super Mario (树状数组 + 离线)
- HDU 4417 Super Mario(线段树||树状数组+离线操作 之树状数组篇)
- hdu 4417 Super Mario 树状数组+离线操作
- HDU 4417 Super Mario 划分树/树状数组
- hdu 4417 Super Mario(离线树状数组|划分树)
- HDU 4417 Super Mario (树状数组、离线处理)
- HDU 4417 Super Mario [树状数组+离线操作]【数据结构】
- hdu 4417 Super Mario(主席树||cdq分治+树状数组)
- HDU-4417:Super Mario(树状数组+离线操作)
- HDU 4417 Super Mario(12年杭州网络赛-H题-离线 + 树状数组)
- HDU 4417 Super Mario (树状数组+离线处理)(划分树+二分答案)
- HDU 4417 —— Super Mario(树状数组,离散化,离线处理)
- HDU 4417 Super Mario(离线线段树or树状数组)
- HDU 4417 Super Mario(树状数组离线处理 or 主席树)
- Linux打卡Day8-用户和组
- 【游戏作品】SUNSET——动漫风横版动作同人游戏
- 多线程环境下单例模式的两种实现方法
- Android实现一个简单的SQLite数据库的增删改查
- CSS实现单行、多行文本溢出显示省略号(…)
- HDU 4417 Super Mario (树状数组)
- Eclipse 中生成Javadoc API文档
- yum源优先级的配置
- 2.ES 入门
- 设计模式之---观察者模式
- JS闭包-01
- LeetCode 题目:435. Non-overlapping Intervals Add to List
- 原生JS Ajax操作
- 类的派生与继承