zoukankan      html  css  js  c++  java
  • bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)

    4240: 有趣的家庭菜园

    题目:传送门 


    题解:

       好题!%%%

       一开始不知道在想什么鬼,感觉满足二分性?感觉可以维护一个先单调增再单调减的序列?

       然后开始一顿瞎搞...一WA

       看一波路牌...树状数组+贪心...起手就是一发伏地膜大师 

       mdzz一个超级沙比但是经常被忽略的结论:对于最后操作完的序列,我们把原来的下标取出求一遍逆序对就是操作次数了啊

       模型转化为求一个最终序列使得逆序对数最少

       补一个树状数组求逆序对:对于当前数x,考虑以权值建树状数组,getsum求出小于等于x的数的个数,用sum减一下就OK

       那么我们把高度排序(肯定从大到小放),最高的放中间,后面的考虑放在左边和右边的逆序对影响。

       坑点:要记得消去相同数的影响啊,因为相同的两个数挨在一起交不交换无所谓啊...

        


    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define qread(x) x=read()
     7 #define inf 1e9
     8 using namespace std;
     9 typedef long long LL;
    10 inline int read() {
    11     int f=1,x=0;char ch;
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return f*x;
    15 }
    16 int n,s[310000],a[310000],w[310000];
    17 int lowbit(int x){return x&-x;}
    18 void change(int x,int c){while(x<=n)s[x]+=c,x+=lowbit(x);}
    19 int getsum(int x){int ans=0;while(x)ans+=s[x],x-=lowbit(x);return ans;}
    20 bool cmp(int i,int j){return a[i]>a[j];}
    21 int main() {
    22     qread(n);for(register int i=1;i<=n;++i)qread(a[i]),w[i]=i;sort(w+1,w+n+1,cmp);
    23     LL ans=0;int x;a[w[0]]=a[w[1]];
    24     for(register int i=1;i<=n;i=x+1) {
    25         int sum=i-1;
    26         for(register int j=i;j<=n;++j) {    //去重 
    27             int s=getsum(w[j]);
    28             ans+=LL(min(sum-s,s));//考虑左右两边的影响 
    29             x=j;if(a[w[j+1]]!=a[w[j]])break;
    30         }
    31         for(register int j=i;j<=x;++j)change(w[j],1);//释放影响 
    32     }
    33     printf("%lld
    ",ans);
    34     return 0;
    35 }
  • 相关阅读:
    .net经典笔试题
    asp.net面试题
    Java 面 试 题
    .net面试题集
    J2EE面试题集锦
    linux下查看硬件信息
    linux下软件的安装[转]
    在Linux系统下优化Oracle具体步骤
    制作Linux的优盘启动盘
    两端对齐,图片文字列表
  • 原文地址:https://www.cnblogs.com/CHerish_OI/p/8880584.html
Copyright © 2011-2022 走看看