题意:

同上

题解:

抓着这题作死的搞~~是因为今天练习赛的一道题.SPOJ KQUERY.直到我用最后一种树状数组通过了HDOJ这题后..交SPOJ的才没超时..看排名...时间能排到11名了..有些叼...看下时间效率..自下而上: 划分树、线段树、树状数组、优化后的树状数组...

划分树的效率最低...看来划分树的应用范围还是是很有局限性...只在求kth number的时候给力..逆过来求就已经力不从心了...

线段树及树状数组处理本题..需要把询问都存下来...按照询问数从小到大按排个序..并且把每个数以及其序号存下来..按数字从小到大排个序...首先这一列数都是空的(全0)..然后边放数边统计结果...

Program:  线段树171MS

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#define ll long long
#define eps 1e-5
#define oo 1000000007
#define pi acos(-1.0)
#define MAXN 100005
using namespace std;
struct node
{
int x,w;
}p[MAXN];
struct question
{
int l,r,x,id;
}q[200005];
int sum[MAXN<<2],ans[200005];
void update(int p,int x,int l,int r,int now)
{
if (l==r) { sum[now]=x; return; }
int mid=l+r>>1;
if (p<=mid) update(p,x,l,mid,now<<1);
if (p>mid) update(p,x,mid+1,r,now<<1|1);
sum[now]=sum[now<<1]+sum[now<<1|1];
return;
}
int query(int L,int R,int l,int r,int now)
{
if (L<=l && R>=r) return sum[now];
int mid=l+r>>1,ans=0;
if (L<=mid) ans+=query(L,R,l,mid,now<<1);
if (R>mid) ans+=query(L,R,mid+1,r,now<<1|1);
return ans;
}
bool cmp1(node a,node b) { return a.x<b.x; }
bool cmp2(question a,question b) { return a.x<b.x; }
int main()
{
int n,m,i,x,t,h,T,cases;
scanf("%d",&T);
for (cases=1;cases<=T;cases++)
{
printf("Case %d:\n",cases);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&p[i].x),p[i].w=i;
sort(p+1,p+1+n,cmp1);
p[n+1].x=oo;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].x);
q[i].l++,q[i].r++;
q[i].id=i;
}
sort(q+1,q+1+m,cmp2);
memset(sum,0,sizeof(sum));
h=x=1;
while (x<=n && h<=m)
{
t=p[x].x;
while (p[x].x==t) update(p[x].w,1,1,n,1),x++;
while (h<=m && q[h].x<t) ans[q[h].id]=0,h++;
while (h<=m && q[h].x<p[x].x)
ans[q[h].id]=query(q[h].l,q[h].r,1,n,1),h++;
}
for (i=1;i<=m;i++) printf("%d\n",ans[i]);
}
return 0;
}

Program: 树状数组 125MS

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#define ll long long
#define eps 1e-5
#define oo 1000000007
#define pi acos(-1.0)
#define MAXN 100005
using namespace std;
struct node
{
int x,w;
}p[MAXN];
struct question
{
int l,r,x,id;
}q[200005];
int sum[MAXN],ans[200005],n;
void insert(int x,int k)
{
while (k<=n)
{
sum[k]+=x;
k+=k&(-k);
}
return;
}
int query(int k)
{
int ans=0;
while (k)
{
ans+=sum[k];
k-=k&(-k);
}
return ans;
}
bool cmp1(node a,node b) { return a.x<b.x; }
bool cmp2(question a,question b) { return a.x<b.x; }
int main()
{
int m,i,x,t,h,T,cases;
scanf("%d",&T);
for (cases=1;cases<=T;cases++)
{
printf("Case %d:\n",cases);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&p[i].x),p[i].w=i;
sort(p+1,p+1+n,cmp1);
p[n+1].x=oo;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].x);
q[i].l++,q[i].r++;
q[i].id=i;
}
sort(q+1,q+1+m,cmp2);
memset(sum,0,sizeof(sum));
h=x=1;
while (x<=n && h<=m)
{
t=p[x].x;
while (p[x].x==t) insert(1,p[x].w),x++;
while (h<=m && q[h].x<t) ans[q[h].id]=0,h++;
while (h<=m && q[h].x<p[x].x)
ans[q[h].id]=query(q[h].r)-query(q[h].l-1),h++;
}
for (i=1;i<=m;i++) printf("%d\n",ans[i]);
}
return 0;
}

