锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
緇欏嚭n<=50000涓暟鐨勫簭鍒梐[1]..a[n]錛屾眰涓涓潪閫掑噺鐨勫簭鍒梑[1]..b[n]
浣垮緱∑|a[i]-b[i]|鏈灝?br />
濡傛灉鍙槸姹備竴涓偣x錛屼嬌寰?#8721;|a[i]-b[i]|鏈灝忥紝鏄劇劧x = a[(n+1)/2]錛堜腑浣嶆暟錛?--------------OMG
浣嗙幇鍦ㄥ彲浠ユ湁澶氫釜鐐癸紝濡傛灉a[]鏄掑鐨勶紝閭d箞浠[i] = a[i]鍗沖彲浜?br />
鐜板湪a[]鏄棤瑙勫緥鐨?br />
宸﹀亸鏍戠殑璁烘枃棰橈紝鐪嬩簡璁烘枃榪樹笉瀹屽叏鎳?br />
鍋氭硶錛?br />
鏈鍚庣瓟妗堢殑褰㈠紡鏄皢1..n鍒嗘垚m涓繛緇殑鍖洪棿錛屾瘡涓尯闂寸殑b[i]鏄竴鏍風殑錛屼笖涓嶅悓鍖洪棿鏄潪閫掑噺鐨?br />
鍦ㄦ鏌鏃訛紝鍋囪1..n-1宸茬粡鍒嗘垚浜唌涓尯闂翠簡
鐜板湪鍏堟妸a[n]鍗曠嫭涓涓尯闂達紝鏄劇劧b[n]=a[n]浼氭槸1..n鐨勬渶浼樺鹼紙鍥犱負鍓嶉潰1..n-1鏄渶浼樼殑錛岃岀n涓?br />
瀵圭瓟妗堢殑璐$尞涓?錛夛紝浣嗘槸涓嶄竴瀹氭弧瓚砨[n-1]<=b[n]錛岀畻娉曚負錛?br />
鑻[n-1] <= b[n]錛屽垯b[n]灝辨槸a[n]浜?br />
鍚﹀垯錛岄渶瑕佸悎騫剁洰鍓嶆渶灝劇殑涓や釜鍖洪棿錛岀洿鑷寵繖涓や釜鍖洪棿鏈塨[k] <= b[k+1] -------OMG
鑰宐[k]鏄劇劧鏄瘡涓涓尯闂寸殑涓綅鏁頒簡
鍚堝茍涓や釜鍖洪棿姹備腑浣嶆暟錛屽彲鐢ㄥ乏鍋忔爲鍋氭渶澶у爢鍒嗗埆緇存姢姣忎釜鍖洪棿鐨勫墠(ni+1)/2灝忕殑鏁幫紝-------OMG
鍒欏爢欏朵負姣忎釜 鍖洪棿鐨勪腑浣嶆暟浜嗭紝鍚堝茍鏃訛紝灝嗗彸杈瑰尯闂寸殑閭d簺鏁板悎騫跺埌宸﹁竟鍗沖彲
O(nlogn)
宸﹀亸鏍戠湡鏄濂囨紓浜殑涓滆タ!!
鑷充簬涓轟粈涔堟槸鍚堝茍鏈鍚庝袱涓尯闂達紝灝嗙n涓暟鍜屽畠涔嬪墠閭d釜鍖洪棿鐨勪竴閮ㄥ垎鏁板悎璧鋒潵涓嶈鍚楋紵
鍋囪a[kn-1]鏄眰鍑烘潵鐨勪竴涓尯闂達紝鍒欒偗瀹氭湁a[n-1]<a[k..n-2]鐨勪腑浣嶆暟錛屽惁鍒欏皢a[n-1]鐙珛鍑烘潵浼氭洿浼?--OMG
鍚岀悊錛宎[n]<a[k..n-1]鐨勪腑浣嶆暟錛岄渶瑕佽繘琛屽悎騫訛紝閭h兘涓嶈兘a[kn]鍒嗘垚涓ら儴鍒嗭紝鑰屼笉鏄悎騫舵垚涓閮ㄥ垎鍛紵
鍗砤[k..k'], a[k'..n]錛岃繖鏍蜂篃涓嶈錛岀敱鍋囪鐭ワ紝鑲畾a[k'..n]鐨勪腑浣嶆暟<a[k..k']鐨勪腑浣嶆暟錛岄渶瑕佸悎騫?br />
錛堝ぇ浜庣殑璇濓紝a[k'+1..n-1]灝變笉浼氬悎騫跺埌閭i噷鍘誨暒~~錛?br />
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<sstream>
#include<ctime>
#include<bitset>
#include<functional>
using namespace std;
const int MAXN = 100010;
struct Node
{
int key, dist, lc, rc;
};
Node nodes[MAXN];
int alloc;
void initNode()
{
nodes[0].dist = -1;//0浣滀負NULL鑺傜偣
alloc = 1;
}
int newNode(int x)
{
nodes[alloc].key = x;
nodes[alloc].dist = 0;
nodes[alloc].lc = nodes[alloc].rc = 0;
return alloc++;
}
int merge(int A, int B)
{
if (A != 0 && B != 0) {
if (nodes[A].key < nodes[B].key) {//
swap(A, B);
}
nodes[A].rc = merge(nodes[A].rc, B);
int &lc = nodes[A].lc;
int &rc = nodes[A].rc;
if (nodes[lc].dist < nodes[rc].dist) {
swap(lc, rc);
}
nodes[A].dist = nodes[rc].dist + 1;
} else {
A = A == 0 ? B : A;
}
return A;
}
int pop(int A)
{
int t = merge(nodes[A].lc, nodes[A].rc);
nodes[A].lc = nodes[A].rc = 0;//闅旂鍑篈鍚庤寰楀皢A鐨勫効瀛愪篃娓呯┖
return t;
}
int a[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
for (int n;scanf("%d", &n), n; ) {
initNode();
stack<pair<int,int> > S;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
pair<int, int> np(newNode(a[i]), 1);//node, len
while (!S.empty() && nodes[S.top().first].key > nodes[np.first].key) {
pair<int,int> top = S.top();
S.pop();
int n1 = top.second, n2 = np.second;
np.first = merge(top.first, np.first);
np.second = n1+n2;
if ((n1+1)/2 + (n2+1)/2 > (n1+n2+1)/2) {
np.first = pop(np.first);
}
}
S.push(np);
}
long long ans = 0;
int id = n;
while (!S.empty()) {
int b = nodes[S.top().first].key, num = S.top().second;
S.pop();
while (num -- > 0) {
ans += abs(a[id--] - b);
}
}
printf("%lld\n", ans);
}
return 0;
}
]]>/**//*
緇欏嚭mx,my,w(1<= mx,my<=10^5, 1<= w <= 10^7)
姹俶inimal{x*y}錛?<=x<=mx,1<=y<=my
浣垮緱[1
x][1
y]榪欎釜鍖哄煙鍐呮弧瓚?nbsp;a*b = rev(a)*rev(b)鐨勭偣鐨勪釜鏁?gt;=w
鎴戣兘鎯沖埌鐨勬槸
鍏堥澶勭悊鍑烘墍鏈塺ev(a)錛屼粠宸﹀埌鍙蟲壂鎻弜錛屽姞榪涙柊鐨勭偣錛堝嵆鎵鏈夋弧瓚硏*b = rev(x)*rev(b),1<=b<=my錛?br>
鐒跺悗浜屽垎y錛屾壘鍑烘弧瓚硍鐨勬渶灝忕殑y
涔熸兂鍒板皢a*b = rev(a)*rev(b)鍙樺艦涓?nbsp;a/rev(a) = rev(b)/b錛屼絾鎯充笉涓嬪幓浜嗭紝
涓嶇煡鎬庝箞蹇熻幏鍙栨墍鏈夋弧瓚硏*b = rev(x)*rev(b)錛堜富瑕佹槸鍥犱負a/rev(a)鏄誕鐐規暟錛屼笉鐭ユ庝箞鐢ㄤ笅鏍囧瓨錛?br>
鐪嬩簡鍒漢鐨勶紝鐢╩ap<double,int>灝卞彲浠ヤ簡 →.→
鐪嬩簡watashi鐨勶紝鏄瓨鍒嗗瓙鍒嗘瘝錛堝厛鐢╣cd綰﹀垎涓涓嬶級 ------------------------------OMG
鎬諱綋綆楁硶灝辨槸
浠庡乏鍒板彸鎵弿x錛屽姞鍏ユ墍鏈夋弧瓚硏*b = rev(x)*rev(b)鐨勭偣
鑰屾弧瓚寵繖涓潯浠剁殑灝辨槸婊¤凍x/rev(x) = rev(b)/b鐨勶紝鐢變簬涔嬪墠宸茬粡瀛樹簡mpy[(b,rev(b))]
婊¤凍涓婇潰寮忓瓙鐐圭殑涓暟灝辨槸mpy[(rev(x),x)]浜?br>
姣旇緝紲炲鐨勬槸錛屼粬鍦ㄦ灇涓緓鏃訛紝瑕佽幏鍙栨弧瓚?gt;=w鐨剏錛屼笉鏄簩鍒唝鐨勶紝鏄氳繃寰皟鐨?nbsp; -----------OMG
鍗寵嫢褰撳墠鐨剎*y鑼冨洿鍐呯殑鐐?gt;=w,
y--;
iw -= mpx[(rev(y),y)];
mpy[(y,rev(y))]--;
鑻?lt;w錛屽啀琛ヤ笂鍘?br>
絎竴嬈$湅鍒拌繖鏍峰井璋冪殑錛岀濂囦斧~~~~~~~~~
y浠巑y鍑哄彂
涓鐩翠繚鎸乮w>=w錛屽井璋冭嚦鏈鎺ヨ繎w浣?gt;=w
鏁翠釜榪囩▼錛寉鑲畾鏄掑噺鐨剘~~
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<ctime>
#include<bitset>
using namespace std;
const long long INF = 12345678987654321LL;
const int MAXN = 100100;
pair<int,int> r[MAXN];//(i, rev(i))
inline int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
inline int rev(int x)
{
int r = 0;
while(x > 0)
{
r = r*10 + x % 10;
x /= 10;
}
return r;
}
pair<int,int> inv(pair<int,int> &p)
{
return make_pair(p.second, p.first);
}
void init()
{
for (int i = 1 ; i <= 100000; i++)
{
int t = rev(i);
int g = gcd(i,t);
r[i] = make_pair(i/g, t/g);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
init();
for (int mx,my,w; ~scanf("%d%d%d", &mx, &my, &w);)
{
map<pair<int,int>, int> mpx, mpy;
for (int y = 1; y <= my; y++)
{
mpy[r[y]]++;
}
long long X = -1, Y = -1;
long long iw = 0;
for (long long x = 1, y = my; x <= mx; x++)
{//y鏄粠my鍑哄彂鐨?/span>
iw += mpy[inv(r[x])];
mpx[r[x]]++;
while(iw >= w)
{
iw -= mpx[inv(r[y])];
mpy[r[y]]--;
y--;
if(iw < w)
{
y++;
mpy[r[y]]++;
iw += mpx[inv(r[y])];
break;
}
}
//涓鐩翠繚鎸佺潃iw>=w錛岀劧鍚庡紩榪涙柊鐨剎鏃訛紝灝濊瘯y--
//鏁翠釜榪囩▼錛寉鑲畾鏄掑噺鐨剘~~
if(iw>=w && (X == -1 || x*y < X*Y) )
{
X = x;
Y = y;
}
}
if (X == -1)
{
puts("-1");
} else
{
printf("%I64d %I64d\n", X, Y);
}
}
return 0;
}
]]>
]]>
]]>
]]>