HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333

这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序。这里我们需要离散化处理一下,标记一下前面是否出现过这个值,然后不断更新last数组(该数组保存的是每个数最后一次出现的位置)。最后用树状数组维护。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = ;
const int maxq = ;
struct node{
int l,r,index;
};
node query[maxq];
ll sum[maxn],ans[maxq];
ll a[maxn],b[maxn],last[maxn];
int n;
bool cmp(node a,node b){
return a.r < b.r;
}
ll getsum(int i){
ll s = ;
while(i > ){
s += sum[i];
i -= i&(-i);
}
return s;
}
void add(int i,ll x){
while(i <= n){
sum[i] += x;
i += i&(-i);
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = ;i<=n;i++){
scanf("%I64d",&a[i]);
b[i] = a[i];//离散化用
}
sort(b+,b++n);//排序,以每个数的下标标记
int q;
scanf("%d",&q);
for(int i = ;i<=q;i++){
scanf("%d%d",&query[i].l,&query[i].r);
query[i].index = i;
}
sort(query+,query++q,cmp);
memset(sum,,sizeof(sum));
memset(last,,sizeof(last));
int cnt = ;//每个查询的下标
for(int i = ;i<=n;i++){
int index = lower_bound(b+,b++n,a[i])-b-;//找到该数对应的下标
if(last[index])//判断该数是否出现过,有的话减去
add(last[index],-a[i]);
add(i,a[i]);
last[index] = i;
while(query[cnt].r==i && cnt<=q){
ans[query[cnt].index] = getsum(query[cnt].r)-getsum(query[cnt].l-);
cnt++;
}
}
for(int i = ;i<=q;i++)
printf("%I64d\n",ans[i]);
}
return ;
}

Codeforces 703D:http://codeforces.com/contest/703/problem/D

这道题需要多思考的一步是,要求的区间内出现偶数次的数的异或和,等于这个区间内所有数字的异或和异或这个区间内不同数字的异或和,以1、2、1、3、3、2、3举例,结果就是(1^2^1^3^3^2^3)^(1^2^3),原理就是出现偶数次的数异或它自己等于它本身,出现奇数次的数异或它自己为0。对于区间的异或和,我们可以用数组很方便的求出,不同数字的异或和,只需要对上题进行一下改造就好了。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn = ;
struct node{
int l,r,index;
};
node query[maxn];
ll sum[maxn],a[maxn],b[maxn],c[maxn],last[maxn],ans[maxn];
int n;
bool cmp(node a,node b){
return a.r < b.r;
}
ll getsum(int i){
ll s = ;
while(i > ){
s ^= sum[i];//注意
i -= i&(-i);
}
return s;
}
void add(int i,ll x){
while(i <= n){
sum[i] ^= x;//注意
i += i&(-i);
}
}
int main(){
scanf("%d",&n);
for(int i = ;i<=n;i++){
scanf("%I64d",&a[i]);
c[i] = a[i]^c[i-];//求前缀异或和
b[i] = a[i];
}
sort(b+,b++n);
int q;
scanf("%d",&q);
for(int i = ;i<=q;i++){
scanf("%d%d",&query[i].l,&query[i].r);
query[i].index = i;
}
sort(query+,query++q,cmp);
int cnt = ;
for(int i = ;i<=n;i++){
int index = lower_bound(b+,b++n,a[i])-b-;
if(last[index])
add(last[index],a[i]);
last[index] = i;
add(i,a[i]);
while(query[cnt].r==i && cnt<=q){
ans[query[cnt].index] = (c[query[cnt].r]^c[query[cnt].l-])^(getsum(query[cnt].r)^getsum(query[cnt].l-));//注意
cnt++;
}
}
for(int i = ;i<=q;i++)
printf("%I64d\n",ans[i]);
return ;
}

HDU 3333 | Codeforces 703D 树状数组、离散化的更多相关文章

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

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

  2. HDU 4325 Flowers(树状数组+离散化)

    http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...

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

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

  4. HDU 3333 Turing Tree --树状数组+离线处理

    题意:统计一段序列[L,R]的和,重复元素只算一次. 解法:容易看出在线做很难处理重复的情况,干脆全部讲查询读进来,然后将查询根据右端点排个序,然后离散化数据以后就可以操作了. 每次读入一个数,如果这 ...

  5. hdu4605 树状数组+离散化+dfs

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  7. POJ 2299 【树状数组 离散化】

    题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...

  8. Educational Codeforces Round 10 D. Nested Segments 离线树状数组 离散化

    D. Nested Segments 题目连接: http://www.codeforces.com/contest/652/problem/D Description You are given n ...

  9. HDU 4325 Flowers 树状数组+离散化

    Flowers Problem Description As is known to all, the blooming time and duration varies between differ ...

随机推荐

  1. java异常面试题

    1.try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 也许你的答案是在return之前,但往更细地说, ...

  2. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

  3. Django博客功能实现—文章评论的显示

    功能:在打开文章之后,能在文章下面是显示文章的评论,有父级评论.思路:在文章详情的视图里面,获取这个文章的全部评论,得到显示列表,然后用模板显示出来.步骤:一,在views.py的文章详情中获取评论: ...

  4. IEnumerable,IQueryable之前世今生

    来自于:http://www.cnblogs.com/chengxiaohui/articles/2088967.html IEnumerable<T>在.Net2.0中我们已经很熟悉了. ...

  5. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 所有的基础数据都可以恢复删除

    客户的需求如下: 所有基礎信息需要記錄創建人,創建時間,更改人,更改時間,刪除人,刪除時間.有停用基礎信息功能(停用不是刪除,只是暫時停用).基礎信息可以查出已經刪除的信息(有選項可以選擇),有方法把 ...

  6. iis 使用 LocalDB 报错:provider: SQL Network Interfaces, error: 50

    在使用asp.net core读取localdb数据库时,报以下错误: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 S ...

  7. CSS实现背景透明,文字不透明(兼容各浏览器)

    在 FF/Chrome 等较新的浏览器中可以使用css属性background- color的rgba轻松实现背景透明,而文字保持不透明.而IE6/7/8浏览器不支持rgba,只有使用IE的专属滤镜f ...

  8. JavaScript中map函数和filter的简单举例(转)

    js的数组迭代器函数map和filter,可以遍历数组时产生新的数组,和python的map函数很类似1)filter是满足条件的留下,是对原数组的过滤:2)map则是对原数组的加工,映射成一一映射的 ...

  9. 解决:/bin/sh: 1: /home/**/custom_app.sh: Permission denied错误

    出现如下错误,一般是执行权限不够. /bin/sh: : /home/custom_app.sh: Permission denied 解决方法是:cd 到此文件目录,对提示的文件赋予可执行权限或读写 ...

  10. android开发之背景音乐与音效

    android开发之背景音乐与音效 一:添加背景音乐(MediaPlayer) MediaPlayer class can be used to control playback of audio/v ...