您的位置:首页 > 其它

BZOJ 4240 有趣的家庭菜园

2017-02-02 18:00 246 查看
树状数组+贪心

感觉最近写博客有一点高产。。。

考虑从小到大放。最小的要么放最左,要么放最右。由于它放左还是右不会影响中间元素的操作次数,所以直接贪心。以此类推。

#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 300005
#define lowbit(_i) (_i&-_i)
using namespace std;
namespace runzhe2000
{
typedef long long ll;
int n, a
, rk
, mx, q
, tail; ll ans;
struct BIT
{
int t
; BIT(){memset(t,0,sizeof t);}
int ask(int x){int r = 0; for(; x; x -= lowbit(x)) r += t[x]; return r;}
void mod(int x){for(; x <= n; x += lowbit(x)) t[x]++;}
}T;
bool cmp(int u, int v){return a[u] > a[v];}
void main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]), rk[i] = i;
sort(rk+1, rk+1+n, cmp);
for(int i = 1, tot = 0; i <= n; i++)
{
if(a[rk[i]] != a[rk[i-1]]) {tot += tail; for(; tail; tail--) T.mod(q[tail]);}
int x = rk[i], lef = T.ask(x-1), rig = tot-lef;
ans += min(lef, rig); q[++tail] = x;
}
printf("%lld\n",ans);
}
}
int main()
{
runzhe2000::main();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: