HDU 3333 Turing Tree --树状数组+离线处理
题意:统计一段序列【L,R】的和,重复元素只算一次。
解法:容易看出在线做很难处理重复的情况,干脆全部讲查询读进来,然后将查询根据右端点排个序,然后离散化数据以后就可以操作了。
每次读入一个数,如果这个数之前出现过,那么删除之前出现的那个数,改加上这个数,然后进行所有右端点小于等于此时下标的查询即可。
关于正确性,引用sdj222555的话来说,"观察一个区间,我们可以发现,如果出现重复的,尽量删除左边的,保留右边的,那么右端点相同的区间都可以进行查询。"
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <map>
#define lll __int64
using namespace std;
#define N 30007 lll c[N],ans[*N+];
map<int,int> mp;
int a[N],pos[N],n,b[N],d[N];
struct Query
{
int L,R,ind;
}Q[*N+]; int cmp(Query ka,Query kb)
{
return ka.R < kb.R;
} inline int lowbit(int x) { return x&(-x); } void modify(int pos,lll val)
{
while(pos <= n)
{
c[pos] += val;
pos += lowbit(pos);
}
} lll getsum(int pos)
{
lll ans = ;
while(pos > )
{
ans += c[pos];
pos -= lowbit(pos);
}
return ans;
} int main()
{
int t,i,j,q;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]),b[i] = a[i];
scanf("%d",&q);
for(i=;i<=q;i++)
scanf("%d%d",&Q[i].L,&Q[i].R),Q[i].ind = i;
memset(c,,sizeof(c));
sort(b+,b+n+);
sort(Q+,Q+q+,cmp);
int ind = unique(b+,b+n+)-b-;
for(i=;i<=ind;i++)
mp[b[i]] = i;
for(i=;i<=n;i++) //d[i]为a[i]离散化后的数
d[i] = mp[a[i]];
memset(pos,,sizeof(pos)); //pos 存上次出现的位置
j = ;
for(i=;i<=n;i++)
{
if(pos[d[i]]) modify(pos[d[i]],-a[i]);
modify(i,a[i]);
pos[d[i]] = i;
while(j <= q && Q[j].R == i)
{
ans[Q[j].ind] = getsum(Q[j].R)-getsum(Q[j].L-);
j++;
}
if(j > q)
break;
}
for(i=;i<=q;i++)
printf("%I64d\n",ans[i]);
}
return ;
}
HDU 3333 Turing Tree --树状数组+离线处理的更多相关文章
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- HDU 3333 Turing Tree (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...
- HDU3333 Turing Tree 树状数组+离线处理
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- Necklace HDU - 3874 (线段树/树状数组 + 离线处理)
Necklace HDU - 3874 Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...
- HDU 3874 Necklace (树状数组 | 线段树 的离线处理)
Necklace Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- 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]< ...
- SPOJ DQUERY树状数组离线or主席树
D-query Time Limit: 227MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submit Status ...
- D-query SPOJ 树状数组+离线
D-query SPOJ 树状数组+离线/莫队算法 题意 有一串正数,求一定区间中有多少个不同的数 解题思路--树状数组 说明一下,树状数组开始全部是零. 首先,我们存下所有需要查询的区间,然后根据右 ...
随机推荐
- sphinx使用随笔
为什么需要进行全文搜索呢? 一个表中有a.b.c多个字段.我们使用sql进行like搜索的时候,往往只能匹配某个字段.或者是这样的形式:a LIKE “%关键词%”or b LIKE “关键词” 这样 ...
- spring boot学习笔记
spring boot 是什么 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. spring boot采用了“约定优于配置” ...
- ResponsiveSlides.js 幻灯片实例演示
在线实例 默认效果 导航和分页 缩略图 描述说明 回调函数 <div class="wrap"> <ul class="rslides" ...
- 【高级功能】使用canvas元素(第二部分)
本文将继续介绍canvas的功能,展示如何绘制更复杂的图形(包括圆弧和曲线),如何使用剪裁区域来限制操作以及如何绘制文本.还是介绍可以应用在画布上的特效和变换,包括阴影.透明度.旋转和坐标重映射. 1 ...
- Convert part to feature command
Search 库主页 Related Links ArcObjects SDK for ArcGIS 10Microsoft Help System Documentation Convert par ...
- Sizing and Capacity Planning for SharePoint 2013 - Resources
http://blogs.msdn.com/b/sanjaynarang/archive/2013/04/06/sizing-and-capacity-planning-for-sharepoint- ...
- android ButterKnife 解决重复findViewById
简介: 程序员都是懒惰的,不想写一大堆像下面这样的代码 class ExampleActivity extends Activity { TextView title; TextView subtit ...
- Android studio打包APK混淆配置
要在打包APK时加入混淆需要在Module中的buid.gradle中加入如下信息 buildTypes { release { minifyEnabled true shrinkResources ...
- 深入了解Activity-生命周期
一 介绍 Activity是android中使用最为频繁的组件,在官方文档中是这样描述的:An activity is a single, focused thing that the user ca ...
- Web应用程序系统的多用户权限控制设计及实现-用户模块【7】
前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的基本模块-用户模块.用户模块涉及到的数据表为用户表. 1.1用户域 为了更规范和方便后期系统的二次开发和维护 ...