zoukankan      html  css  js  c++  java
  • [CF351E]Jeff and Permutation——贪心

    题目大意:

    给出数组a ,你可以改变每个数的正负,求逆序对数最少是多少

    思路:

    考虑一个数对((a_i,a_j))的贡献之和绝对值大的那个数字有关。
    于是我们把每个数对的计算放在绝对值较大的那个数上面,不难发现这个位置产生的逆序对只和它自己本身的正负有关,直接BIT贪心就好了。

    #include<bits/stdc++.h>
    
    #define REP(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)
    #define DREP(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)
    #define debug(x) cout<<#x<<"="<<x<<endl
    #define fi first
    #define se second
    #define mk make_pair
    #define pb push_back
    typedef long long ll;
    
    using namespace std;
    
    void File(){
    	freopen("inverse.in","r",stdin);
    	freopen("inverse.out","w",stdout);
    }
    
    template<typename T>void read(T &_){
    	_=0; T f=1; char c=getchar();
    	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
    	for(;isdigit(c);c=getchar())_=(_<<1)+(_<<3)+(c^'0');
    	_*=f;
    }
    
    const int maxn=1e6+10;
    const int N=1e6;
    int n,a[maxn];
    ll ans;
    
    struct BIT{
    	int sum[maxn];
    	int lowbit(int x){return x&(-x);}
    	void add(int p,int x){for(;p<=N;p+=lowbit(p))sum[p]+=x;}
    	int query(int p){int ret=0;for(;p>=1;p-=lowbit(p))ret+=sum[p];return ret;}
    }T1,T2;
    
    int main(){
    	File();
    	read(n);
    	REP(i,1,n)read(a[i]),a[i]=abs(a[i])+1;
    	REP(i,1,n)T1.add(a[i],1);
    	REP(i,1,n){
    		ans+=min(T1.query(a[i]-1),T2.query(a[i]-1));
    		T1.add(a[i],-1);
    		T2.add(a[i],1);
    		//printf("%d
    ",T1.query(N)+T2.query(N));
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    Solaris 11 system package 安装与更新(如:assembler)
    JS实现页面内跳转
    使用Eclipse进行嵌入式软件开发
    Eclipse下C++标准库报错::mbstate_t has not been declared
    嵌入式ARM开发环境搭建
    CCS内存数据转成图片
    RESET
    Android 圆角研究
    Java 重写必须满足的条件
    android 社会化分享集成
  • 原文地址:https://www.cnblogs.com/ylsoi/p/10163669.html
Copyright © 2011-2022 走看看