//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. bottomNavigationBar 底部导航tab MD

    1.先上图: 此底部Tab完全可以满足日常的开发 2.使用: 很简单,使用Gradle构建:compile ‘com.ashokvarma.android:bottom-navigation-bar: ...

  2. Unity5.1 新的网络引擎UNET(十五) Networking 引用--上

    http://blog.csdn.net/u010019717/article/details/46993697 孙广东  2015.7.21 本节提供了与网络系统一起使用的组件的详细信息. 1.Ne ...

  3. hive数据库的一些应用

    1.创建表格create table usr_info(mob string,reason string,tag string) row format delimited fields termina ...

  4. Java 集合系列 05 Vector详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. hive分区导致FAILED: Hive Internal Error: java.lang.NullPointerException(null)

    写了一条hive sql ,其中条件中存在 dt>=20150101 and dt<=20150228 这样的条件,原来执行没问题,今天就抛出 FAILED: Hive Internal ...

  6. 四则运算(Android版)

    MainActivity: package com.example.demon; import android.os.Bundle; import android.app.Activity; impo ...

  7. matlab(数组、矩阵)

  8. arrow css

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. fill_parent和wrap_content的区别

    在Android布局文件中定义视图垂直或水平大小: android:layout_width和android_layout_height的属性有fill_parent.wrap_content和mat ...

  10. GBK编码相关

    如上图.的GBK编码是A3AE, 那么·对应的无符号整数值应该是A*16**3+E*16**2+A+3, 无符号整数值所在地址的第一个自己是A3,第二个字节是AE