HDU 3874 Necklace (树状数组 | 线段树 的离线处理)
Necklace
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2083 Accepted Submission(s): 747
Now Mery thinks the necklace is too long. She plans to take some continuous part of the necklace to build a new one. She wants to know each of the beautiful value of M continuous parts of the necklace. She will give you M intervals [L,R] (1<=L<=R<=N) and you must tell her F(L,R) of them.
For each case, the first line is a number N,1 <=N <=50000, indicating the number of the magic balls. The second line contains N non-negative integer numbers not greater 1000000, representing the beautiful value of the N balls. The third line has a number M, 1 <=M <=200000, meaning the nunber of the queries. Each of the next M lines contains L and R, the query.
6
1 2 3 4 3 5
3
1 2
3 5
2 6
6
1 1 1 2 3 5
3
1 1
2 4
3 5
7
14
1
3
6
- /*
- 题意为查找区间去重后的和
- 用树状数组离线处理
- 将所有查询以右端点从小到大排序
- 按此顺序边去重边查询
- 前面的去重就不会影响到后面的结果了
- */
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int N=;
- const int M=;
- struct node{
- int l,r;
- int id;
- }q[M];
- int n,m,val[N],pre[N],loc[];
- long long arr[N],res[M];
- int lowbit(int x){
- return x&(-x);
- }
- void update(int i,int x){
- while(i<=n){
- arr[i]+=x;
- i+=lowbit(i);
- }
- }
- long long Sum(int i){
- long long ans=;
- while(i>){
- ans+=arr[i];
- i-=lowbit(i);
- }
- return ans;
- }
- bool cmp(node a,node b){
- return a.r<b.r;
- }
- int main(){
- //freopen("input.txt","r",stdin);
- int t;
- scanf("%d",&t);
- while(t--){
- memset(arr,,sizeof(arr));
- memset(loc,-,sizeof(loc));
- scanf("%d",&n);
- for(int i=;i<=n;i++){
- scanf("%d",&val[i]);
- pre[i]=loc[val[i]];
- loc[val[i]]=i;
- update(i,val[i]);
- }
- scanf("%d",&m);
- for(int i=;i<=m;i++){
- scanf("%d%d",&q[i].l,&q[i].r);
- q[i].id=i;
- }
- sort(q+,q++m,cmp);
- int r=;
- for(int i=;i<=m;i++){
- for(int j=r+;j<=q[i].r;j++)
- if(pre[j]!=-)
- update(pre[j],-val[j]);
- r=q[i].r;
- res[q[i].id]=Sum(q[i].r)-Sum(q[i].l-);
- }
- for(int i=;i<=m;i++)
- printf("%I64d\n",res[i]);
- }
- return ;
- }
线段树:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<map>
- using namespace std;
- const int N=;
- //#define L(rt) (rt<<1)
- //#define R(rt) (rt<<1|1)
- #define lson l,mid,rt<<1
- #define rson mid+1,r,rt<<1|1
- struct Tree{
- int l,r;
- int id;
- }q[N<<];
- map<int,int> mp;
- int n,m,a[N];
- long long sum[N<<],res[N<<];
- void PushUp(int rt){
- sum[rt]=sum[rt<<]+sum[rt<<|];
- }
- void update(int id,int val,int l,int r,int rt){
- if(l==r){
- sum[rt]+=val;
- return ;
- }
- int mid=(l+r)>>;
- if(id<=mid)
- update(id,val,lson);
- else
- update(id,val,rson);
- PushUp(rt);
- }
- long long query(int L,int R,int l,int r,int rt){
- if(L<=l && R>=r)
- return sum[rt];
- int mid=(l+r)>>;
- long long ans=;
- if(L<=mid)
- ans+=query(L,R,lson);
- if(R>mid)
- ans+=query(L,R,rson);
- return ans;
- }
- int cmp(Tree a,Tree b){
- return a.r<b.r;
- }
- int main(){
- //freopen("input.txt","r",stdin);
- int t;
- scanf("%d",&t);
- while(t--){
- scanf("%d",&n);
- for(int i=;i<=n;i++)
- scanf("%d",&a[i]);
- scanf("%d",&m);
- for(int i=;i<=m;i++){
- scanf("%d%d",&q[i].l,&q[i].r);
- q[i].id=i;
- }
- sort(q+,q++m,cmp);
- mp.clear();
- memset(sum,,sizeof(sum));
- int r=;
- for(int i=;i<=m;i++){
- for(int j=r+;j<=q[i].r;j++){
- if(mp[a[j]])
- update(mp[a[j]],-a[j],,n,);
- update(j,a[j],,n,);
- mp[a[j]]=j;
- r=q[i].r;
- }
- res[q[i].id]=query(q[i].l,q[i].r,,n,);
- }
- for(int i=;i<=m;i++)
- printf("%I64d\n",res[i]);
- }
- return ;
- }
HDU 3874 Necklace (树状数组 | 线段树 的离线处理)的更多相关文章
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...
- hdu 1166 敌兵布阵——(区间和)树状数组/线段树
pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...
- HDU 1166 敌兵布阵 树状数组||线段树
http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意: 给定n个数的区间N<=50000,还有Q个询问(Q<=40000)求区间和. 每个 ...
- HDU 3303 Harmony Forever 前缀和+树状数组||线段树
Problem Description We believe that every inhabitant of this universe eventually will find a way to ...
- hdu 1166 树状数组(线段树)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- 安卓奇葩问题之:设置webView超时
我只想说:what a fucking day! 今天要做一个webView的超时功能,于是开始百度,一看貌似很简单啊,于是开始copy了下面的代码. import java.util.Timer; ...
- zabbix监控tomcat
服务端配置修改 编译zabbix的时候需要添加参数--enable-java --enable-java 修改zabbix_java配置文件 vim /usr/local/zabbix-2.4.6/s ...
- [UE4]武器碰撞
实现武器战斗伤害系统,击中时如何发出碰撞事件产生伤害,目前探索的有通过物理碰撞和LineTrace两种方法. 物理碰撞通过Overlap事件的方法,优点是易于实现,缺点是无法具体到碰撞骨骼位置,低帧数 ...
- 那些年我们学过的PHP黑魔法
那些年我们学过的PHP黑魔法 提交 我的评论 加载中 已评论 那些年我们学过的PHP黑魔法 2015-04-10 Sco4x0 红客联盟 红客联盟 红客联盟 微信号 cnhonker_huc 功能介绍 ...
- centos下网络配置方法(网关、dns、ip地址配置)
本文介绍了centos网络配置的方法,centos网络配置主要包括dns.网关.IP地址: 1.IP地址配置: /etc/sysconfig/network-scripts/ifcfg-eth0 2. ...
- ASP.NET WEB API 中的路由调试与执行过程跟踪
路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...
- 设计模式之美:Builder(生成器)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Builder 为每个构件定义一个操作. 实现方式(二):Builder 将构件返回给 Director,Director 将构 ...
- input text 的事件及方法
事件 描述onactivate 当对象设置为活动元素时触发.onafterupdate 当成功更新数据源对象中的关联对象后在数据绑定对象上触发.onbeforeactivate 对象要被设置为当前元素 ...
- Book Review: PowerShell 3.0 Advanced Administration Handbook
Recently I read a book, PowerShell 3.0 Advanced Administration Handbook, which I found really worthy ...
- Microsoft Azure开发体验 – 网络报名系统
去年底RP好抢到了中国版Azure的使用机会,最近社团里讨论到9月份招新的问题,就用Azure Website和Azure Table Storage打造了这个报名系统. 网站放在 http://jo ...