还是膜网上题解QAQ
从低到高考虑,这样就不会影响后挪的草了。
每次把草贪心地挪到代价较小的一边。位置为i的草,花费为min( 1..i-1中更高的草的数目,i+1..n中更高的草的数目 )
因为更小的草已经被挪到两边了..所以代价就是更高的草的数目。
拿个树状数组统计一下就好了。
1 #include2 #include 3 #include 4 #include 5 #define ll long long 6 using namespace std; 7 const int maxn=300002; 8 struct zs{ int v,id;}a[maxn]; 9 int mp[maxn],t[maxn],t1[maxn];10 ll ans;11 int i,j,k,n,m,cnt;12 13 int ra;char rx;14 inline int read(){15 rx=getchar(),ra=0;16 while(rx<'0'||rx>'9')rx=getchar();17 while(rx>='0'&&rx<='9')ra=ra*10+rx-48,rx=getchar();return ra;18 }19 bool cmp(zs a,zs b){ return a.v 1;i--){29 j=mp[i];while(j<=cnt)t1[j]--,j+=j&-j;30 x=n-i,y=i-1;31 j=mp[i];while(j)x-=t[j],y-=t1[j],j-=j&-j;32 ans+=x