//Accepted    28904 KB    781 ms
 //划分树
 //所求x即为l,r区间排序后的中位数t
 //然后求出小于t的数的和sum1,这个可以用划分树做
 //求出整个区间的和sum,可以用O(1)的数组做
 //ans=(k-1)*t-sum1+sum-sum1-(l-r+1-k+1)*t
 #include <cstdio>
 #include <cstring>
 #include <iostream>
 #include <queue>
 #include <cmath>
 #include <algorithm>
 using namespace std;
 /**
   * This is a documentation comment block
   * 如果有一天你坚持不下去了,就想想你为什么走到这儿!
   * @authr songt
   */
 ;
 struct node
 {
     int val[imax_n];
     int num[imax_n];
     __int64 sum[imax_n];
 }f[];

 int a[imax_n];
 __int64 all[imax_n];
 int sorted[imax_n];
 int n;

 void build(int t,int l,int r)
 {
     if (l==r) return ;
     ;
     ;
     ;
     for (int i=l;i<=r;i++)
     {
         if (f[t].val[i]<sorted[mid]) isame--;
     }
     int ln=l;
     ;
     for (int i=l;i<=r;i++)
     {
         if (i==l)
         {
             f[t].num[i]=;
             f[t].sum[i]=;
         }
         else
         {
             f[t].sum[i]=f[t].sum[i-];
             f[t].num[i]=f[t].num[i-];
         }

         if (f[t].val[i]<sorted[mid])
         {
             f[t].num[i]++;
             f[t].sum[i]+=f[t].val[i];
             f[t+].val[ln++]=f[t].val[i];
         }
         else if (f[t].val[i]>sorted[mid])
         {
             f[t+].val[rn++]=f[t].val[i];
         }
         else
         {
             if (same<isame)
             {
                 same++;
                 f[t].num[i]++;
                 f[t].sum[i]+=f[t].val[i];
                 f[t+].val[ln++]=f[t].val[i];
             }
             else
             {
                 f[t+].val[rn++]=f[t].val[i];
             }
         }
     }
     build(t+,l,mid);
     build(t+,mid+,r);
 }
 __int64 sum=;
 int lnum;
 int query(int t,int l,int r,int a,int b,int k)
 {
     int s,ss;
     if (l==r) return f[t].val[l];
     ;
     __int64 tsum=;
     if (a==l)
     {
         ss=;
         s=f[t].num[b];
         tsum=f[t].sum[b];
     }
     else
     {
         ss=f[t].num[a-];
         s=f[t].num[b]-ss;
         tsum=f[t].sum[b]-f[t].sum[a-];
     }
     if (s>=k)
     {
         a=l+ss;
         b=l+ss+s-;
         ,l,mid,a,b,k);
     }
     else
     {
         //lnum+=s;
         int b1=a-l-ss;
         -s;
         a=mid++b1;
         b=mid+b1+b2;
         sum+=tsum;
         ,mid+,r,a,b,k-s);
     }
 }
 int Q;
 int x,y;
 void slove()
 {
     build(,,n);
     scanf("%d",&Q);
     ;i<=Q;i++)
     {
         scanf("%d%d",&x,&y);
         x++;
         y++;
         __int64 sum1=all[y]-all[x-];
         //printf("sum1=%I64d\n",sum1);
         sum=;
         //lnum=0;
         //printf("sum=%I64d\n",sum);
         -x+;
         ,,n,x,y,k);
         //printf("t=%d\n",t);
         lnum=k-;
         __int64 ans=-sum+sum1-sum-(__int64 )(y-x+-lnum-lnum)*t;
         printf("%I64d\n",ans);
     }
 }
 int main()
 {
     int T;
     ;
     scanf("%d",&T);
     while (T--)
     {
         scanf("%d",&n);
         all[]=;
         ;i<=n;i++)
         {
             scanf("%d",&a[i]);
             f[].val[i]=sorted[i]=a[i];
             all[i]=all[i-]+a[i];
         }
         printf("Case #%d:\n",++t);
         sort(sorted+,sorted+n+);
         slove();
         printf("\n");
     }
     ;
 }

hdu3473 线段树 划分树的更多相关文章

  1. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  2. poj2104 线段树 划分树

    学习:http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html 划分树的build: 划分树是分层构建的,在构建的t层时,我们可以 ...

  3. poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 43315   Accepted: 14296 Ca ...

  4. POJ 题目2761 Feed the dogs(主席树||划分树)

    Feed the dogs Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 16860   Accepted: 5273 De ...

  5. poj 2104 K-th Number (划分树入门 或者 主席树入门)

    题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...

  6. sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)

    Boring Counting Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述     In this problem you a ...

  7. 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))

    函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...

  8. HDU 4417 (划分树+区间小于k统计)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...

  9. POJ2104 k-th number 划分树

    又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...

随机推荐

  1. linux gcc 编译动态类库(.so)和静态类库(.a)

    linux gcc 编译动态类库(.so)和静态类库(.a) 我的编译环境 ubuntu desktop 16.04 一:测试代码 测试有3个文件:AB.h,AB.c,test.c //AB.h vo ...

  2. 【转】 Live555

    Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...

  3. 常用SQL语句(交互)

    %-------通配符 select * from [EMoney_Club].[dbo].[GoldIdea_AdviceCollect] where [Content] like '%昵称%' s ...

  4. bootstrap的警告框

    .alert 基础警告框 .alert-danger  红色警告框 .alert-dismissable  修饰警告框 alert-dismiss="alert" 触发警告框 // ...

  5. 百度Tera数据库介绍——类似cassandra,levelDB

    转自:https://my.oschina.net/u/2982571/blog/775452 设计背景 百度的链接处理系统每天处理万亿级的超链数据,在过去,这是一系列Mapreduce的批量过程,对 ...

  6. noip知识点总结之--线性筛法及其拓展

    一.线性筛法 众所周知...线性筛就是在O(n)的时间里找出所有素数的方法 code: void get_prime(int N){ int i, j, k; memset(Flag, ); ; i ...

  7. PDF 补丁丁 0.4.1.688 测试版发布(请务必用其替换 682 测试版)

    修复了测试版682 损坏书签.读取字符宽度表出错的问题.请下载了旧测试版的网友马上换用新的测试版.

  8. linux命令行快捷键

    linux命令行编辑快捷键 先总结几个个人觉得最有用的 ctrl + ? 撤消前一次输入 ctrl + c 另起一行 ctrl + r 输入单词搜索历史命令 ctrl + u 删除光标前面所有字符相当 ...

  9. [Js]封装好的通过className来获取元素的函数

    <div id="box"> <div class="star"></div> <div class="st ...

  10. hdu 4606 Occupy Cities

    http://acm.hdu.edu.cn/showproblem.php?pid=4606 两点之间如果有线段相隔的话,他们的最短路就需要经过线段的端点 把所有线段的端点也加入点数组中,求任意两个点 ...