HDU-3333 Turning Tree

题目大意:先给出n个数字。面对q个询问区间,输出这个区间不同数的和。

题解:这道题有几种解法。这里讲一下用分块解决的方法。( 离线树状数组解法看这里 Hdu-3333 Turning Tree (离线树状数组/线段树)~~~)

以(a[i]上一次出现的位置last, a[i])数字对作为基本元素做分块。那么容易想到对于每一个询问(l,r),如果该元素的last<l那么这个元素就应该加入到ans中。  那么我们对于每一个分块,以last作为关键字排序。对于每一次询问。左右两端的分块就枚举last<l的a[i]加入到ans中,中间的分块因为排序的原因,last是有序的。那么中间的分块直接二分询问的左端点l,该分块左端点到二分得到的点都是符合条件的。

AC代码如下,因为用结构体做分块的原因。代码写得稀烂~~~。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
const int N=+;
const int SqrtN=;
struct data{
int last,v;
}a[N],b[N];
long long sum[N];
int L[SqrtN],R[SqrtN];
int pos[N];
int n,m,t; bool cmp1(data x1,data x2) { return x1.last<x2.last; } map<int,int> lst;
void init() {
lst.clear();
for (int i=;i<=n;i++) {
a[i].last=lst[a[i].v];
lst[a[i].v]=i;
}
for (int i=;i<=n;i++) b[i]=a[i]; t=sqrt(n);
for (int i=;i<=t;i++) {
L[i]=(i-)*t+;
R[i]=i*t;
}
if (R[t]<n) t++,L[t]=R[t-]+,R[t]=n; for (int i=;i<=t;i++) sort(a+L[i],a+R[i]+,cmp1); for (int i=;i<=t;i++) {
for (int j=L[i];j<=R[i];j++) {
pos[j]=i;
if (j==L[i]) sum[j]=a[j].v; else sum[j]=sum[j-]+a[j].v;
}
}
} struct cmp2
{
bool operator () (const data &a,const data &b) const {
return a.last < b.last;
}
}; long long query(int l,int r) {
int p=pos[l],q=pos[r];
long long ans=;
if (p==q) {
for (int i=l;i<=r;i++)
if (b[i].last<l) ans+=b[i].v;
} else {
for (int i=l;i<=R[p];i++) if (b[i].last<l) ans+=b[i].v;
for (int i=L[q];i<=r;i++) if (b[i].last<l) ans+=b[i].v;
for (int i=p+;i<=q-;i++) {
data temp;
temp.last=l; temp.v=-;
int x=lower_bound(a+L[i],a+R[i]+,temp,cmp2())-a;
if (x!=L[i]) ans+=sum[x-];
}
}
return ans;
} int main()
{
int T;
scanf("%d",&T);
while (T--) {
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i].v);
init();
scanf("%d",&m);
for (int i=;i<=m;i++) {
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",query(l,r));
}
}
return ;
}

HDU-3333 Turing Tree 分块求区间不同数和的更多相关文章

  1. SPOJ D-query && HDU 3333 Turing Tree (线段树 && 区间不相同数个数or和 && 离线处理)

    题意 : 给出一段n个数的序列,接下来给出m个询问,询问的内容SPOJ是(L, R)这个区间内不同的数的个数,HDU是不同数的和 分析 : 一个经典的问题,思路是将所有问询区间存起来,然后按右端点排序 ...

  2. HDU 3333 Turing Tree 线段树+离线处理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...

  3. hdu 3333 Turing Tree 图灵树(线段树 + 二分离散)

    http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Others)    ...

  4. HDU 3333 Turing Tree (主席树)

    题意:给定上一个序列,然后有一些询问,求区间 l - r 中有多少个不同的数的和. 析:和求区间不同数的方法是一样,只要用主席树维护就好. 代码如下: #pragma comment(linker, ...

  5. HDU 3333 Turing Tree(离线树状数组)

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. HDU 3333 Turing Tree (线段树)

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改

    题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...

  8. HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)

    题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...

  9. HDU 3333 Turing Tree (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...

随机推荐

  1. java两个引用指向同一个对象

  2. python基础:5.请编写一个函数实现将IP地址转换成一个整数。

    如 10.3.9.12 转换规则为:        10            00001010
         3            00000011
         9          ...

  3. Cesium标点

    let startPoint = this.viewer.entities.add( //viewer.entities.add 添加实体的方法 { name: '测量距离', //这个属性跟页面显示 ...

  4. 人生苦短_我用Python_def(函数)_004

    # coding=utf-8 # function函数:内置函数 # 例如: len int extent list range str # print insert append pop rever ...

  5. Key Set

    http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1011&cid=594 Key Set Time Limit: 2000 ...

  6. mysql实现“存在即更新,不存在即插入”

    方法1:使用replace关键字 replace是insert的增强版,可以实现插入的数据和已存在的数据发生主键或者唯一键重复,则删除已存在的数据,再实现插入,如果不重复,则直接插入数据. 结合Myb ...

  7. pytest_用例运行级别_模块级

    ''' pytest 参数说明 https://www.jianshu.com/p/7a7432340f02 -x test_fixt_model.py 遇到错误时,停止运行 用-v运行(-v显示运行 ...

  8. QTP笔记--检查点、ChildObjects方法

    一.自带检查点函数 '最后一个参数为timeout,单位是毫秒 Browser( "SAP NetWeaver Portal" ).Page( "SAP NetWeave ...

  9. 资源-DotNet-站点:DotNet 站点列表

    ylbtech-资源-DotNet-站点:DotNet 站点列表 1.ASP.NET Web返回顶部 1.1.问卷星 https://www.wjx.cn/sample/service.aspx 1. ...

  10. day 84 Xadmin组件之构建表单数据

    一 .先设置一些相关配置 1. 创建数据库模型. 在app01 下创建 from django.db import models # Create your models here. class Au ...