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

题意:求区间内不同数的和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=30005;
const int maxq=100005;
map<ll,ll>mp;
struct node
{ll l,r,id;
};
node q[maxq];
bool cmp(node a,node b)
{return a.r<b.r;
}
struct Tree
{int left,right,id;ll sum;
};
Tree tree[maxn<<2];
void build(int id,int l,int r)
{tree[id].left=l;tree[id].right=r;if(l==r){tree[id].sum=0;//区间内不同数字的和return;}int mid=(l+r)/2;build(id*2,l,mid);build(id*2+1,mid+1,r);tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
void update(int id,int pos,ll val)
{if(tree[id].left==tree[id].right){tree[id].sum+=val;}else{int mid=(tree[id].left+tree[id].right)/2;if(pos<=mid)update(id*2,pos,val);elseupdate(id*2+1,pos,val);tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;}
}
ll query(int id,int l,int r)
{if(l==tree[id].left&&r==tree[id].right){return tree[id].sum;}else{int mid=(tree[id].left+tree[id].right)/2;if(r<=mid)query(id*2,l,r);else if(l>mid)query(id*2+1,l,r);elsereturn query(id*2,l,mid)+query(id*2+1,mid+1,r);}
}
ll a[maxn],ans[maxq];
int main()
{int t,n,m,i,j,cur;scanf("%d",&t);while(t--){mp.clear();scanf("%d",&n);//cout<<"!"<<endl;build(1,1,n);//cout<<"!!"<<endl;for(i=1;i<=n;i++)scanf("%lld",&a[i]);scanf("%d",&m);for(i=1;i<=m;i++){scanf("%lld%lld",&q[i].l,&q[i].r);q[i].id=i;}sort(q+1,q+m+1,cmp);cur=1;//cout<<1<<endl;for(i=1;i<=m;i++){for(j=cur;j<=q[i].r;j++){if(mp.find(a[j])!=mp.end()){update(1,mp[a[j]],-a[j]);}update(1,j,a[j]);mp[a[j]]=j;}cur=q[i].r+1;ans[q[i].id]=query(1,q[i].l,q[i].r);}for(i=1;i<=m;i++)printf("%lld\n",ans[i]);}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=30005;
const int maxq=100005;
map<ll,ll>mp;
struct node
{ll l,r,id;
};
node q[maxq];
bool cmp(node a,node b)
{return a.r<b.r;
}
struct Tree
{int left,right,id;ll sum;
};
Tree tree[maxn<<2];
void build(int id,int l,int r)
{tree[id].left=l;tree[id].right=r;if(l==r){tree[id].sum=0;//区间内不同数字的和return;}int mid=(l+r)/2;build(id*2,l,mid);build(id*2+1,mid+1,r);tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
void update(int id,int pos,ll val)
{if(tree[id].left==tree[id].right){tree[id].sum=val;}else{int mid=(tree[id].left+tree[id].right)/2;if(pos<=mid)update(id*2,pos,val);elseupdate(id*2+1,pos,val);tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;}
}
ll query(int id,int l,int r)
{if(l==tree[id].left&&r==tree[id].right){return tree[id].sum;}else{int mid=(tree[id].left+tree[id].right)/2;if(r<=mid)query(id*2,l,r);else if(l>mid)query(id*2+1,l,r);elsereturn query(id*2,l,mid)+query(id*2+1,mid+1,r);}
}
ll a[maxn],ans[maxq];
int main()
{int t,n,m,i,j,cur;scanf("%d",&t);while(t--){mp.clear();scanf("%d",&n);//cout<<"!"<<endl;build(1,1,n);//cout<<"!!"<<endl;for(i=1;i<=n;i++)scanf("%lld",&a[i]);scanf("%d",&m);for(i=1;i<=m;i++){scanf("%lld%lld",&q[i].l,&q[i].r);q[i].id=i;}sort(q+1,q+m+1,cmp);cur=1;//cout<<1<<endl;for(i=1;i<=m;i++){for(j=cur;j<=q[i].r;j++){if(mp.find(a[j])!=mp.end()){update(1,mp[a[j]],0);}update(1,j,a[j]);mp[a[j]]=j;}cur=q[i].r+1;ans[q[i].id]=query(1,q[i].l,q[i].r);}for(i=1;i<=m;i++)printf("%lld\n",ans[i]);}
}

hdu 3333 Turing Tree 求区间内不同数的和——线段树解法相关推荐

  1. SPOJ DQUERY 求区间内不同数的个数 主席树

    这题跟HDU3333差不多吧. 离线的做法很简单,不再说了 以前做过. 主席树的做法就比较暴力了.. 什么是主席树呢.. 其实是某种称号. 在该题中的体现是可持久化的线段树. 对于一个数 如果以前没出 ...

  2. HDU 3333 Turing Tree(树状数组+离线处理+离散化)

    题目大意 给一个 n(1≤n≤30000) 个数,数的范围是 0~109.现在给了 Q 个询问,询问的内容是:一个区间 [L, R] 中,所有不同的数的和是多少? 其实和 HDU 3874 一个意思 ...

  3. HDU - 3333 Turing Tree 线段树区间不同值和+详解+思想

    传送门 首先第一次做这种求不同元素和的线段树题,猜想是个裸题.但是题目中有一句话显然给题目降低了很大的难度,就是 想想其实它就是在暗示你这道题你要结合多次询问来处理,也就是所谓的离线,而不是一次一次的 ...

  4. HDU - 3333 Turing Tree(线段树+离线处理)

    题目链接:点击查看 题目大意:给定一个长度为n的数列,依次求m个区间中不相同数字之和 题目分析:n给的是3e4,看到区间问题先要想到线段树或差分区间或动态规划,暴力是肯定不行滴,那么这个题已经知道是需 ...

  5. HDU 3333 Turing Tree(树状数组/主席树)

    题意 给定一个长度为 \(n​\) 的序列,\(m​\) 个查询,每次查询区间 \([L,R]​\) 范围内不同元素的和. \(1\leq T \leq 10\) \(1 \leq n\leq 300 ...

  6. ZOJ - 4117 BaoBao Loves Reading(树状数组求区间内不同数的个数+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,其意义为第 i 秒需要看第 a[ i ] 种书,书架上可以供应无限种书,但是书桌有容量,当书桌上的容量达到上限后,如果还想从书架上拿新书来看, ...

  7. hud 3874 求区间内不同数字的和

    http://acm.hdu.edu.cn/showproblem.php?pid=3874 和求区间内不同数字的个数一样. //#include<bits/stdc++.h> //usi ...

  8. python acm 素数个数_湘潭大学OJ-1098求区间内素数个数问题

    求区间内素数个数问题 题目描述 Description 给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数.限制:Time Limit : 1 ...

  9. 区间内x的出现个数(主席树)

    题目大概:求区间内x出现的次数 出题人yjy Description ZJK 给你一个长度为 n 的数列和 m 次询问,每次询问从第 l 个到第 r 个数中,数 x 出现 了多少次. Input 第一 ...

最新文章

  1. SpringBoot + MyBatis(注解版),常用的SQL方法
  2. 2021零售行业营销自由白皮书
  3. 权限管理系统之用户管理
  4. 【数据预测】基于matlab斑点鬣狗算法优化BP神经网络数据预测【含Matlab 219期】
  5. vmlinuz的产生
  6. tp交换机管理页面_TP-LINK交换机设置细节
  7. [互联网]互联网公司的种类
  8. 小程序数据监测工具分析
  9. 生理学知识点总结--biologic
  10. 苹果可以用android流量监控,iPhone怎么看流量统计?
  11. 未知usb设备(设备描述请求失败)_HomePod mini?电源线同样不可拆卸:但或能用USB-C移动电源供电...
  12. 对于企业是云服务器划算还是自购服务器划算?
  13. MACOS系统镜像与重装
  14. java导出excel文件名乱码_Poi生成excel文件名乱码问题的解决方案
  15. 锁相环原理(PLL)
  16. 关于缺少msvcp110.dll
  17. 树莓派设置WiFi上网
  18. 3D重构基础四--Planar Homography Epipolar Geometry
  19. 【URAL 1136 --- Parliament】二叉树的遍历
  20. 推荐好用的vue插件02 v-md-editor富文本编辑器

热门文章

  1. 在现有集群环境下动态增加(下架)新的节点
  2. incrby redis 最大值_Redis 的 8 大数据类型,写得非常好!
  3. python 在线培训费用-python培训班费用
  4. 为何python不好找工作-为什么python不好找工作
  5. python入门经典-入门python有什么好的书籍推荐?
  6. python从入门到精通-小白如何系统学习python,从入门到精通?
  7. python有道-Python调用有道词典翻译
  8. python 计算机程序设计-计算机二级教程python第一章 程序设计语言
  9. python学了有什么用-python学来有什么用
  10. python和java选择哪个-JAVA和Python哪个好就业?