• 4.2


    https://vjudge.net/contest/156696

    这是2014年多校5的比赛重新开了一遍

    A题

    题意:给你长度为n的序列,问让你进行最多k次相邻的数之间交换之后序列的最小逆序数是多少

    思路:先求当前数的最小逆序数num,然后num-k即为最后的结果。由于n挺大的直接进行计算的话时间复杂度是O(n^2)所以使用线段树缩小时间复杂度到(log(n))。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn=100005;
     7 struct node
     8 {
     9     long long id,num;
    10 } a[maxn];
    11 long long cmp(const node &x,const node &y)
    12 {
    13     if(x.num!=y.num)
    14         return x.num>y.num;
    15     else
    16         return x.id>y.id;
    17 }
    18 struct Node
    19 {
    20     int l,r,m;
    21 }b[maxn<<2];
    22 void build(int l,int r,int k)
    23 {
    24     b[k].l=l,b[k].r=r,b[k].m=0;
    25     if(l==r)
    26     {
    27         return ;
    28     }
    29     int mid=(l+r)/2;
    30     build(l,mid,k*2);
    31     build(mid+1,r,k*2+1);
    32     return ;
    33 }
    34 void init(int d,int k)
    35 {
    36     if(b[k].l==b[k].r&&b[k].r==d)
    37     {
    38         b[k].m=1;
    39         return ;
    40     }
    41     if(d>b[k*2].r) init(d,k*2+1);
    42     else init(d,k*2);
    43     b[k].m=b[k*2].m+b[k*2+1].m;
    44     return ;
    45 }
    46 int query(int l,int r,int k)
    47 {
    48     if(b[k].l==l&&b[k].r==r)
    49     {
    50         return b[k].m;
    51     }
    52     int ans=0;
    53     if(l>b[k*2].r) ans+=query(l,r,k*2+1);
    54     else if(r<=b[k*2].r) ans+=query(l,r,k*2);
    55     else
    56     {
    57         ans+=query(l,b[k*2].r,k*2);
    58         ans+=query(b[k*2].r+1,r,k*2+1);
    59     }
    60     return ans;
    61 }
    62 int main()
    63 {
    64     long long  n,k;
    65     while(~scanf("%lld%lld",&n,&k))
    66     {
    67         for(long long i=0; i<n; i++)
    68         {
    69             scanf("%lld",&a[i].num);
    70             a[i].id=i;
    71         }
    72         sort(a,a+n,cmp);
    73         long long ans=0;
    74         int tmp=0;
    75         build(0,n-1,1);
    76         for(long long i=0; i<n; i++)
    77         {
    78             long long p=a[i].id;
    79             init(p,1);
    80             tmp=0;
    81             if(p!=0)
    82             tmp=query(0,p-1,1);
    83             ans+=tmp;
    84         }
    85         if(ans>k)
    86         printf("%lld
    ",ans-k);
    87         else
    88             printf("0
    ");
    89     }
    90     return 0;
    91 }
    View Code

    B题

    C题

    D题

    E题

    题意:给你由‘(’、‘)’、和‘?’三种字符组成的字符串,问是否能够进行括号匹配,如果能是仅有一种匹配还是有多种?

    F题

    G题

    H题

    I题

    J题

  • 相关阅读:
    LOJ#6501. 「雅礼集训 2018 Day4」Cube 题解
    LOJ#6510. 「雅礼集训 2018 Day8」A 题解
    LOJ#6513. 「雅礼集训 2018 Day10」足球大战 题解
    LOJ#6507. 「雅礼集训 2018 Day7」A 题解
    LOJ#6038. 「雅礼集训 2017 Day5」远行 题解
    Luogu P4208 [JSOI2008]最小生成树计数
    CodeForces 916D Jamie and To-do List
    CodeForces 573B Bear and Blocks
    CodeForces 460C Present
    CodeForces 786B Legacy
  • 原文地址:https://www.cnblogs.com/wang-ya-wei/p/6664629.html
Copyright © 2020-2023  润新知