zoukankan      html  css  js  c++  java
  • HDOJ 2433 Counter Strike 逆序对 线段树

    Problem Description

    Anti-terrorism is becoming more and more serious nowadays. The country now has n soldiers,and every solider has a score.

    We want to choose some soldiers to fulfill an urgent task. The soldiers chosen must be adjacent to each other in order to make sure that they can cooperate well. And all the soldiers chosen must have an average score greater than a.

    Now, please calculate how many ways can the chief of staff choose the soldiers.
     
    Input
    The first line consists of a single integer t, indicating number of test cases.

    For each test case, the first line gives n, the number of soldiers, and a, the minimum possible average score(n<=100000,a<=10000). The second line gives n integers, corresponding to the soldiers' scores in order. All the scores are no greater than 10000.
     
    Output
    An integer n, number of ways to choose the soldiers.
     
    Sample Input
    2
    5 3
    1 3 7 2 4
    1 1000
    9999
     
    Sample Output
    10 1
     
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 struct date
     8 {
     9       int lt,rt,Max,ans;
    10 }node[300005];
    11 int arr[100005],cnt[100005],val,N,A;
    12 
    13 int build_tree( int lt,int rt,int t )
    14 {               
    15        node[t].lt  = lt;
    16        node[t].rt  = rt;
    17        node[t].ans = 0;
    18        if( lt == rt )
    19             return node[t].Max = cnt[lt];
    20        int mid = ( lt + rt )>>1;
    21             return node[t].Max = max( build_tree( lt,mid,t<<1 ),build_tree( mid+1,rt,t<<1|1 ) );
    22 }
    23        
    24 int inset_tree( int t,int wi )
    25 {
    26     val += node[t].ans;
    27     if( node[t].lt == node[t].rt )
    28     {
    29        if( node[t].Max > 0 )val++; 
    30        return 0;
    31     }
    32     if( node[t<<1].Max >= wi )
    33     {
    34         inset_tree( t<<1,wi );  
    35         node[t<<1|1].ans++;
    36     }
    37     else inset_tree( t<<1|1,wi );
    38                 return 0;
    39 }
    40 
    41 int main( )
    42 {
    43     int i,T;
    44     long long res;
    45     scanf("%d",&T); 
    46     while( T-- )
    47     {
    48         res = 0;
    49         scanf("%d%d",&N,&A);
    50         for( i = 1; i <= N; i++ )
    51         {
    52             scanf("%d",&arr[i]);
    53             arr[i] = arr[i-1] + arr[i] - A;
    54             cnt[i] = arr[i];
    55         }    
    56         sort( &cnt[1], &cnt[1] + N );
    57         int t = unique( &cnt[1],&cnt[1] + N ) - &cnt[1];
    58         build_tree( 1,t,1 );
    59         for( i = 1; i <= N; i++ )
    60         {
    61             val = 0;
    62             inset_tree( 1,arr[i] );
    63             res += val;
    64         }
    65         printf("%I64d\n",res);
    66     }
    67     //system("pause");
    68     return 0;
    69 }
  • 相关阅读:
    简单的几句接口调用,完美完成缩短网站
    nodejs语言实现验证码生成功能
    人工智能:文本相似度分析
    SolrCloud 5.2.1 installation and configuration
    借鉴DP思想: HouseRobberIII
    有意思的数学题:Trapping Rain Water
    API认证方法一览
    FE: Responsive Web Design Overview
    FE: Sass and Bootstrap 3 with Sass
    假期小记:14年寒假二三四事(儿)
  • 原文地址:https://www.cnblogs.com/wulangzhou/p/2955884.html
Copyright © 2011-2022 走看看