Program: 树状数组 78MS

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#define ll long long
#define eps 1e-5
#define oo 1000000007
#define pi acos(-1.0)
#define MAXN 100005
#define MAXM 200005
using namespace std;
struct node
{
int x,w;
}p[MAXN];
int sum[MAXN],ans[200005],n,ql[MAXM],qr[MAXM],qx[MAXM],qid[MAXM];
void insert(int x,int k)
{
while (k<=n)
{
sum[k]+=x;
k+=k&(-k);
}
return;
}
int query(int k)
{
int ans=0;
while (k)
{
ans+=sum[k];
k-=k&(-k);
}
return ans;
}
int input()
{
char c;
do
{
c=getchar();
}while (c<'0' || c>'9');
int d=0;
while (c>='0' && c<='9')
{
d=d*10+c-'0';
c=getchar();
}
return d;
}
bool cmp1(node a,node b) { return a.x<b.x; }
bool cmp2(int a,int b) { return qx[a]<qx[b]; }
int main()
{
int m,i,x,t,h,T,cases;
scanf("%d",&T);
for (cases=1;cases<=T;cases++)
{
printf("Case %d:\n",cases);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) p[i].x=input(),p[i].w=i;
sort(p+1,p+1+n,cmp1);
p[n+1].x=oo;
for (i=1;i<=m;i++)
{
ql[i]=input()+1,qr[i]=input()+1,qx[i]=input();
qid[i]=i;
}
sort(qid+1,qid+1+m,cmp2);
memset(sum,0,sizeof(sum));
h=x=1;
while (x<=n && h<=m)
{
t=p[x].x;
while (p[x].x==t) insert(1,p[x].w),x++;
while (h<=m && qx[qid[h]]<t) ans[qid[h]]=0,h++;
while (h<=m && qx[qid[h]]<p[x].x)
ans[qid[h]]=query(qr[qid[h]])-query(ql[qid[h]]-1),h++;
}
for (i=1;i<=m;i++) printf("%d\n",ans[i]);
}
return 0;
}

HDOJ 4417 - Super Mario 线段树or树状数组离线处理..的更多相关文章

  1. HDU 4417 Super Mario(2012杭州网络赛 H 离线线段树)

    突然想到的节约时间的方法,感觉6翻了  给你n个数字,接着m个询问.每次问你一段区间内不大于某个数字(不一定是给你的数字)的个数 直接线段树没法做,因为每次给你的数字不一样,父节点无法统计.但是离线一 ...

  2. HDU 4417 Super Mario(划分树)

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

  3. Necklace HDU - 3874 (线段树/树状数组 + 离线处理)

    Necklace HDU - 3874  Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...

  4. SPOJ DQUERY树状数组离线or主席树

    D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status ...

  5. 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化

    http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...

  6. D-query SPOJ 树状数组+离线

    D-query SPOJ 树状数组+离线/莫队算法 题意 有一串正数,求一定区间中有多少个不同的数 解题思路--树状数组 说明一下,树状数组开始全部是零. 首先,我们存下所有需要查询的区间,然后根据右 ...

  7. HDU 4417 Super Mario(线段树)

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

  8. HDOJ题目4417 Super Mario(划分树求区间比k小的个数+二分)

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

  9. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

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

随机推荐

  1. 安装GeoIP数据库

    1.安装GeoIP数据库 cd /usr/local/logstash/etc curl -O "http://geolite.maxmind.com/download/geoip/data ...

  2. 剑指offer-面试题9.斐波拉契数列

    题目一:写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列的定义如下: { n=; f(n)={ n=; { f(n-)+f(n-) n>; 斐波拉契问题很明显我们会想到用递归来解决: ...

  3. IOS 从Resource文件夹下Copy文件到沙盒

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.t ...

  4. 利用FreeMarker静态化网页

    1.介绍-FreeMarker是什么 模板引擎:一种基于模板的.用来生成输出文本的通用工具 基于Java的开发包和类库 2.介绍-FreeMarker能做什么 MVC框架中的View层组件 Html页 ...

  5. 力挺8天入门wpf【转载】

    8天入门wpf—— 第八天 最后的补充 摘要: 从这一篇往前看,其实wpf中还有很多东西没有讲到,不过我的原则还是将比较常用的知识点过一遍,如果大家熟悉了这些知识,基本功也就打的差不多了,后续可以等待 ...

  6. 移动平台前端开发总结(针对iphone,Android等手机)

    移动平台前端开发是指针对高端智能手机(如Iphone.Android)做站点适配也就是WebApp,并非是针对普通手机开发Wap 2.0,所以在阅读本篇文章以前,你需要对webkit内核的浏览器有一定 ...

  7. jquery初学者易犯的错误

    1 获取类或者对象的时候,忘记写“#”或者“.” 错误案例: $(document).ready(function(){ $("btn1").click(function(){ a ...

  8. 登陆权限验证Session和Cookie用法及BasePage类使用

    最近在做ASP.NET的项目时,接触到了登陆权限模块,所有总结了一下登陆时用到的知识和方法技巧. 如图说明:实现的效果如图,由于验证码验证比较简单这里就不介绍了 首先用代码生成器生成项目,以三层为例进 ...

  9. 2014年1月24日 Oracle 事务导读

    形象举例:  从 A 账户向 B 账户转账 10000 元 步骤: 1. A - 10000 2. B + 10000 事务的作用就是确保这两步无误执行后提交,若有一个执行不成功则失败. 结束事务的5 ...

  10. java字符串数组进行大小排序

    若是将两个字符串直接比较大小,会包:The operator > is undefined for the argument type(s) java.lang.String, java.lan ...