zoukankan      html  css  js  c++  java
  • codeforces 1284B. New Year and Ascent Sequence(二分)

    B. New Year and Ascent Sequence

    题意:定义上升序列Ascent,在一组序列A中,存在1<i<j<n,使得Ai<Aj。现在给定n个序列,求n个序列两两组合的n^2个组合序列中,有多少个组合是Ascent序列。。

    思路: 用两个MAX,MIN数组分别记录下每个序列的最大值和最小值,然后把最大值进行排序。每次做一遍二分,取每个数组中的最小值到所有数组中的最大值中找有多少个数比它大,这样组合的新序列便是满足Ascent性质。如果本身这个序列就已经满足Ascent的性质,那么直接把最大值设置为9999999,最小值设置为-1存进去。

    AC代码:

     1 #include<iostream>
     2 #include<vector>
     3 #include<cstring>
     4 #include<map>
     5 #include<algorithm>
     6 using namespace std;
     7 vector<int> MAX;
     8 vector<int> MIN;
     9 int main(){
    10     int t;
    11     cin>>t;
    12     for(int i = 0;i<t;i++){
    13         int Length;
    14         cin>>Length;
    15         long long Min = 999999999;
    16         long long Max = -1;
    17         int ok = 0;
    18         for(int j = 0;j<Length;j++){
    19             long long cur;
    20             cin>>cur;
    21             if(cur> Min && ok == 0){
    22                 ok = 1;
    23             }
    24             Min = min(Min,cur);
    25             Max = max(Max,cur);
    26         }
    27         if(ok == 0){
    28             MAX.push_back(Max);
    29             MIN.push_back(Min);  
    30         }
    31         else{
    32             MAX.push_back(9999999);
    33             MIN.push_back(-1);  
    34         }
    35     }
    36     sort(MAX.begin() ,MAX.end() );
    37     long long ans = 0;
    38     for(int i = 0;i<t;i++){
    39         ans+=(MAX.end() -upper_bound(MAX.begin() ,MAX.end() ,MIN[i]));
    40         //cout<<ans<<endl;
    41     }
    42     cout<<ans;
    43     return 0;
    44 }
  • 相关阅读:
    C++ 修改常量的值
    Android Studio 使用入门
    Ubuntu14.04下配置固定IP
    vi/vim 按键说明
    linux下文件夹的创建、复制、剪切、重命名、清空和删除命令
    linux中的find命令——查找文件名
    shell 脚本编写基础
    linux C程序中获取shell脚本输出(如获取system命令输出)
    vi 技巧
    理解Linux中的shutdown、poweroff、halt和reboot命令
  • 原文地址:https://www.cnblogs.com/AaronChang/p/12185453.html
Copyright © 2011-2022 走看看