HDU 3333-Turing Tree(BIT好题)
题意:
给你n个数的序列a,q个询问,每个询问给l,r,求在下标i在[l,r]的区间内不含重复数的和
分析:
这类题目觉得很好,很练思维,觉得不太好做。
用BIT维护和,我们可以从前向后扫一遍序列,当前数在前面已经出现过了,前一个该数的位置上就要减去这个数才保证正确(不重复),但查询区间是随机的,肯定相互影响,则我们用离线处理,先把所有查询区间按右边界升序排列,这样就不会影响了。
#include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <string> #include <cctype> #include <complex> #include <cassert> #include <utility> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; typedef pair<int,int> PII; typedef long long ll; #define lson l,m,rt<<1 #define pi acos(-1.0) #define rson m+1,r,rt<<11 #define All 1,N,1 #define N 50010 #define read freopen("in.txt", "r", stdin) const ll INFll = 0x3f3f3f3f3f3f3f3fLL; const int INF= 0x7ffffff; const int mod = 1000000007; ll bit[N],a[N],tmp[N],total[200010]; //bef前一个相同数的位置 int bef[N],n,m; struct node{ int l,r,id; }q[200010]; bool cmp(node x,node y){return x.r<y.r; } void add(int x,ll d){while(x<=n){bit[x]+=d;x+=(x&(-x));} } ll sum(int x){ll num=0;while(x>0){num+=bit[x];x-=(x&(-x));}return num; } void solve(){sort(tmp+1,tmp+1+n);sort(q,q+m,cmp);memset(bef,0,sizeof(bef));int j=0;for(int i=1;i<=n;++i){int pos=lower_bound(tmp+1,tmp+n+1,a[i])-tmp;if(!bef[pos]){add(i,a[i]);bef[pos]=i;}else{add(bef[pos],-a[i]);add(i,a[i]);bef[pos]=i;}while(q[j].r==i&&j<m){total[q[j].id]=sum(q[j].r)-sum(q[j].l-1);j++;}}for(int i=0;i<m;++i)printf("%I64d\n",total[i]); } int main() {int t;scanf("%d",&t);while(t--){memset(bit,0,sizeof(bit));scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%I64d",&a[i]);tmp[i]=a[i];}scanf("%d",&m);for(int i=0;i<m;++i){scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;}solve();} return 0; }
转载于:https://www.cnblogs.com/zsf123/p/4734925.html
HDU 3333-Turing Tree(BIT好题)相关推荐
- HDU 3333 Turing Tree(树状数组+离线处理+离散化)
题目大意 给一个 n(1≤n≤30000) 个数,数的范围是 0~109.现在给了 Q 个询问,询问的内容是:一个区间 [L, R] 中,所有不同的数的和是多少? 其实和 HDU 3874 一个意思 ...
- hdu 3333 Turing Tree 求区间内不同数的和——线段树解法
http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意:求区间内不同数的和 #include<bits/stdc++.h> using name ...
- HDU - 3333 Turing Tree 线段树区间不同值和+详解+思想
传送门 首先第一次做这种求不同元素和的线段树题,猜想是个裸题.但是题目中有一句话显然给题目降低了很大的难度,就是 想想其实它就是在暗示你这道题你要结合多次询问来处理,也就是所谓的离线,而不是一次一次的 ...
- HDU - 3333 Turing Tree(线段树+离线处理)
题目链接:点击查看 题目大意:给定一个长度为n的数列,依次求m个区间中不相同数字之和 题目分析:n给的是3e4,看到区间问题先要想到线段树或差分区间或动态规划,暴力是肯定不行滴,那么这个题已经知道是需 ...
- HDU 3333 Turing Tree(树状数组/主席树)
题意 给定一个长度为 \(n\) 的序列,\(m\) 个查询,每次查询区间 \([L,R]\) 范围内不同元素的和. \(1\leq T \leq 10\) \(1 \leq n\leq 300 ...
- HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)
HDU 4812 D Tree 思路 点对距离相等并且要求输出字典序最小的点对,距离相等不就是点分治裸题了嘛, 照着这个思路出发我们只要记录下所有点对是满足要求的,然后再去找字典序最小的点对就行了, ...
- 【HDU】5370 Tree Maker 【树dp】
传送门:[HDU]5370 Tree Maker my code:my~~code: #include <bits/stdc++.h> using namespace std ;type ...
- HDU 5573 Binary Tree 构造
Binary Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 Description The Old Frog King lives ...
- hdu 1710 Binary Tree Traversals (二叉树)
1 /********************************************************** 2 题目: Binary Tree Traversals(hdu 1710) ...
- ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)
题干: Each New Year Timofey and his friends cut down a tree of n vertices and bring it home. After tha ...
最新文章
- jsp自定自定义标签
- springboot+vue在线音乐网站
- php cookie删除不了,php cookie删除不了怎么办
- 2015年百度之星初赛(1) --- B 找连续数
- 深入思考:算法工程师的落地能力具体指什么,如何提升自己的落地能力?
- linux 声卡权限,archlinux的声卡问题如何解决
- 传一个实体一个string_没想到,一个小小的String还有这么多窍门
- ffmpeg 推流同时录像命令_使用FFmpeg将rtsp流摄像头视频转码为rtmp播放
- 如何卸载mingw_minGW在windows安装 | 学步园
- thinkphp生成的验证码不显示问题解决
- C#租房管理系统(课程设计)
- 高层建筑电气设计说明书
- 【超详细】Redhat Linux 7/CentOS 7/Oracle Linux 7安装MySQL5.7
- 2019 Java 全栈工程师进阶路线图,一定要收藏!
- Word自动生成的目录超出页边距
- html5创建桌面快捷方式,iOS APP创建桌面快捷方式
- 单细胞测序在免疫治疗研究中的应用
- 聚焦场景 共建生态 加速AI落地——2018中国人工智能应用与生态峰会成功举办
- Python实验报告一 python基础试题练习
- 【记录】IOS手机如何配置whistle代理进行抓包?(苹果系列)(安卓应该也是类似处理)