树状数组:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = ;
  4. int id[maxn],tree[maxn],vis[maxn],num[maxn];
  5. int n,m;
  6. struct Tree{
  7. int l,r;
  8. int pos;
  9. };
  10. Tree a[maxn];
  11. int buf[];
  12. inline void read(int &x){
  13. char ch=getchar(); x=;
  14. while(ch<'') ch=getchar();
  15. while(ch>='' && ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
  16. }
  17. inline void write(int x){
  18. if(!x){putchar('');putchar(' ');return;}
  19. register int cnt=;
  20. while(x)buf[++cnt]=(x%)+,x/=;
  21. while(cnt)putchar(buf[cnt--]);
  22. putchar('\n');
  23. }
  24. bool cmp(Tree x,Tree y){
  25. return x.r < y.r;
  26. }
  27. int lowbit(int x){
  28. return x & -x;
  29. }
  30. void add(int x,int now){
  31. while(x <= n){
  32. tree[x] += now;
  33. x += lowbit(x);
  34. }
  35. }
  36. int sum(int n){
  37. int ans = ;
  38. while(n != ){
  39. ans += tree[n];
  40. n -= lowbit(n);
  41. }
  42. return ans;
  43. }
  44. int main(){
  45. read(n);
  46. for(int i = ;i <= n;i++)
  47. read(id[i]);
  48. read(m);
  49. for(int i = ;i <= m;i++){
  50. read(a[i].l);
  51. read(a[i].r);
  52. a[i].pos = i;
  53. }
  54. sort(a+,a++m,cmp);
  55. int next = ;
  56. for(int i = ;i <= m;i++){
  57. for(int j = next;j <= a[i].r;j++){
  58. if(vis[id[j]])
  59. add(vis[id[j]],-);
  60. add(j,);
  61. vis[id[j]] = j;
  62. }
  63. next = a[i].r+;
  64. num[a[i].pos] = sum(a[i].r)-sum(a[i].l-);
  65. }
  66. for(int i = ;i <= m;i++)
  67. write(num[i]);
  68. return ;
  69. }

线段树:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 5e6+;
  4. struct segment_tree{
  5. int l,r,s,sum;
  6. };
  7. segment_tree ask[maxn<<],tree[maxn<<];
  8. int next[maxn],pre[maxn],a[maxn],x[maxn],n,m;
  9. int buf[];
  10. inline void read(int &x){
  11. char ch=getchar(); x=;
  12. while(ch<'') ch=getchar();
  13. while(ch>='' && ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
  14. }
  15. inline void write(int x){
  16. if(!x){putchar('');putchar(' ');return;}
  17. register int cnt=;
  18. while(x)buf[++cnt]=(x%)+,x/=;
  19. while(cnt)putchar(buf[cnt--]);
  20. putchar('\n');
  21. }
  22. bool cmp1(segment_tree x,segment_tree y){
  23. if (x.l == y.l)return x.r < y.r;
  24. else return x.l < y.l;
  25. }
  26. bool cmp2(segment_tree x,segment_tree y){
  27. return x.s < y.s;
  28. }
  29. inline void pushup(int root){
  30. tree[root].sum = tree[root<<].sum+tree[root<<|].sum;
  31. }
  32. inline void build(int root,int l,int r){
  33. tree[root].l = l;
  34. tree[root].r = r;
  35. if(l == r){
  36. tree[root].sum = a[l];
  37. return;
  38. }
  39. int mid = (l+r)>>;
  40. build(root<<,l,mid);
  41. build(root<<|,mid+,r);
  42. pushup(root);
  43. }
  44. inline void update(int root,int k){
  45. if (tree[root].l == k && tree[root].r == k){
  46. a[k] = ;
  47. tree[root].sum = a[k];
  48. return;
  49. }
  50. int mid = (tree[root].l+tree[root].r)>>;
  51. if(k <= mid)update(root<<,k);
  52. else update(root<<|,k);
  53. pushup(root);
  54. }
  55. inline int query(int root,int l,int r){
  56. if(tree[root].l == l && tree[root].r == r)
  57. return tree[root].sum;
  58. int mid = (tree[root].l+tree[root].r)>>;
  59. if(r <= mid)return query(root<<,l,r);
  60. else
  61. if(l > mid)return query(root<<|,l,r);
  62. else return(query(root<<,l,mid)+query(root<<|,mid+,r));
  63. }
  64. int main(){
  65. read(n);
  66. for(register int i = ;i <= n;i++){
  67. read(x[i]);
  68. next[pre[x[i]]] = i;
  69. if(!pre[x[i]])a[i] = ;
  70. pre[x[i]] = i;
  71. }
  72. build(,,n);
  73. scanf("%d",&m);
  74. for(register int i = ;i <= m;i++){
  75. read(ask[i].l);
  76. read(ask[i].r);
  77. ask[i].s = i;
  78. }
  79. sort(ask+,ask+m+,cmp1);
  80. ask[].l = ;
  81. for(register int i = ;i <= m;i++){
  82. if(ask[i-].l != ask[i].l)
  83. for(register int j = ask[i-].l;j <= ask[i].l-;j++)
  84. if(next[j])update(,next[j]);
  85. ask[i].sum = query(,ask[i].l,ask[i].r);
  86. }
  87. sort(ask+,ask+m+,cmp2);
  88. for(register int i=;i<=m;i++)
  89. write(ask[i].sum);
  90. return ;
  91. }

别问我为什么补贴出来分块做法...

因为没学懂!!!没打出来!!!好不容易打出来,给我超时!!!气死了!!!

[SDOI2009]HH的项链-树状数组/线段树的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

  7. BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...

  8. BZOJ 3333 排队计划 树状数组+线段树

    题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...

  9. 第十四个目标(dp + 树状数组 + 线段树)

    Problem 2236 第十四个目标 Accept: 17    Submit: 35 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

随机推荐

  1. pytorch识别CIFAR10:训练ResNet-34(自定义transform,动态调整学习率,准确率提升到94.33%)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 前面通过数据增强,ResNet-34残差网络识别CIFAR10,准确率达到了92.6. 这里对训练过程 ...

  2. Java数据库学习之分页查询

    分页查询  limit [start],[rows] 思路: pram start 从哪一行开始 关键是从哪一行开始,需要根据查询的页数来进行换算出查询具体页数是从哪一行开始 start = (pag ...

  3. vue前端开发。。。

    1. 官网下载 https://nodejs.org/en/ 2. 安装cnpm   在命令行:  npm install -g cnpm --registry=https://registry.np ...

  4. Tomcat热部署--start tomcat后就可自动部署war包

    使用tomcat图形化界面,需要现在配置文件中设置用户名和密码: 在maven中配置Tomcat插件: root目录下的内容可以直接访问: 跳过测试: 查看端口占用:

  5. xml 解析参考文档

    https://www.cnblogs.com/a1656344531/archive/2012/11/28/2792863.html

  6. xgboost 非官方每天编译

    xgboost  http://ssl.picnet.com.au/xgboost/ 非官方每天编译

  7. 前端js日期时间格式转换

    前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示. 下面是分享一些不同格式的日期转换函数方法. /** * 时间戳转时间 * @param {S ...

  8. 本机Jenkins的使用

    1.启动jenkins: 命令:java -jar D:\toolspackage\jenkins\jenkins.war  打开jenkins网页:http://localhost:8080/ 2. ...

  9. MYSQL配置主从同步

    MYSQL配置主从同步 mysql主服务器配置 vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql. ...

  10. Codeforces 1092F Tree with Maximum Cost(树形DP)

    题目链接:Tree with Maximum Cost 题意:给定一棵树,树上每个顶点都有属性值ai,树的边权为1,求$\sum\limits_{i = 1}^{n} dist(i, v) \cdot ...