锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
F[i][j]=max{F[i1][j1] - (sA[i-1]-sA[i1])2 - (sB[j-1]-sB[j1])2} + A[i]*B[j], 0<=i1<i, 0<=j1<j
瀵硅繖涓紡瀛愯繘琛屽寲綆錛?br />F[i][j]=max{F[i1][j1] - sA[i1]2 + 2*sA[i-1]*sA[i1] - sB[j1]2 + 2*sB[j-1]*sB[j1]}+A[i]*B[j]-sA[i-1]2-sB[j-1]2
瀵逛簬涓緇寸殑鎯呭喌錛屽緢瀹規槗澶勭悊——涓棿灝辨槸涓鏉$洿綰匡紝鐒惰岃繖鏄簩緇寸殑錛屽浜庤繖縐?D/2D鐨凞P鏂圭▼錛岃浼樺寲鍒癘(N2)綰у埆錛岄渶瑕佷袱姝ャ?br />娉ㄦ剰鍒板喅絳栧紡涓櫎浜咶[i1][j1]澶栵紝鍏跺畠閮ㄥ垎閮借涔堝彧涓巌1鏈夊叧錛岃涔堝彧涓巎1鏈夊叧銆傚洜姝わ紝鍙互鎶婇樁孌礽鐨勫悇涓姸鎬佷綔涓轟竴涓暣浣擄紝鍦ㄤ箣鍓嶅緱鍑虹殑鍚勪釜F[i][j]涓紝瀵逛簬鐩稿悓鐨刯錛屾壘鍒板浜庣洰鍓嶇殑i錛屾渶浼樼殑閭d釜鍐崇瓥——娉ㄦ剰錛屽浜庣浉鍚岀殑j1錛岄噷闈㈡墍鏈変笌j1鏈夊叧鐨勪笢瑗塊兘鍙互鍏堜笉鑰冭檻浜嗭紝鍙冭檻(F[i1][j1] - sA[i1]2 + 2*sA[i-1]*sA[i1])瀵逛簬鐩墠i鐨勬渶浼樺喅絳栥傝繖涓姝ュ彲浠ュ湪榪欎簺鐩寸嚎褰㈡垚鐨勪笂鍑稿3涓壘鍒幫紝涓旀弧瓚沖喅絳栧崟璋冩э紝鍙互鐢ㄤ竴涓爤澶勭悊錛堟枩鐜囦紭鍖栵級銆傜劧鍚庯紝灝嗚繖浜涙渶浼樺喅絳栦互j涓鴻嚜鍙橀噺鍐嶇粍鎴愪竴浜涚洿綰匡紝鐢ㄦ爤緇存姢瀹冧滑鐨勪笂鍑稿3錛屽浜庢瘡涓猨錛屾壘鍒版渶浼樺煎嵆鍙?br />娉ㄦ剰浜嬮」錛氬湪鏍堜腑鍒犻櫎鐩寸嚎鐨勬椂鍊欙紝濡傛灉涔嬪墠鐨勬渶浼樺喅絳栨槸榪欎釜琚垹鎺夌殑鐩寸嚎錛屽垯瑕佸皢鏈浼樺喅絳栧厛緗負涓嶅瓨鍦紝鐒跺悗鍐嶆彃鍏ユ柊鐩寸嚎鍚庤涓烘柊鐩寸嚎銆傚彟澶栵紝瑕佺壒鍒敞鎰忓鉤琛岀殑鎯呭喌銆?br />
銆?銆慙CIS
緇忓吀闂錛屽埄鐢ㄤ笂闈㈢殑鍒嗘浼樺寲鎬濇兂錛屽緢瀹規槗鐢ㄧ嚎孌墊爲寰楀埌涓涓狾(N2logN)鐨勫仛娉曘?br />
銆?銆?a title="[SCOI2010]鑲$エ浜ゆ槗 " >[SCOI2010]鑲$エ浜ゆ槗
F[i][j]=max{F[i-1][j], max{F[i-W-1][j-a]-A*a, F[i-W-1][j+b]+b*B}}, j<=maxP, 1<=a<=maxA, 1<=b<=maxB
娉ㄦ剰瀵逛簬鐩稿悓鐨刯錛岃綆楁柟娉曟槸涓鏍風殑錛屼笖鏄竴鏉$洿綰匡紙鐢變簬鏈夎寖鍥存墍浠ュ叾瀹炴槸綰挎錛夈?br />鎵浠ワ紝璁$畻闃舵i鏃訛紝鍙互灝?i-W-1)闃舵鎵鏈夌殑鍐崇瓥褰撴垚綰挎鎻掑叆錛岃繖浜涚嚎孌電殑鏂滅巼閮界浉絳夛紝鍥犳姣旇緝濂界淮鎶わ紝鍙渶瑕佸垽鏂竟鐣屽嵆鍙?br />
娉ㄦ剰錛孨OI2011鐨剆how铏界劧涔熺鍚堝浜庣浉鍚岀殑j璁$畻鏂規硶涓鏍鳳紝浣嗗畠灝變笉鑳戒紭鍖栵紝鍥犱負瀹冪殑鍐崇瓥鏄笉榪炵畫涓旀棤瑙勫緥鐨勶紝娌℃湁浠諱綍鍑犱綍鎬ц川銆傚洜姝わ紝瀹冨彧鑳界敤O(N3)鐨勭畻娉曡綆楀嚭鎵鏈夌姸鎬併?br />
]]>
]]>
鐪嬫潵鍩轟簬緇勫悎鏁扮殑鍋氭硶鐢變簬瑕佹灇涓懼洜鏁幫紝紜疄涓嶈……
錛堟敞錛氬悗涓や釜鐐規槸浜哄伐鏋勯犵殑鐚ョ悙鏁版嵁錛屾墍鏈夌殑N閮芥槸鑻ュ共涓皬璐ㄦ暟涔嬬Н錛屽洜鏁頒釜鏁伴兘涓婂崈錛屾湁鐨勭敋鑷充笂涓?#8230;…錛?br />
璁よ緭浜?#8230;…
Orz @sevenk
]]>
姹傚浘鐨剆-t絎琄鐭畝鍗曡礬闂錛岃嫢鏈夐暱搴︾浉鍚岀殑錛屽瓧鍏稿簭灝忕殑浼樺厛銆?br />
棣栧厛錛岀敱浜庢槸綆鍗曡礬錛屾墍浠?a title="A*" href="http://www.shnenglu.com/MatoNo1/archive/2011/05/01/145456.html">A*鏄笉鑳藉仛鐨勶紝鍥犱負鏈夊彲鑳芥湁涓ゆ潯s-i錛坕涓烘煇涓腑闂寸偣錛夎礬P1鍜孭2錛孭1姣擯2鐭紝浣嗙敱浜嶱1鍒拌揪鐨勯《鐐逛笌P2涓嶅悓錛屽鑷存渶緇堟部P1鍒拌揪t鐨勮礬寰勯暱搴﹂暱浜庢部P2鍒拌揪t鐨勶紙鐢氳嚦鏈夊彲鑳芥部P1鏍規湰鍒頒笉浜唗錛夈傜劧鍚庯紝濡傛灉鐩存帴鐢―FS錛岀敱浜庤姹傜殑鏄K浼樿В錛岃屼笉鏄渶浼樿В錛屾墍浠ヤ笉鑳戒嬌鐢ㄦ渶浼樻у壀鏋濓紙鍖呮嫭鍒嗘敮闄愮晫錛夛紝鍥犳涓撻棬涓烘渶浼樻у壀鏋濇湇鍔$殑“鏀瑰彉鎼滅儲欏哄簭”鎶宸т篃涓嶈兘浣跨敤浜嗭紝鍥犳錛岃兘澶熶嬌鐢ㄧ殑鍙湁鍙鎬у壀鏋濓紝鑰屾湰棰樼殑鏁版嵁鑼冨洿浣垮緱榪欑綆楁硶蹇呯劧TLE銆?br />
姝hВ鏄竴縐嶇敱榪唬鍔犳繁鎬濇兂鎵╁睍寰楀埌鐨?#8220;榪唬鍙樹紭”DFS銆傝緗竴涓礬寰勯暱搴︿笂闄怹錛屾悳绱鍒皌鐨勬墍鏈夌畝鍗曡礬錛屽湪鎼滅儲榪囩▼涓紝閬囧埌闀垮害澶т簬Z鐨勮礬寰勫氨鍋滄錛堝壀鏋濓級錛岀劧鍚庯紝鑻ュ緱鍒拌礬寰勪笉瓚矺鏉★紝鍒欏鍔燴鐨勫鹼紝閲嶆柊寮濮嬫悳绱紝鐩村埌寰楀埌鐨勮礬寰勬繪暟澶т簬絳変簬K鏉′負姝€傝繖閲屽彲浠ヨ繘琛屽惎鍙戝紡鐨勪紭鍖栵紝璁緂[i]涓虹偣i鍒皌鐨勬渶鐭礬闀垮害錛屽垯鎼滅儲榪囩▼涓紝鍋囪鐩墠鎼滃埌鐐筰錛屽垯錛堢洰鍓嶈礬寰勯暱搴?g[i]錛夋槸瀵規暣鏉¤礬寰勬渶鐭暱搴︾殑涔愯浼拌錛屽鏋滆繖涓艱秴榪囦簡Z錛屽氨鍙互鍓灊錛屼絾鍦ㄥ壀鏋濅箣鍓嶈璁頒笅榪欎釜瓚呰繃浜哯鐨勫惎鍙戝鹼紝鍙栧叾涓渶灝忕殑浣滀負涓嬩竴嬈¤凱浠g殑Z鍊箋傞偅涔堝浜庡瓧鍏稿簭鑲夸箞鍔烇紵鍙互鍦ㄦ悳绱㈣繃紼嬩腑錛屽己鍒跺厛鎼滅紪鍙峰皬鐨勭粨鐐癸紝榪欐牱寰楀埌鐨剆-t璺緞蹇呯劧鏄瓧鍏稿簭閫掑鐨勩傚彟澶栧彧瑕佹眰鍑虹K鏉¤礬寰勶紝鎼滅儲灝卞彲浠ョ粓姝紝鍥犱負瀹規槗璇佹槑錛岄鐩姹傜殑絎琄鐭殑璺緞涓瀹氬凡緇忔眰鍑烘潵浜嗭紙鍙笉榪囦笉涓瀹氭槸鏈鍚庝竴鏉¤屽凡錛夛紝鎵懼埌鍗沖彲銆傛澶栵紝鍦ㄦ悳绱㈣繃紼嬩腑涓嶈蹇樹簡鍙鎬у壀鏋濓紝灝辨槸濡傛灉娌跨洰鍓嶆悳鍒扮殑璺緞宸茬粡鍒頒笉浜唗浜嗭紝鍓灊銆?br />
“榪唬鍙樹紭”DFS錛屽氨鏄緗竴涓В鐨勮瘎浠峰肩殑涓婇檺錛堟渶灝忓鹼級鎴栦笅闄愶紙鏈澶у鹼級錛屽湪鎼滅儲榪囩▼涓紝濡傛灉瀹為檯璇勪環鍊鹼紙鎴栬呭惎鍙戝鹼紝濡傛灉鍙互鍔犲惎鍙戝紡浼樺寲鐨勮瘽錛夎秺榪囪繖涓檺鍒訛紝鍒欏壀鏋濄傚湪涓嬈℃悳绱㈠悗錛屽鏋滄病鏈夊緱鍒扮鍚堣姹傜殑瑙o紝灝卞皢璇ラ檺鍒跺?span style="color: red">璁句負鏈鎼滅儲榪囩▼涓秺鐣?#8220;瓚?#8221;寰楁渶榪戠殑閭d釜鍊?/strong>錛岄噸鏂板紑濮嬫悳绱紝鐩村埌鎵懼埌鎵闇瑕佺殑瑙f垨鑰?span style="color: red">鍙戠幇鏃犺В錛堝鏋滀竴嬈℃悳绱腑娌℃湁鍙戠敓瓚婄晫錛屽嵈浠嶇劧娌℃湁鎵懼埌瑙o級涓烘銆傚叾搴旂敤涓昏浣撶幇鍦ㄤ袱涓柟闈細錛?錛夋悳绱㈡爲榪囨繁鐢氳嚦鏃犻檺娣憋紝浣嗘墍闇姹傜殑閭d釜瑙e嵈涓嶆繁鐨勬儏鍐碉紱錛?錛夋眰絎琄浼樿В鐨勬儏鍐點?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
const int MAXN = 51, MAXK = 201, MAXM = 3000, INF = ~0U >> 2;
struct edge {
int a, b, w, pre, next;
} E[MAXM + MAXN], E0[MAXM + MAXN];
struct edge0 {
int a, b, w;
bool operator< (edge0 e0) const {return b < e0.b;}
} _E[MAXM];
int n, m, s, t, K, dist[MAXN], Q[MAXN + 1];
int Z, Z0, vst0[MAXN], _FL, len0, X00[MAXN], No, len[MAXK], X0[MAXK][MAXN], sum0[MAXK], reslen, res[MAXN];
bool vst[MAXN], res_ex = 0;
void init_d()
{
re(i, n) E[i].pre = E[i].next = E0[i].pre = E0[i].next = i; m = n;
}
void add_edge(int a, int b, int w)
{
E[m].a = a; E[m].b = b; E[m].w = w; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m;
E0[m].a = b; E0[m].b = a; E0[m].w = w; E0[m].pre = E0[b].pre; E0[m].next = b; E0[b].pre = m; E0[E0[m].pre].next = m++;
}
void init()
{
int m0; scanf("%d%d%d%d%d", &n, &m0, &K, &s, &t); init_d(); s--; t--;
re(i, m0) {scanf("%d%d%d", &_E[i].a, &_E[i].b, &_E[i].w); _E[i].a--; _E[i].b--;}
sort(_E, _E + m0);
re(i, m0) add_edge(_E[i].a, _E[i].b, _E[i].w);
}
void prepare()
{
re(i, n) {vst[i] = 0; dist[i] = INF;} vst[t] = 1; dist[t] = 0; Q[0] = t;
int x, y, d0, d1;
for (int front=0, rear=0; !(!front && rear==n || front==rear+1); front==n ? front=0 : front++) {
x = Q[front]; d0 = dist[x];
for (int p=E0[x].next; p != x; p=E0[p].next) {
y = E0[p].b; d1 = d0 + E0[p].w;
if (d1 < dist[y]) {
dist[y] = d1;
if (!vst[y]) {vst[y] = 1; Q[rear==n ? rear=0 : ++rear] = y;}
}
}
vst[x] = 0;
}
}
void dfs(int x, int sum)
{
if (x == t) {
if (sum <= Z) {sum0[No] = sum; len[No] = len0; re(i, len0) X0[No][i] = X00[i]; No++; if (No == K) res_ex = 1;}
else if (sum < Z0) Z0 = sum;
return;
} else {
int h0 = sum + dist[x];
if (h0 > Z) {if (h0 < Z0) Z0 = h0; return;}
vst0[x] = ++_FL; Q[0] = x; int _x, _y;
for (int front=0, rear=0; front<=rear; front++) {
_x = Q[front];
for (int p=E[_x].next; p != _x; p=E[p].next) {
_y = E[p].b;
if (!vst[_y] && vst0[_y] != _FL) {vst0[_y] = _FL; Q[++rear] = _y;}
}
}
if (vst0[t] != _FL) return;
for (int p=E[x].next; p != x; p=E[p].next) {
_y = E[p].b;
if (!vst[_y]) {vst[_y] = 1; X00[len0++] = _y; dfs(_y, sum + E[p].w); if (res_ex) return; else {len0--; vst[_y] = 0;}}
}
}
}
void solve()
{
Z = dist[s]; int No0 = 0; _FL = 0;
while (1) {
Z0 = INF; No = 0; re(i, n) {vst[i] = 0; vst0[i] = 0;}
vst[s] = 1; len0 = 1; X00[0] = s; dfs(s, 0);
if (res_ex) {
No0 = K - No0;
re(i, K) if (sum0[i] == Z) {No0--; if (!No0) {reslen = len[i]; re(j, len[i]) res[j] = X0[i][j];}}
break;
} else if (Z0 == INF) break; else {No0 = No; Z = Z0;}
}
}
void pri()
{
if (res_ex) {
printf("%d", res[0] + 1);
re2(i, 1, reslen) printf("-%d", res[i] + 1);
puts("");
} else puts("No");
}
int main()
{
init();
prepare();
solve();
pri();
return 0;
}
]]>
棰勫鐞嗭細璁綟[i]涓轟互i寮澶寸殑鏈闀夸笂鍗囧簭鍒楃殑闀垮害錛屾庝箞姹備笉鐢ㄨ浜嗗惂鍥?#8230;…
鍋囪鐩墠闇瑕佹眰闀垮害涓篗鐨勩佹爣鍙峰瓧鍏稿簭鏈灝忕殑涓婂崌搴忓垪錛屾樉鐒跺叾絎竴涓厓绱燗[i]蹇呴』婊¤凍F[i]>=M錛堟敞鎰忥紝涓嶆槸絳変簬錛屾槸澶т簬絳変簬錛侊級錛屾壘鍒版弧瓚寵繖涓潯浠剁殑鏈灝忕殑i鍗沖彲銆傜劧鍚庯紝璁劇洰鍓嶅凡緇忔眰鍑轟簡璇ュ簭鍒楃殑絎瑇涓厓绱犱負A[y]錛屽垯絎?x+1)涓厓绱燗[z]闇瑕佹弧瓚崇殑鏉′歡鏄疉[z]>A[y]錛屼笖F[z]=F[y]-1錛屾壘鍒版弧瓚寵繖涓潯浠剁殑鏈灝忕殑z鍗充負璇ュ簭鍒楃殑絎?x+1)涓厓绱犮傛寜鐓ц繖縐嶆柟娉曪紝鎵弿涓閬嶅氨鍙互姹傚嚭鏁翠釜搴忓垪錛屾椂闂村鏉傚害涓篛(N)銆傚鏋滄暣涓簭鍒楃殑鏈闀夸笂鍗囧簭鍒楅暱搴?lt;M錛屽垯鏃犺В銆?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 10010, MAXM = 1010, INF = ~0U >> 2;
int n, m, len, A[MAXN], F[MAXN], D[MAXN], res[MAXM];
void prepare()
{
D[len = 0] = INF; int l, r, mid;
rre(i, n) if (A[i] < D[len]) D[F[i] = ++len] = A[i]; else {
l = 0; r = len;
while (l < r) {
mid = l + r + 1 >> 1;
if (A[i] < D[mid]) l = mid; else r = mid - 1;
}
F[i] = l + 1; D[l + 1] = A[i];
}
}
void solve()
{
int x, y;
re(i, n) if (F[i] >= m) {
res[0] = A[i]; if (m == 1) return; x = m - 1; y = 1;
re2(j, i+1, n) if (F[j] >= x && A[j] > res[y - 1]) {res[y++] = A[j]; if (y == m) return; else x--;}
}
}
int main()
{
scanf("%d", &n); re(i, n) scanf("%d", &A[i]);
prepare();
int m_s; scanf("%d", &m_s);
re(i, m_s) {scanf("%d", &m); if (m > len) puts("Impossible"); else {solve(); re(j, m-1) printf("%d ", res[j]); printf("%d\n", res[m - 1]);}}
return 0;
}
銆?銆?a title="[HAOI2006]鏁板瓧搴忓垪
" >[HAOI2006]鏁板瓧搴忓垪
棣栧厛錛岀敱浜庡簭鍒楃殑鎵鏈夊厓绱犻兘鏄暣鏁幫紝鎵浠ュ彲浠ュ皢鍘熷簭鍒楃殑鎵鏈夊厓绱犲噺鍘誨畠鐨勪笅鏍囷紝榪欐牱灝辨妸涓婂崌搴忓垪杞寲涓轟笉涓嬮檷搴忓垪浜嗐?br />絎竴闂殑緇撴灉鏄劇劧灝辨槸(N-鏂板簭鍒楃殑鏈闀夸笉涓嬮檷搴忓垪闀垮害)銆傚叧閿湪浜庣浜岄棶銆備互涓婣鍧囪〃紺烘柊搴忓垪銆?br />璁綟[i]涓轟互A[i]緇撳熬鐨勬渶闀夸笉涓嬮檷搴忓垪闀垮害錛堝悓鏍鳳紝姹傛硶涓嶇敤璇翠簡錛夛紝G[i]涓哄湪A[i]涓嶄慨鏀圭殑鍓嶆彁涓嬪皢A[0..i]杞彉涓轟笉涓嬮檷搴忓垪鐨勬渶灝忎慨鏀歸噺銆傞鍏堟眰鍑篎[i]錛岀劧鍚庡湪姹侴[i]鏃訛紝鏋氫婦涓婁竴涓?#8220;涓嶅姩鐐?#8221;錛堝氨鏄笉淇敼鐨勫厓绱狅級A[j]錛堟樉鐒跺繀欏繪弧瓚矨[j]<=A[i]涓擣[j]=F[i]-1錛夛紝榪欐牱鏈灝忎慨鏀歸噺灝辨槸G[j]+(灝咥[j..i]杞彉涓轟笉涓嬮檷搴忓垪鐨勬渶灝忎慨鏀歸噺錛夈傚彲浠ヨ瘉鏄庯紝A[j..i]鐨勬渶浼樹慨鏀規柟妗堝繀鐒舵槸灝咥[j+1..t]鍏ㄩ儴淇敼涓篈[j]錛孉[t+1..i]鍏ㄩ儴淇敼涓篈[i]錛岃繖閲宼鏄竴涓猍j..i]鑼冨洿鐨勫箋傞棶棰樺氨鏄浣曟眰鍑烘渶浼樼殑t錛?br />涓寮濮嬶紝鍋囪t=j錛屽嵆鎶夾[j+1..i-1]鍏ㄩ儴淇敼涓篈[i]錛岃綆楀嚭淇敼閲忥紝璁句負S銆傜劧鍚庯紝鐢變簬A[j+1..i-1]涔嬮棿鐨勫厓绱犺涔堝皬浜嶢[j]錛岃涔堝ぇ浜嶢[i]錛堣繖涓槸鏄劇劧鐨勫洤錛夛紝鎴戜滑鎶婂皬浜嶢[j]鐨勫厓绱犵О涓?#8220;灝忔暟”錛屾妸澶т簬A[i]鐨勫厓绱犵О涓?#8220;澶ф暟”錛屽垯褰搕鍙杢0鏃訛紝淇敼閲忎負S-(A[i]-A[j])*(A[j+1..t0]涓殑“灝忔暟”涓暟鍑忓幓“澶ф暟”涓暟錛夈傝繖鏍鳳紝鍙渶鎵弿涓涓嬶紝姹傚嚭浣垮緱(A[j+1..t0]涓殑“灝忔暟”涓暟鍑忓幓“澶ф暟”涓暟錛夊兼渶澶х殑t0鍗沖彲銆?br />褰撶劧榪樻湁涓涓棶棰橈紝瀵逛簬鍚屼竴涓猧錛屾弧瓚?#8220;A[j]<=A[i]涓擣[j]=F[i]-1”鐨勫厓绱犱釜鏁板彲鑳芥湁寰堝錛屽鏋滀竴涓竴涓灇涓撅紝涓涓竴涓壂鎻忥紝浼氬緢鎱㈢殑鍥?#8230;…瑙e喅鏂規硶鏄紝姹傚嚭婊¤凍榪欎釜鏉′歡鐨刯涓渶灝忕殑涓涓紝璁句負j0錛岀劧鍚庢妸A[j0+1..i-1]涓殑鎵鏈?#8220;灝忔暟”鍜?#8220;澶ф暟”鍏ㄩ儴澶勭悊鍑烘潵錛岀劧鍚庣敤綾諱技鍓嶇紑鍜岀殑鏂規硶灝辮兘鎼炰簡鍥?#8230;…褰撶劧錛屼負浜嗘壘鍒癹0錛岄渶瑕佸緩涓涓簩鍒嗗浘錛岃竟涓?F[i], i)銆?br />鏈鍚庯紝涓轟簡鏂逛究錛屽彲浠ユ妸A搴忓垪鐨勫乏杈瑰姞涓涓?INF錛屽彸杈瑰姞涓涓?INF銆傛渶鍚庢葷殑鏃墮棿澶嶆潅搴︼紝鐞嗚涓婁負O(N2)錛屼絾鐢變簬鏄殢鏈烘暟鎹紝鎵浠ヨ繙榪滆揪涓嶅埌榪欎釜綰у埆銆?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 40010, INF = ~0U >> 2;
struct edge {
int a, b, pre, next;
} E[MAXN << 1];
int n, m, A[MAXN], D[MAXN], F[MAXN], W[MAXN], res1;
ll G[MAXN], res2;
void init_d()
{
re(i, n) E[i].pre = E[i].next = i; m = n;
}
void add_edge(int a, int b)
{
E[m].a = a; E[m].b = b; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m++;
}
void init()
{
scanf("%d", &n);
A[0] = -INF; re1(i, n) {scanf("%d", &A[i]); A[i] -= i;} A[++n] = INF; n++;
}
void solve()
{
init_d(); F[0] = 0; G[0] = 0; D[0] = -INF; add_edge(0, 0); int len = 0, l, r, mid, x, maxw; ll sum, tmp;
re2(i, 1, n) {
if (A[i] >= D[len]) D[F[i] = ++len] = A[i]; else {
l = 0; r = len;
while (l < r) {
mid = l + r + 1 >> 1;
if (A[i] >= D[mid]) l = mid; else r = mid - 1;
}
D[F[i] = ++l] = A[i];
}
for (int p=E[F[i]-1].next; ; p=E[p].next) if (A[i] >= A[x = E[p].b]) break;
W[x] = 0; re2(j, x+1, i) if (A[j] < A[i]) W[j] = W[j - 1] + 1; else W[j] = W[j - 1] - 1;
sum = 0; maxw = -INF; G[i] = ~0Ull >> 2;
rre2(j, i, x) {
if (A[j] <= A[i] && F[j] == F[i] - 1) {
tmp = G[j] + sum; if (tmp < G[i]) G[i] = tmp;
tmp = G[j] + sum - (ll) (maxw - W[j]) * (A[i] - A[j]); if (tmp < G[i]) G[i] = tmp;
}
if (A[j] > A[i]) sum += A[j] - A[i]; else sum += A[i] - A[j];
if (W[j] > maxw) maxw = W[j];
}
add_edge(F[i], i);
}
res1 = n - F[n - 1] - 1; res2 = G[n - 1];
}
void pri()
{
cout << res1 << endl << res2 << endl;
}
int main()
{
init();
solve();
pri();
return 0;
}
]]>
鏈矙鑼剁殑絎竴涓棤鍚戠幆濂楁爲妯″瀷錛岀邯蹇典竴涓?#8230;…
鐜鏍戯紝鎸囩殑鏄瘡涓繛閫氬潡涓偣鏁伴兘絳変簬杈規暟鐨勬棤鍚戝浘錛堢О涓烘棤鍚戠幆濂楁爲錛夋垨鑰呮槸姣忎釜鐐規湁涓斿彧鏈変竴涓墠瓚嬶紙縐頒負鍐呭悜鐜鏍戯級鎴栧悗緇э紙縐頒負澶栧悜鐜鏍戯級鐨勬湁鍚戝浘錛岀敱浜庤繖涓浘鐨勬瘡涓繛閫氬潡褰撲腑鏈変笖鍙湁涓涓幆錛堟敞鎰忥紝鍙兘鏄嚜鐜紝鍗抽暱搴︿負1鐨勭幆錛夛紝涓旇繖涓幆涓婄殑姣忎釜鐐歸兘鍙互褰撲綔鏍瑰紩鍑轟竴媯墊爲錛屾墍浠ュ彨“鐜鏍?#8221;銆?br />
瀵逛簬鏃犲悜鐜鏍戯紝鍏堝皢鏁翠釜鍥捐繘琛屼竴嬈FS錛屽綋涓鏋滃彂鐜版湁閫嗗悜杈癸紙榪欐潯杈圭涓嬈¤鍙戠幇蹇呯劧鏄綔涓洪嗗悜杈圭殑錛屼篃灝辨槸璧風偣鏄粓鐐圭殑鍚庝唬錛夛紝灝辮鏄庢壘鍒頒簡榪欎釜鐜紝璁板綍鍏惰搗鐐瑰拰緇堢偣錛堟敞鎰忥紝濡傛灉鏈夊涓繛閫氬潡鐨勮瘽錛屼笉鑳介鍑猴紝瑕佺戶緇亶鍘嗗畬錛夛紝鍐嶄笉鏂笂婧紙鍥犳鍦―FS榪囩▼涓綋鐒惰璁板綍鐖惰竟浜嗗洤錛夛紝灝卞彲浠ユ壘鍒版暣涓幆浜嗭紝鐒跺悗鍐嶄互鐜笂鐨勭粨鐐逛負鏍瑰緩鏍戝嵆鍙紝榪欐牱渚濇澶勭悊姣忎釜榪為氬潡銆?br />
瀵逛簬鍐呭悜鐜鏍戯紙澶栧悜綾諱技錛夛紝鎵劇幆鏇翠負綆鍗曪紝鍙渶瑕佷換閫変竴涓偣錛屼笉鏂幓鎵懼畠鐨勫墠瓚嬶紝鍚屾椂璁板綍鎵懼埌鐨勭偣搴忓垪錛岀洿鍒版煇涓偣鍦ㄥ簭鍒椾腑鍑虹幇涓ゆ涓烘錛屾鏃惰繖涓偣浠ュ強搴忓垪涓畠涓ゆ鍑虹幇鐨勪綅緗腑闂寸殑鎵鏈夌偣錛屽氨鏄幆涓婄殑鐐癸紝欏哄簭涔熼『渚胯褰曚笅鏉ワ紝鐒跺悗鏍戜篃涓嶇敤寤轟簡錛岀洿鎺ュ湪鍘熷浘涓壘灝辮浜嗐?br />
瀵逛簬榪欓錛岀敱浜庢瘡涓偣閮芥湁涓斿彧鏈変竴涓悗緇э紝鎵浠ユ槸澶栧悜鐜鏍戯紝涓嶈繃鏈矙鑼舵洿鍊懼悜浜庡畠鐨勫熀鍥撅紙鏃犲悜鍥撅紝鏄棤鍚戠幆濂楁爲錛夛紝鐒跺悗灝辨槸涓涓狣P浜嗗洤……
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 1000010;
const ll INF = ~0Ull >> 2;
struct edge {
int a, b, pre, next;
} E0[MAXN * 3], E[MAXN << 1];
int n, m0, m, A[MAXN], stk[MAXN], st[MAXN], pr[MAXN], Q[MAXN];
ll F[MAXN][2], res = 0;
bool vst[MAXN], vst0[MAXN];
void init_d()
{
re(i, n) E0[i].pre = E0[i].next = E[i].pre = E[i].next = i; if (n & 1) m0 = n + 1; else m0 = n; m = n;
}
void add_edge0(int a, int b)
{
E0[m0].a = a; E0[m0].b = b; E0[m0].pre = E0[a].pre; E0[m0].next = a; E0[a].pre = m0; E0[E0[m0].pre].next = m0++;
E0[m0].a = b; E0[m0].b = a; E0[m0].pre = E0[b].pre; E0[m0].next = b; E0[b].pre = m0; E0[E0[m0].pre].next = m0++;
}
void add_edge(int a, int b)
{
E[m].a = a; E[m].b = b; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m++;
}
void init()
{
scanf("%d", &n); int x; init_d();
re(i, n) {
scanf("%d%d", &A[i], &x); add_edge0(--x, i);
}
}
void sol0(int x)
{
Q[0] = x; int i, j, front, rear;
for (front=0, rear=0; front<=rear; front++) {
i = Q[front];
for (int p=E0[i].next; p != i; p=E0[p].next) {
j = E0[p].b;
if (!vst0[j]) {Q[++rear] = j; vst0[j] = 1; add_edge(i, j);}
}
}
rre3(z, rear, 0) {
i = Q[z];
F[i][0] = 0; F[i][1] = A[i];
for (int p=E[i].next; p != i; p=E[p].next) {
j = E[p].b; F[i][0] += F[j][0] >= F[j][1] ? F[j][0] : F[j][1]; F[i][1] += F[j][0];
}
}
}
void solve()
{
re(i, n) {vst[i] = vst0[i] = 0; st[i] = E0[i].next;} int x, y, tp, x0, y0; bool FF, FF2; ll tmp0, tmp1, tmp00, tmp01, res0;
re(i, n) if (!vst[i]) {
stk[tp = 0] = i; vst[i] = 1; FF2 = 0;
while (tp >= 0) {
x = stk[tp]; FF = 0;
for (int p=st[x]; p != x; p=E0[p].next) {
y = E0[p].b;
if (!vst[y]) {vst[y] = 1; stk[++tp] = y; pr[y] = p; st[x] = E0[p].next; FF = 1; break;}
else if (p != (pr[x] ^ 1) && !FF2) {FF2 = 1; x0 = x; y0 = y;}
}
if (!FF) tp--;
}
if (FF2) {
tp = 0; vst0[y0] = 1; while (x0 != y0) {stk[tp++] = x0; vst0[x0] = 1; x0 = E0[pr[x0]].a;} stk[tp++] = y0;
re(j, tp) sol0(stk[j]);
tmp0 = F[stk[0]][0]; tmp1 = -INF;
re2(j, 1, tp) {
tmp00 = (tmp0 >= tmp1 ? tmp0 : tmp1) + F[stk[j]][0];
tmp01 = tmp0 + F[stk[j]][1];
tmp0 = tmp00; tmp1 = tmp01;
}
res0 = tmp0 >= tmp1 ? tmp0 : tmp1;
tmp0 = -INF; tmp1 = F[stk[0]][1];
re2(j, 1, tp) {
tmp00 = (tmp0 >= tmp1 ? tmp0 : tmp1) + F[stk[j]][0];
tmp01 = tmp0 + F[stk[j]][1];
tmp0 = tmp00; tmp1 = tmp01;
}
res += res0 >= tmp0 ? res0 : tmp0;
}
}
}
void pri()
{
cout << res << endl;
}
int main()
{
init();
solve();
pri();
return 0;
}
]]>
]]>
璇村疄璇濇垜絎竴嬈″皾璇曞啓鐐叺闃靛湴鏄湪2009騫?#8230;…宸茬粡榪囧幓涓ゅ勾澶氫簡錛岀粓浜庢壘鍒頒簡涓涓ソ鐨勮В娉?#8230;…搴嗙涓涓?#8230;…
銆愮姸鎬佸帇緙〥P銆?br />鎵璋撶姸鎬佸帇緙〥P錛屽氨鏄浜庢煇浜汥P闂錛屾瘡涓闃舵鐨勭姸鎬侀兘鏈夊緢澶氱淮錛岃鍒╃敤鏌愪簺鎵嬫灝嗗畠浠帇緙╁埌涓緇達紙涓涓鏁存暟錛夛紝欏轟究榪涜鐘舵佺殑綺劇畝錛堝幓鎺変笉鍚堟硶鐨勭姸鎬侊級錛岀劧鍚庡啀榪涜DP銆傝繖閲岃鐨勪富瑕佹槸浼犵粺鐨勭姸鍘婦P錛屾湁涓縐嶅熀浜?#8220;鎻掑ご”鐨凞P錛屾洿楂樼駭錛屼互鍚庡啀鎼炪?br />瀵逛簬鏈錛屽彲浠ヨ璁″嚭涓涓繖鏍風殑鐘舵侊細[0..1][0..1][0..1]...[0..1]錛堟湁M涓猍0..1]錛夛紝琛ㄧず璇ヨ鐨勬瘡涓牸瀛愭斁涓嶆斁鐐叺錛屽鏋滄斁錛屼負1錛屽惁鍒欎負0銆傛樉鐒訛紝榪欐槸涓涓狹浣嶄簩榪涘埗鏁幫紝濡傛灉鑳芥妸瀹冧滑鍘嬬緝鎴愪竴涓猧nt灝卞ソ浜嗐?br />
銆愬浣曞帇緙┿?br />絎竴涓棶棰樻槸榪欎箞澶氱淮鐨勭姸鎬佸浣曞帇緙╃殑闂銆?br />瀵逛簬鏈錛岀敱浜庢槸浜岃繘鍒舵暟錛岀洿鎺ュ帇緙╁氨鍙互浜嗐備絾鏄浜庢煇浜涙儏鍐碉紝鐘舵佹槸涓笁榪涘埗鏁幫紙姣忎釜鏍煎瓙鐨勫睘鎬ч兘鏈?縐嶏級鐢氳嚦鏇村榪涘埗鏁幫紝榪欐牱錛岀洿鎺ュ帇緙╀細瀵艱嚧鏃犳硶浣跨敤浣嶈繍綆楋紝浠庤屼嬌“瑙e帇”鍙樺緱寰堥夯鐑︼紝鑰楁椂涔熷緢闀匡紙闇瑕佹毚鍔涳級錛屽洜姝わ紝鍙互灝嗘瘡浣嶄笁榪涘埗閮芥媶鎴愪袱浣嶄簩榪涘埗錛?br />0->00
1->01
2->10
錛堝綋鐒?鎷嗘垚10銆?鎷嗘垚11涔熸湪鏈夐棶棰橈紝鍙鑳藉尯鍒嗗紑灝辮浜嗭級
榪欐牱錛屾瘡涓姸鎬佸氨鍙互鐢?涓簩榪涘埗鏁版潵琛ㄧず錛屽彲浠ュ湪鏋勯犲嚭鎵鏈夊悎娉曠姸鎬佷互鍚庡皢姣忎釜鐘舵佹墍瀵瑰簲鐨勪袱浣嶄簩榪涘埗鏁板瓨鍒皊truct閲岄潰錛屼嬌鐢ㄦ椂璋冨嚭鍗沖彲銆?br />
銆愬浣曠簿綆銆?br />榪欎釜闂鏄渶閲嶈鐨勶紝鍥犱負錛屽鏋滀笉綺劇畝錛屽湪鏋氫婦鐘舵佷互鍙婅漿縐葷殑鏃跺欏氨浼氭灇涓懼埌寰堝涓嶅悎娉曠姸鎬侊紝瀵艱嚧鏃墮棿嫻垂銆?br />鎵璋撶簿綆錛屾槸鎸囧湪棰勫鐞嗕互鍙奃P榪囩▼涓紝灝介噺閬垮紑涓嶅悎娉曠姸鎬併?br />錛?錛夐澶勭悊涓殑綺劇畝錛?br />鍖呮嫭3涓儴鍒嗭細
<1>鎵懼埌鎵鏈夊彲鑳界殑鍚堟硶鐘舵佸茍緙栧彿錛氭牴鎹鎰忛檺鍒訛紝鏈夌殑鐘舵佸湪闃舵鍐呭氨涓嶅悎娉曪紙姣斿鏈錛屼竴琛屼竴闃舵錛岄偅涔堝嚒鏄湁涓や釜1浣嶇殑璺濈灝忎簬2鐨勭姸鎬侀兘涓嶅悎娉曪級錛岃屼笖榪欑鐘舵佹墍鍗犵殑姣旈噸寰寰榪樺緢澶э紙鏈涓紝M=10鏃訛紝涔熷彧鏈?0縐嶅彲鑳界殑鍚堟硶鐘舵侊級錛屾鏃訛紝涓轟簡鎵懼埌榪欎簺鍚堟硶鐘舵侊紝鍙互DFS鏋勯犲疄鐜般?br />闇瑕佹敞鎰忕殑鏄紝鏈夌殑棰樹笉鍏夎鎵懼埌涓涓樁孌靛唴鐨勫悎娉曠姸鎬侊紝榪樿鎵懼埌涓や釜鎴栦袱涓互涓婇樁孌靛唴鐨勫悎娉曠姸鎬侊紙姣斿閭d釜鏈夊叧澶氱背璇洪鐗岀殑棰橈級錛屾鏃墮渶瑕佷袱涓猧nt鍚屾椂DFS錛?br />鍦ㄦ壘鍒板悎娉曠姸鎬佷互鍚庯紝闇瑕佸姣忎釜鍚堟硶鐘舵佽繘琛岀紪鍙鳳紝浠ヨ揪鍒?#8220;鍘嬬緝”鐨勭洰鐨勩傝繖閲屽氨娑夊強鍒頒簡鐘舵佺紪鍙峰拰鐘舵佽〃紺虹殑闂錛氭瘮濡傦紝鐘舵?001錛岃〃紺轟負9錛屽湪DFS涓涓涓鎼滃埌錛屽洜姝ょ紪鍙蜂負0錛屼笉瑕佹悶娣蜂簡榪欎袱涓紙灝ゅ叾涓嶈鎼炴販“緙栧彿涓?”鍜?#8220;鐘舵佽〃紺轟負0”錛屽畠浠槸涓嶅悓鐨勶級銆傚湪棰勫鐞嗗拰DP鐨勮繃紼嬩腑錛屾墍鏈夋秹鍙婂埌鐘舵佺殑鏁扮粍涓嬫爣錛屽叏閮ㄦ槸緙栧彿鑰屼笉鏄〃紺猴紝鐭ラ亾緙栧彿瑕佹眰琛ㄧず錛屽彲浠ュ湪DFS涓褰曠殑鏁扮粍閲岄潰璋冿紝鑰岀煡閬撹〃紺鴻姹傜紪鍙鳳紝鍙互鍒╃敤閫嗘暟緇勬垨鑰呭搱甯岋紱
<2>鎵懼埌姣忎竴闃舵鐨勫悎娉曠姸鎬侊細鍗充嬌鏄?lt;1>涓鍒ゅ畾涓哄悎娉曠殑鐘舵侊紝鍦ㄥ叿浣撶殑鍚勪釜闃舵涓篃鏈繀鍚堟硶錛堟瘮濡傛湰棰橈紝濡傛灉鏌愪竴琛岀殑鏌愪竴涓綅緗槸'H'錛屼笉鑳芥斁錛岃屾煇涓涓姸鎬佸湪榪欓噷鏀句簡錛屽垯涓嶅悎娉曪級錛屽洜姝よ瀵規瘡涓樁孌靛啀鏋氫婦涓閬嶏紝鎵懼埌鐪熸鍚堟硶鐨勭姸鎬侊紝騫惰鍏ヤ竴涓獀ector錛?br /><3>鎵懼埌鐘舵佽漿縐諱腑鐨勫悎娉曠姸鎬侊細鍦ㄧ姸鎬佽漿縐諱腑錛屽線寰瑕佹眰鐘舵佷笉鍐茬獊錛堟瘮濡傛湰棰橈紝鍦ㄨ繛緇殑涓変釜闃舵涓紝閮戒笉鑳芥湁鏌愪竴浣嶆湁涓や釜涓?鐨勬儏鍐碉級錛屽洜姝わ紝榪樿鏋氫婦姣忎釜鐘舵佸湪杞Щ鏃朵笌鍏朵笉鍐茬獊鐨勭姸鎬侊紝騫惰鍏ector銆?br />娉ㄦ剰錛屾湁鏃跺欒繖涓姝ヤ笉鏄緢瀹規槗榪涜錛岄渶瑕佸湪DP榪囩▼涓繘琛岋紱
錛?錛塂P榪囩▼涓殑綺劇畝錛?br />DP榪囩▼涓紝鏋氫婦鐘舵併佽漿縐誨喅絳栭兘鍙灇涓懼悎娉曠殑錛屽湪vector閲岄潰璋冿紙娉ㄦ剰vector閲岃褰曠殑鍏ㄩ兘鏄姸鎬佺紪鍙瘋屼笉鏄〃紺猴紒錛夛紝鍙互澶уぇ鍑忓皯鏋氫婦閲忥紝涓嶈繃鏈夋椂鍊欙紝榪樹細鏈変竴浜涙椂闂存氮璐癸紝榪欐椂鍊欙紝鍙互閲囧彇涓浜涘叾瀹冪殑鍔炴硶鏉ョ簿綆錛屾瘮濡傚啀嬈¤繘琛孌FS鏋勯犲悎娉曠姸鎬佺瓑銆?br />
鎬諱箣錛岃繖綾婚棶棰樼殑鐩爣灝辨槸“綺劇畝錛岀簿綆錛屽啀綺劇畝錛屼嬌鏋氫婦鍒扮殑涓嶅悎娉曠姸鎬佸噺鍒版渶灝?#8221;銆?br />浠g爜錛?br />
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define pb push_back
#define IR iterator
typedef vector <int> vi;
const int MAXN = 103, MAXM = 11, MAXS = 100, INF = ~0U >> 2;
int n, m, S, A[MAXN], B[MAXS], T1[MAXS], F[MAXN][MAXS][MAXS], res;
bool F0[MAXN][MAXS];
vi P0[MAXN], P1[MAXS][MAXS];
void init()
{
scanf("%d%d", &n, &m); getchar();
re1(i, n) {A[i] = 0; re(j, m) A[i] |= ((getchar() == 'P') << j); getchar();}
}
void dfs(int v, int ST)
{
if (v >= m) B[S++] = ST; else {dfs(v + 3, ST | (1 << v)); dfs(v + 1, ST);}
}
void prepare()
{
S = 0; dfs(0, 0);
re(i, S) {T1[i] = 0; for (int j=B[i]; j; j-=j&(-j)) T1[i]++;}
re1(i, n) re(j, S) if (!(~A[i] & B[j])) {P0[i].pb(j); F0[i][j] = 1;} P0[0].pb(S - 1); F0[0][S - 1] = 1;
re(i, S) re(j, S) if (!(B[i] & B[j])) re(k, S) if (!(B[i] & B[k]) && !(B[j] & B[k])) P1[i][j].pb(k);
}
void solve()
{
re3(i, 0, n) re(j1, S) re(j2, S) F[i][j1][j2] = -INF; F[0][S - 1][S - 1] = 0;
vi::IR vi_e0, vi_e1, vi_e2; int j0, j1, k, V;
re(i, n) {
vi_e0 = P0[i].end(); if (i) vi_e1 = P0[i - 1].end(); else vi_e1 = P0[i].end();
for (vi::IR p=P0[i].begin(); p != vi_e0; p++)
for (vi::IR p_=P0[i ? i - 1 : i].begin(); p_ != vi_e1; p_++) {
j0 = *p; j1 = *p_;
if (!(B[j0] & B[j1])) {
vi_e2 = P1[j0][j1].end();
for (vi::IR p__ = P1[j0][j1].begin(); p__ != vi_e2; p__++) {
k = *p__;
if (F0[i + 1][k]) {
V = F[i][j0][j1] + T1[k];
if (V > F[i + 1][k][j0]) F[i + 1][k][j0] = V;
}
}
}
}
}
res = 0; re(i, S) re(j, S) if (F[n][i][j] > res) res = F[n][i][j];
}
void pri()
{
printf("%d\n", res);
}
int main()
{
init();
prepare();
solve();
pri();
return 0;
}
]]>
榪欐槸涓閬撶嚎孌墊爲鎿嶄綔鐨勬瀬鍝侀錛屽洜涓哄畠鐨?涓搷浣滃垰濂借鐩栦簡綰挎鏍戞搷浣滈棶棰樼殑3縐嶅鐞嗘濊礬錛屽彲浠ヨ鏄妸綰挎鏍戞搷浣滅殑鍏ㄩ儴鍐呭閮藉寘鍚繘鍘諱簡銆?br />
綰挎鏍戞槸涓縐嶉潤鎬佺殑鏁版嵁緇撴瀯錛屽洜涓轟竴媯電嚎孌墊爲涓鏃﹀緩鎴愶紝鍏跺艦鎬佸氨姘歌繙涓嶄細鍙戠敓鍙樺寲錛屾敼鍙樼殑浠呬粎鏄粨鐐逛笂璁板綍鐨勫悇縐嶄俊鎭殑鍊箋傚洜姝わ紝瀵逛簬綰挎鏍戞搷浣滐紝鏍稿績闂涔熷氨鏄浣曠淮鎶ゅ拰澶勭悊榪欎簺淇℃伅銆傛葷殑鏉ヨ錛屽浜庣嚎孌墊爲緇撶偣淇℃伅鐨勭淮鎶ゅ拰澶勭悊錛屾湁浠ヤ笅3縐嶅熀鏈濊礬錛?br />錛?錛夊乏鍙沖綊涓瀷錛?br />鎵璋撳乏鍙沖綊涓紝灝辨槸鐢ㄥ乏鍙沖瓙緇撶偣瀛樺偍鐨勪俊鎭潵寰楀埌鐖剁粨鐐瑰瓨鍌ㄧ殑淇℃伅鐨勫鹼紝榪欐槸鏈甯歌鐨勭嚎孌墊爲緇存姢鏂規硶銆備婦涓浜涚畝鍗曠殑渚嬪瓙錛氭瘮濡傜粨鐐圭殑SUM鍩熻〃紺鴻緇撶偣鍖洪棿涓婃墍鏈夊厓绱犵殑鍜岋紝閭d箞榪欎釜鍩熺淮鎶ょ殑鏂規硶灝辨槸“鐖剁粨鐐筍UM=宸﹀瓙緇撶偣SUM+鍙沖瓙緇撶偣SUM”錛屽啀姣斿緇撶偣鐨凪AX/MIN鍩熻〃紺鴻緇撶偣鍖洪棿涓婃墍鏈夊厓绱犵殑鏈澶?灝忓鹼紝閭d箞緇存姢鏂規硶灝辨槸“鐖剁粨鐐筂AX/MIN=max/min{宸﹀瓙緇撶偣MAX/MIN,鍙沖瓙緇撶偣MAX/MIN}”銆傝繖縐嶇淮鎶ゆ柟娉曚篃姣旇緝綆鍗曪紝鍙鍦ㄦ瘡嬈″瀛愮粨鐐硅繘琛屼慨鏀逛箣鍚巙pd涓涓嬪氨琛屼簡錛堝浜庨偅浜涜嚜欏跺悜涓嬮掑綊錛岃屼笖娑夊強鍒版敼鍊肩殑鎿嶄綔錛屽湪閫掑綊瀹屽乏鍙沖瓙緇撶偣鍚庝竴瀹氳璁板緱upd涓涓嬶級錛屽湪榪欎箣涓湁涓涓緢閲嶈鐨勬濇兂灝辨槸“宸﹀彸榪炵畫孌?#8221;鎬濇兂錛氬鏋滈鐩腑瑕佹眰浠繪剰涓涓尯闂村唴鐨勫叿鏈夋煇縐嶆ц川鐨勬渶闀跨殑榪炵畫搴忓垪錛堜篃灝辨槸瀛愬尯闂達級錛屾瘮濡傛渶闀胯繛緇笂鍗囧瓙搴忓垪銆?1鍊奸棶棰樹腑榪炵畫鐨?孌墊垨鑰呴潪0孌碉紙鍦ㄥ叿浣撻棶棰樹腑灝辨槸榪炵畫鐨勭┖闂叉鎴栬呭崰鐢ㄦ錛夌瓑錛屽彲浠ュ湪姣忎釜緇撶偣涓婄淮鎶や笁涓煙錛歭S銆乺S鍜孲錛屽垎鍒〃紺鴻緇撶偣鍖洪棿宸︾錛堜粠鍖洪棿鐨勬渶宸︾寮濮嬬殑錛夊叿鏈夎繖縐嶆ц川鐨勬渶闀胯繛緇簭鍒楃殑闀垮害錛岃緇撶偣鍖洪棿鍙崇錛堝埌鍖洪棿鐨勬渶鍙崇緇撴潫鐨勶級鍏鋒湁榪欑鎬ц川鐨勬渶闀胯繛緇簭鍒楃殑闀垮害鍜岃鍖洪棿鍐呭叿鏈夎繖縐嶆ц川鐨勬渶闀胯繛緇簭鍒楃殑闀垮害錛堜篃灝辨槸瑕佹眰鐨勯偅涓笢涓滐級錛屽垯緇存姢鏂規硶涓?#8220;鐖剁粨鐐筶S=宸﹀瓙緇撶偣lS錛堝乏瀛愮粨鐐筶S<宸﹀瓙緇撶偣len錛夋垨宸﹀瓙緇撶偣len+鍙沖瓙緇撶偣lS錛堝乏瀛愮粨鐐筶S=宸﹀瓙緇撶偣len錛夛紝鐖剁粨鐐箁S綾諱技錛岀埗緇撶偣S=max{宸﹀瓙緇撶偣S,鍙沖瓙緇撶偣S,宸﹀瓙緇撶偣rS+鍙沖瓙緇撶偣lS}”錛屾澶栵紝鐢變簬瑕佹眰鐨勮繖涓尯闂村彲鑳借鎷嗘垚澶氫釜榪炵畫鐨勭粨鐐瑰尯闂達紝鍥犳闇瑕佹寜欏哄簭鍚堝茍榪欎簺鍖洪棿錛屽悎騫剁殑鏂規硶鏄細璁劇珛S0鍜孲1錛孲0琛ㄧず涓嶄繚璇佽兘寤朵幾涓嬪幓鐨勫尯闂撮暱搴︼紝S0=涓婁竴涓尯闂寸殑S1+鏈尯闂寸殑lS錛汼1琛ㄧず鍙互寤朵幾涓嬪幓鐨勫尯闂撮暱搴︼紝S1=涓婁竴涓尯闂寸殑S1+鏈尯闂磍en錛堝鏋滄湰鍖洪棿鏁翠釜閮芥槸婊¤凍鏉′歡鐨勶紝鍗砈=len錛夋垨鏈尯闂寸殑rS錛堟湰鍖洪棿涓嶉兘鏄弧瓚蟲潯浠剁殑錛屽嵆S<len錛夛紝鍙栬繃紼嬩腑鎵鏈塖0鍜屽尯闂碨鐨勬渶澶у煎嵆涓虹粨鏋溿?br />鍦℉DU2871涓紝搴旂敤宸﹀彸褰掍腑鐨勬柟娉曠淮鎶ょ殑淇℃伅灝辨槸“鏈闀胯繛緇┖闂叉”鐨勯暱搴︼紝New鎿嶄綔闇瑕侊紱
錛?錛夎皟鏁磋竟鐣屽瀷錛?br />鑰冭檻榪欐牱涓涓棶棰橈細鐜板湪瑕佹彃鍏ャ佸垹闄や竴浜沎0, 100000)鐨勬暣鏁幫紝騫朵笖鍦ㄦ榪囩▼涓笉鏂闂K灝忕殑鏁存暟鏄灝戯紝鎬庝箞鍔烇紵騫寵 鏍戝彲浠ュ疄鐜幫紝浣嗙嚎孌墊爲鏄劇劧鏄洿濂界殑鏂規硶銆傚姣忎釜緇撶偣錛屽瓨鍌ㄤ竴涓狵0鍊艱〃紺轟綅浜庤緇撶偣鍖洪棿鍐呯殑鏁存暟鐨勪釜鏁幫紝鍒欐煡鎵劇K灝忕殑鏃跺欏彧闇瑕佷笉鏂墽琛屼互涓嬫搷浣滐細Kth(A, K)錛岃〃紺哄湪緇撶偣A浠h〃鐨勫尯闂村唴鎵劇K灝忕殑錛岀劧鍚庯紝鑻<=緇撶偣A鐨勫乏瀛愮粨鐐筀0鍊鹼紝鍒欐墽琛孠th(A鐨勫乏瀛愮粨鐐? K)錛屽惁鍒欐墽琛孠th(A鐨勫彸瀛愮粨鐐? K-A宸﹀瓙緇撶偣鐨凨0)錛堣繖鍜屽鉤琛℃爲紲炰技錛夛紝鐩村埌鎵懼埌鍙剁粨鐐逛負姝€傝繖縐嶆柟娉曠О涓?#8220;璋冩暣杈圭晫鍨?#8221;錛屽嵆闅忕潃緇撶偣娣卞叆錛屼笉鏂緝灝忥紙鑷《鍚戜笅錛夋垨鎵╁ぇ錛堣嚜搴曞悜涓婏級鑼冨洿錛屾渶鍚庢壘鍒扮粨鏋溿傚儚鎵劇K灝忚繖鏍風殑鎿嶄綔灞炰簬鑷《鍚戜笅鍨嬶紝鑰屽儚“鎵懼埌X鎵鍦ㄧ殑鍏鋒湁鏌愮鎬ц川鐨勬渶闀跨殑榪炵畫鍖洪棿”灝卞睘浜庤嚜搴曞悜涓婂瀷錛堟敞鎰忓拰鏈鐨凢ree涓嶄竴鏍鳳級錛?br />
錛?錛夋爣璁拌緟鍔╁瀷錛?br />榪欑緇存姢淇℃伅鐨勬柟娉曪紝鐗圭偣鏄埄鐢ㄦ爣璁版潵緇存姢淇℃伅錛屽嵆瀵逛簬鏌愪簺緇撶偣錛堜富瑕佹槸鍙剁粨鐐癸紝鍥犱負鍏舵爣璁頒笉鍐嶄笅鏀撅級錛岀洿鎺ヤ嬌鐢ㄦ爣璁版潵寰楀埌涓浜涙暟鎹紝姣斿瀵逛簬HDU2871榪欎竴棰橈紝鍏朵腑瀵逛簬鍙剁粨鐐逛綅浜庣殑鎻掑叆綰挎鐨勬爣鍙鳳紝浣跨敤鐨勫氨鏄爣璁般?br />
涓嬮潰鏄湰棰?涓搷浣滅殑鍏蜂綋瀹炵幇錛?br /><1>綰挎鏍戠粨鐐瑰畾涔夛細
鏈闇瑕佷袱媯電嚎孌墊爲錛岃繖鏄洜涓篘ew涓嶧ree鎿嶄綔瀵逛簬tot鍩燂紙鎻掑叆綰挎宸︾鐐圭殑鎬諱釜鏁幫級浼氶犳垚涓嶅悓鐨勫獎鍝嶏紝鍏蜂綋鏉ヨ錛屽湪New鎿嶄綔涓紝tot鍊間笉浼氳鍚屾椂鍔犱笂錛堥渶瑕佸彟澶栦竴涓搷浣滃姞涓婏級錛岀劧鑰屽湪Free鎿嶄綔涓紝tot鍊間細琚悓鏃舵竻絀猴紝榪欐牱灝變細瀵艱嚧鍦ㄥ鏌愪釜緇撶偣娓呯┖錛堣緇撶偣鍖呭惈鍦ㄦ煇涓狥ree鎿嶄綔瑕佹竻絀虹殑綰挎涓級騫舵墦涓?鏍囪涔嬪悗錛屽鏋滅揣鎺ョ潃鍙堟彃鍏ヤ竴鏉″寘鍚繖涓粨鐐瑰尯闂寸殑鏂扮嚎孌碉紝鍒欒繖涓粨鐐圭殑0鏍囪灝變細涓уけ錛岃繖鏍峰湪绱ф帴鐫涓嬩紶鐨勬椂鍊欙紝鍏跺瓙緇撶偣鐨則ot鍊煎氨涓嶄細琚竻絀猴紙浜嬪疄涓婂凡緇忚娓呯┖浜嗭級銆傛墍浠ワ紝灝唗ot鍩熷交搴曡漿縐誨埌鍙︿竴媯電嚎孌墊爲閲屻?
int len, mr, lsc, rsc, sc;
} T[MAXN << 2];
struct node0 {
int tot;
bool mr;
} T0[MAXN << 2];
3)Free錛氫篃娑夊強涓や釜鎿嶄綔錛屽垎鍒槸鎵句竴涓偣x鎵鍦ㄧ殑綰挎錛堟彃鍏ヨ繃鐨勭嚎孌碉級闀垮害浠ュ強鍒犻櫎涓鏉$嚎孌碉紝瀵逛簬鍓嶈呭彲灝哊ew鎻掑叆榪囩殑鎵鏈夌嚎孌電殑宸﹀彸绔偣棰勫瓨璧鋒潵錛岀劧鍚庢壘鍒頒唬琛ㄥ尯闂碵x, x]鐨勭粨鐐圭殑mr鍊鹼紙涔熷氨鏄粨鐐箈琚紪鍙蜂負紲為┈鐨勭嚎孌佃鐩栵級錛屽啀鍦ㄩ瀛樼殑綰挎涓壘鍒板嵆鍙傚浜庡悗鑰咃紝鐩存帴娓呯┖鍗沖彲錛堜笉瑕佸湪T0涓墦鏍囪錛岃岃鍗曠嫭鍒犻櫎涓涓猼ot錛夛紱
4)Get錛氱洿鎺ュ埄鐢═0涓殑tot鎵懼埌絎琄灝忕殑鍊煎嵆鍙紱
浠g爜
]]>
鍒掑垎鏍戯紝灝辨槸姣忎釜緇撶偣浠h〃涓涓簭鍒楋紝璁捐繖涓簭鍒楃殑闀垮害涓簂en錛岃嫢len>1錛屽垯搴忓垪涓墠len/2錛堜笂鍙栨暣錛岃繖閲屾暟瀛﹀叕寮忎笉濂芥墦錛岀湡鍥э級涓厓绱犺鍒嗗埌宸﹀瓙緇撶偣錛屽乏瀛愮粨鐐逛唬琛ㄧ殑搴忓垪灝辨槸榪欎簺鍏冪礌鎸夌収鏍圭粨鐐逛腑鐨勯『搴?/strong>緇勬垚鐨勫簭鍒楋紝鑰屽墿涓嬬殑鍏冪礌琚垎鍒板彸瀛愮粨鐐癸紝鍙沖瓙緇撶偣浠h〃鐨勫簭鍒椾篃灝辨槸鍓╀笅鐨勫厓绱犳寜鐓ф牴緇撶偣涓殑欏哄簭緇勬垚鐨勫簭鍒楋紱鑻en=1錛屽垯璇ョ粨鐐逛負鍙剁粨鐐廣傚垝鍒嗘爲鏈閲嶈鐨勫簲鐢ㄥ氨鏄壘鍖洪棿絎琄灝忥紙鍙槸鏌ユ壘錛屼笉鍖呮嫭淇敼錛夈?br />
鍐欏垝鍒嗘爲鏃朵富瑕佹湁涓や釜鍑芥暟錛氬緩鏍戝拰鎵懼尯闂寸K灝忋傜敱浜庡悗鑰匒Hdoc紲炵妵宸茬粡鎬葷粨浜嗭紝鎵浠ヨ繖閲屽彧鎬葷粨寤烘爲鐨勫嚱鏁般?br />
璁劇洰鍓嶇粨鐐逛負[l..r]錛坙<r錛屽氨鏄洰鍓嶇殑緇撶偣鏄師搴忓垪涓嶆柇鍒掑垎鍚庡緱鍒癧l..r]榪欎竴孌碉紝鍏跺疄涔熷氨鏄痑0[l..r]鎵撲貢欏哄簭鍚庡緱鍒扮殑錛宎0涓哄師搴忓垪閫掑鎺掑簭鍚庣殑搴忓垪錛夐鍏堟壘鍒頒腑鍊鹼紝灝辨槸a0[mid]錛宮id=l+r>>1銆傜劧鍚庡彲浠ュ緱鍒幫紝[l..r]涓皬浜庝腑鍊肩殑鐨勫厓绱犱竴瀹氳鍒掑垎鍒板乏瀛愮粨鐐癸紝[l..r]涓ぇ浜庝腑鍊肩殑鍏冪礌涓瀹氳鍒掑垎鍒板彸瀛愮粨鐐癸紝鑰孾l..r]涓瓑浜庝腑鍊肩殑鍏冪礌鍒欎笉紜畾錛屾湁鐨勮鍒掑垎鍒板乏瀛愮粨鐐癸紝鏈夌殑琚垝鍒嗗埌鍙沖瓙緇撶偣錛岃繖灝遍渶瑕佸厛鎵懼埌搴旇鍒掑垎鍒板乏瀛愮粨鐐圭殑絳変簬涓肩殑鍏冪礌涓暟sm錛堜粠mid寮濮嬩笉鏂線宸︼紝鐩村埌鎵懼埌杈圭晫澶勬垨鑰呮壘鍒頒竴涓皬浜庝腑鍊肩殑鍏冪礌涓烘錛屾垨鑰呰錛宻m灝辨槸a0[l..mid]涓瓑浜庝腑鍊肩殑鍏冪礌涓暟錛夛紝鐒跺悗寮濮嬪垝鍒嗭紝灝忎簬涓煎垎鍒板乏瀛愮粨鐐癸紝澶т簬涓煎垎鍒板彸瀛愮粨鐐癸紝絳変簬涓肩殑錛岃嫢鐩墠榪樻病婊m鍒欏垎鍒板乏瀛愮粨鐐瑰惁鍒欏垎鍒板彸瀛愮粨鐐廣傚彟澶栦腑闂存湁涓や釜鍊奸渶瑕佽褰曪紙鎵懼尯闂寸K灝忔椂蹇呴』瑕佺敤鍒幫級錛歴l鍜宻r銆俿l[i]琛ㄧず[l..i]涓鍒嗗埌宸﹀瓙緇撶偣鐨勫厓绱犱釜鏁幫紝sr[i]琛ㄧず[l..i]涓鍒嗗埌鍙沖瓙緇撶偣鐨勫厓绱犱釜鏁幫紙榪欓噷l<=i<=r銆傛樉鐒秙l[i]+sr[i]=i-l+1錛屽叾瀹瀞r[i]鍙互涓嶇敤璁板綍鐨勶紝榪欓噷鍙槸涓轟簡鍦ㄦ壘絎琄灝忔搷浣滀腑鍑忓皯璁$畻嬈℃暟錛岃搗鍒扮┖闂存崲鏃墮棿鐨勪綔鐢級銆?br />寤烘爲浠g爜錛?
{
T[++No].l = l; T[No].r = r; int mid = l + r >> 1; T[No].mid = mid;
if (l == r) return No;
int midv = a0[mid], sm = mid - l + 1; rre2(i, mid, l) if (a0[i] < midv) {sm = mid - i; break;}
int x = l, y = mid + 1;
if (a[d][l] < midv) {
a[d + 1][x++] = a[d][l]; sl[d][l] = 1; sr[d][l] = 0;
} else if (a[d][l] == midv && sm) {
a[d + 1][x++] = a[d][l]; sl[d][l] = 1; sr[d][l] = 0; sm--;
} else {
a[d + 1][y++] = a[d][l]; sl[d][l] = 0; sr[d][l] = 1;
}
re3(i, l+1, r) {
if (a[d][i] < midv) {
a[d + 1][x++] = a[d][i]; sl[d][i] = sl[d][i - 1] + 1; sr[d][i] = sr[d][i - 1];
} else if (a[d][i] == midv && sm) {
a[d + 1][x++] = a[d][i]; sl[d][i] = sl[d][i - 1] + 1; sr[d][i] = sr[d][i - 1]; sm--;
} else {
a[d + 1][y++] = a[d][i]; sl[d][i] = sl[d][i - 1]; sr[d][i] = sr[d][i - 1] + 1;
}
}
int No0 = No; T[No0].lch = mkt(l, mid, d + 1); T[No0].rch = mkt(mid + 1, r, d + 1); return No0;
}
{
int i = root, d = 0, l0, r0, mid0, s0, s1;
while (1) {
l0 = T[i].l, r0 = T[i].r; mid0 = T[i].mid;
if (l0 == r0) return a[d][l];
if (l == l0) s0 = l; else s0 = l0 + sl[d][l - 1]; s1 = l0 + sl[d][r] - 1;
if (K <= s1 - s0 + 1) {
i = T[i].lch; l = s0; r = s1; d++;
} else {
K -= (s1 - s0 + 1); if (l == l0) l = mid0 + 1; else l = mid0 + sr[d][l - 1] + 1;
r = mid0 + sr[d][r]; i = T[i].rch; d++;
}
}
}
銆愬叿浣撻鐩?a title="PKU2104" >PKU2104銆?a title="PKU2761" >PKU2761錛堜袱閬撲換閫変竴閬擄級
]]>
int a, b, f, next;
} ed[MAXM + MAXM];
涓嬮潰鏉ュ垎鏋愰渶瑕佸垹杈規垨鍒犵偣鐨勬儏鍐點傚湪榪欑鎯呭喌涓嬶紝濡傛灉閲囩敤鍙湁next鐨勫崟鍚戦摼琛紝鍒欏垹闄ゆ椂next鍩熸瀬闅懼鐞嗭紝鑰屼笖錛屽湪涓鑸殑杈硅〃涓紝榪樿绔嬩簡琛ㄥごhd錛宧d[a]琛ㄧず杈硅〃涓搗鐐逛負a鐨勭涓鏉¤竟鐨勭紪鍙楓傚洜姝わ紝鑻ュ垹闄ょ殑杈?lt;a, b, f>鏄搗鐐逛負a鐨勭涓鏉¤竟錛岃繕浼氬獎鍝峢d[a]鐨勫鹼紝浣挎儏鍐靛彉寰楁洿涓哄鏉傘傚洜姝わ紝蹇呴』閲囩敤鍙屽悜閾捐〃錛佽繕璁板緱Dancing Link涔堬紵杈硅〃鍏跺疄涔熷彲浠ユ悶鎴怐ancing Link錛屾柟娉曞涓嬶細
璁懼浘涓湁N涓偣錛孧鏉¤竟錛堟敞鎰忥紝榪橫鏉¤竟鍙寘鎷鍚戣竟錛屼笉鍖呮嫭鍙嶅悜杈廣傜敱浜庢瘡鏉℃鍚戣竟<a, b, f>閮藉搴斾竴鏉″弽鍚戣竟<b, a, 0>錛屽洜姝よ竟琛ㄤ腑杈圭殑鏁扮洰鍏跺疄鏄疢+M錛夈傞鍏堟妸杈硅〃ed鐨?~N榪?N+1)涓綅緗紙涓嬫爣錛夌┖鍑烘潵錛屼綔琛ㄥご錛堣〃澶翠笉鏄竟錛屽洜姝ゅ湪閬嶅巻杈圭殑鏃跺欎笉浼氶亶鍘嗗埌瀹冧滑錛夈傚叾涓紝ed[0]涓烘昏〃澶達紝鐢ㄤ簬閬嶅巻ed[1..N]涓瘡涓湭琚垹鍘葷殑鐐癸紱ed[1..N]涓哄崟鐐硅〃澶達紝ed[i]鐢ㄦ潵閬嶅巻鍥句腑鎵鏈変互i涓鴻搗鐐圭殑杈癸紙鍜孌LX涓殑浜岀淮DL鎯婁漢鐩鎬技錛夈傜劧鍚庯紝鑻涓哄伓鏁幫紝鍒欑┖涓涓綅緗紙涔熷氨鏄皢ed[N+1]涓㈠純涓嶇敤錛夛紝榪欐槸鍥犱負鎴戜滑鍦ㄥ騫胯繃紼嬩腑闇瑕佸紩鐢ㄥ埌涓鏉¤竟瀵瑰簲鐨勯嗗悜杈癸紙姝e悜杈瑰搴斿弽鍚戣竟錛屽弽鍚戣竟瀵瑰簲姝e悜杈癸級錛屼竴鑸涓虹紪鍙蜂負p鐨勮竟瀵瑰簲鐨勯嗗悜杈規槸p ^ 1錛岃繖鏍鳳紝灝辮姹傚浘涓墍鏈夋鍚戣竟鐨勭紪鍙烽兘鏄伓鏁幫紝鎵鏈夊弽鍚戣竟鐨勭紪鍙烽兘鏄鏁幫紙鍚﹀垯浼氶犳垚娣蜂貢錛夈傚洜姝ゅ綋N涓哄伓鏁版椂錛?N+1)涓哄鏁幫紝涓嶈兘鏀劇疆絎竴鏉℃鍚戣竟錛岄渶瑕佷粠ed[N+2]寮濮嬫斁緗鍚戣竟銆傝嫢N涓哄鏁板垯涓嶇敤絀轟綅銆?br />鎺ヤ笅鏉ュ氨鏄竟綾誨瀷浜嗐傚湪榪欓噷錛岃竟綾誨瀷涓鍏遍渶瑕佸寘鎷?涓煙錛歛, b, fs, f, pre, next錛岃〃紺鴻繖鏉¤竟璧風偣涓篴錛岀粓鐐逛負b錛屽垵濮嬪閲忎負fs錛屽綋鍓嶅閲忎負f錛屼笂涓鏉¤搗鐐逛負a鐨勮竟緙栧彿涓簆re錛屼笅涓鏉¤搗鐐逛負a鐨勮竟緙栧彿涓簄ext銆傛敞鎰忥紝鍜孌L涓鏍鳳紝鏁翠釜閾捐〃鏄驚鐜殑錛屼篃灝辨槸鎴戜滑璁や負琛ㄤ腑鏈鍚庝竴鏉¤搗鐐逛負a鐨勮竟鐨勪笅涓鏉¢偦鎺ヨ竟緙栧彿灝辨槸a錛堣〃澶達級錛屽悓鏍鳳紝a鐨勪笂涓鏉¢偦鎺ヨ竟涔熷氨鏄繖鏉¤竟銆?br />
int a, b, fs, f, pre, next;
} ed[MAXM + MAXM];
{
re1(i, n) {ed[i].a = i; ed[i].b = -1; ed[i].f = 0; ed[i].pre = ed[i].next = i;}
if (n % 2) m = n + 1; else m = n + 2;
}
{
ed[m].a = a; ed[m].b = b; ed[m].fs = ed[m].f = f; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
ed[m].a = b; ed[m].b = a; ed[m].fs = ed[m].f = 0; ed[m].pre = ed[b].pre; ed[m].next = b; ed[b].pre = m; ed[ed[m].pre].next = m++;
}
鏈鍚庤繘鍏ユ渶鏍稿績鐨勯儴鍒?#8212;—鍒板簳濡備綍澶勭悊鍒犺竟鎴栧垹鐐癸紵鏈変簡DL鍨嬭竟琛ㄥ氨鐖嗗ソ鎼炰簡錛氬垹鍘諱竴鏉¤竟錛屽彧瑕佺洿鎺ュ垹鍘昏杈瑰湪DL涓殑浣嶇疆鍗沖彲錛?br />
{
ed[ed[No].pre].next = ed[No].next; ed[ed[No].next].pre = ed[No].pre;
}
{
ed[ed[No].pre].next = ed[ed[No].next].pre = No;
}
銆愬叿浣撻鐩?a title="PKU1815" >PKU1815
榪欓灝辨槸姹傛湁鍚戝浘鐨勫瓧鍏稿簭鏈灝忕殑鏈灝忕偣鍓查泦闂錛屾柟娉曟槸鍏堟眰鍑烘渶灝忕偣榪為氬害錛堟湁鍏蟲渶灝忕偣榪為氬害鐨勬眰娉曡鍥劇殑榪為氬害闂鐨勬眰娉?/a>錛夛紝鐒跺悗鎸夌紪鍙烽掑欏哄簭鏋氫婦姣忎釜鐐癸紝鑻ュ垹鍘昏鐐癸紙鍏跺疄鏄垹鍘誨緩鎴愮殑鏂板浘涓鐐筰'鍒拌鐐歸檮鍔犵偣i''涔嬮棿鐨勮竟錛夊悗鍥劇殑鏈灝忕偣榪為氬害鍑忓皬錛屽垯搴斿垹鍘昏鐐癸紝鍚﹀垯涓嶅簲鍒犲幓璇ョ偣銆傚垹鍘誨悗錛岀戶緇灇涓句笅涓涓偣錛岀洿鍒版眰鍑虹偣鍓查泦涓烘銆?br />娉ㄦ剰錛屾湰棰樺彧鏈夊垹杈癸紝娌℃湁鍒犵偣錛屽洜姝ゆ昏〃澶村彲浠ヤ笉闇瑕侊紝鐩存帴浠巈d[0]寮濮嬩綔鍗曠偣琛ㄥご銆傛鏃訛紝鍏充簬鏄惁絀轟綅灝卞垰濂藉弽榪囨潵浜嗭細濡傛灉N鏄鏁板氨瑕佺┖浣嶏紝N鏄伓鏁頒笉絀轟綅錛堜笉榪囪繖棰橀噷鐢變簬寤哄嚭鐨勭綉緇滄祦鍥句腑鏈?*N0涓粨鐐癸紝鎬繪槸鍋舵暟錛屽彲浠ヤ笉綆★紝涓嶈繃鏈矙鑼惰繕鏄榪欎釜浜嗭級銆?br />
浠g爜錛堢鐘囦笉瑕侀剻瑙嗭級錛?br />
#include <stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
const int MAXN = 501, MAXM = 100000, INF = ~0U >> 2;
struct edge {
int a, b, fs, f, pre, next;
} ed[MAXM + MAXM];
int n0, n, m = 0, s, t, start[MAXN], pr[MAXN], hs[MAXN], lev[MAXN], q[MAXN], now, flow, reslen = 0, res[MAXN];
bool vst[MAXN];
void init_d()
{
re(i, n) {ed[i].a = i; ed[i].b = -1; ed[i].f = 0; ed[i].pre = ed[i].next = i;}
if (n % 2) m = n + 1; else m = n;
}
void add_edge(int a, int b, int f)
{
ed[m].a = a; ed[m].b = b; ed[m].fs = ed[m].f = f; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
ed[m].a = b; ed[m].b = a; ed[m].fs = ed[m].f = 0; ed[m].pre = ed[b].pre; ed[m].next = b; ed[b].pre = m; ed[ed[m].pre].next = m++;
}
void init()
{
int x;
scanf("%d%d%d", &n0, &s, &t);
n = n0 << 1; s--; t += n0 - 1; init_d();
re(i, n0) re(j, n0) {
scanf("%d", &x);
if (i == j) {
if (i == s || i == t - n0) add_edge(i, i + n0, INF); else add_edge(i, i + n0, 1);
} else if (x) add_edge(i + n0, j, INF);
}
}
void aug()
{
int z = hs[t], i = t, p; flow += z;
while (i != s) {
hs[i] -= z; p = pr[i]; ed[p].f -= z; ed[p ^ 1].f += z; i = ed[p].a;
if (!ed[p].f) now = i;
}
}
bool dfs()
{
re(i, n) vst[i] = 0; vst[s] = 1; q[0] = s; lev[s] = 0;
int i, j, f0;
for (int front=0, rear=0; front<=rear; front++) {
i = q[front];
for (int p=ed[i].next; p != i; p=ed[p].next) if (ed[p].f) {
j = ed[p].b;
if (!vst[j]) {vst[j] = 1; q[++rear] = j; lev[j] = lev[i] + 1;}
}
}
if (!vst[t]) return 0;
now = s; re(i, n) {start[i] = ed[i].next; vst[i] = 0;} hs[now] = INF;
bool fd;
while (!vst[s]) {
if (now == t) aug();
fd = 0;
for (int p=start[now]; p != now; p=ed[p].next) {
j = ed[p].b; f0 = ed[p].f;
if (lev[now] + 1 == lev[j] && !vst[j] && f0) {
fd = 1; start[now] = pr[j] = p; hs[j] = hs[now] <= f0 ? hs[now] : f0; now = j; break;
}
}
if (!fd) {
vst[now] = 1;
if (now != s) now = ed[pr[now]].a;
}
}
return 1;
}
void deledge(int No)
{
ed[ed[No].pre].next = ed[No].next; ed[ed[No].next].pre = ed[No].pre;
}
void resuedge(int No)
{
ed[ed[No].pre].next = ed[ed[No].next].pre = No;
}
void resu_all()
{
re(i, n) for (int p=ed[i].next; p != i; p=ed[p].next) ed[p].f = ed[p].fs;
}
void solve()
{
flow = 0; while (dfs()) ; int f_ = flow;
if (!flow) {reslen = -1; return;}
re(i, m) if (ed[i].a + n0 == ed[i].b && ed[i].a != s && ed[i].b != t) {
deledge(i); deledge(i ^ 1); resu_all();
flow = 0; while (dfs()) ;
if (flow < f_) {res[reslen++] = ed[i].a + 1; f_--;} else {resuedge(i ^ 1); resuedge(i);}
}
}
void pri()
{
if (reslen == -1) puts("0"); else if (reslen) {
printf("%d\n", reslen);
re(i, reslen - 1) printf("%d ", res[i]); printf("%d\n", res[reslen - 1]);
} else puts("NO ANSWER!");
}
int main()
{
init();
solve();
pri();
return 0;
}
]]>
娉ㄦ剰錛氭洿鏀硅礬寰勬潯鏁板簲璇ュ湪鍑洪槦鏃舵洿鏀癸紝鑰屼笉鑳藉湪鍏ラ槦鏃舵洿鏀癸紝鍥犱負鍙兘鍦ㄨ璺緞鍑洪槦涔嬪墠浼氭湁鏂扮殑姣斿畠鏇寸煭鐨勮礬寰勫叆闃熴?br>
浠g爜錛圥KU2449錛夛細
#include <stdio.h>
#include <queue>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
const int MAXN = 1500, MAXM = 150000, INF = ~0U >> 2;
struct edge {
int kk, len, next;
} ed[MAXM], ed2[MAXM];
int n, m, s, t, k_, hd[MAXN], tl[MAXN], hd2[MAXN], tl2[MAXN], h[MAXN], q[MAXN + 1], No[MAXN], res = -1;
bool vst[MAXN];
struct qnode {
int i, g;
};
typedef priority_queue <qnode, vector<qnode> > pq;
pq z;
bool operator< (qnode q1, qnode q2)
{
return q1.g + h[q1.i] > q2.g + h[q2.i];
}
void init()
{
int a0, b0, l0;
scanf("%d%d", &n, &m);
re(i, n) hd[i] = tl[i] = hd2[i] = tl2[i] = -1;
re(i, m) {
scanf("%d%d%d", &a0, &b0, &l0); a0--; b0--;
ed[i].kk = b0; ed[i].len = l0; ed[i].next = -1;
if (hd[a0] == -1) hd[a0] = tl[a0] = i; else tl[a0] = ed[tl[a0]].next = i;
ed2[i].kk = a0; ed2[i].len = l0; ed2[i].next = -1;
if (hd2[b0] == -1) hd2[b0] = tl2[b0] = i; else tl2[b0] = ed2[tl2[b0]].next = i;
}
scanf("%d%d%d", &s, &t, &k_); --s; --t; k_ += s == t;
}
void prepare()
{
re(i, n) {h[i] = INF; vst[i] = 0;} h[t] = 0; vst[t] = 1; q[0] = t;
int i, h0, j, h1;
for (int front=0, rear=0; !(!front && rear == n || front == rear + 1); front == n ? front = 0 : front++) {
i = q[front]; h0 = h[i];
for (int p=hd2[i]; p != -1; p=ed2[p].next) {
j = ed2[p].kk; h1 = h0 + ed2[p].len;
if (h1 < h[j]) {
h[j] = h1;
if (!vst[j]) {vst[j] = 1; if (rear == n) q[rear = 0] = j; else q[++rear] = j;}
}
}
vst[i] = 0;
}
}
void solve()
{
qnode q0; q0.i = s; q0.g = 0; z.push(q0);
re(i, n) No[i] = 0;
int i, d0, j, d1;
while (!z.empty()) {
i = z.top().i; d0 = z.top().g; z.pop();
if (No[i] >= k_) continue;
No[i]++;
if (i == t && No[i] == k_) {res = d0; break;}
for (int p=hd[i]; p != -1; p=ed[p].next) {
j = ed[p].kk; d1 = d0 + ed[p].len;
q0.i = j; q0.g = d1; z.push(q0);
}
}
}
void pri()
{
printf("%d\n", res);
}
int main()
{
init();
prepare();
solve();
pri();
return 0;
}
]]>
]]>
銆怱ample Output銆?br>10
錛堜粠絎?0浣嶆柇寮鍚庡緱鍒扮殑瀛楃涓?aamandamand"鐨勫瓧鍏稿簭鏄?1涓柇寮浣嶇疆涓渶灝忕殑錛?br>
銆愬垎鏋愩?br>棣栧厛灝嗚繖涓幆褰覆鎷嗗紑錛氬彧闇灝哠[0..N-1]鐨勫悗闈㈠啀鎺ヤ笂S[0..N-2]鍗沖彲錛堝瀵逛簬鏍蜂緥錛屽彲鏋勯犲瓧絎︿覆T = "amandamandaamandamand"錛夛紝鍒橳鐨勪換鎰忎竴涓暱搴︿負N鐨勫瓙涓睺[i..i-N+1]灝辨槸S浠庣i浣嶆柇寮寰楀埌鐨勫瓧絎︿覆銆傛鏃墮棶棰樺氨鍙樻垚浜嗭細緇欏嚭涓涓暱搴︿負(2N-1)鐨勫瓧絎︿覆錛屾眰鍑哄叾鎵鏈夐暱搴︿負N鐨勫瓙涓蹭腑瀛楀吀搴忔渶灝忕殑銆?br>
璁綟[x]涓?span style="COLOR: red">T涓墍鏈夎搗濮嬩綅灝忎簬N鐨勯暱搴︿負x鐨勫瓙涓蹭腑瀛楀吀搴忔渶灝忕殑瀛愪覆鐨勮搗濮嬩綅錛堣嫢鏈夊涓垯鍙栨渶宸﹁竟鐨勶級錛屽瀵逛簬T="abaabaaababaabaaa"錛屾湁F[0]=F[1]=0錛孎[2]=2錛孎[3]=F[4]=5……鏈鐨勭洰鐨勫氨鏄眰鍑篎[N]鐨勫箋備竴寮濮嬪凡鐭ョ殑鍙湁F[0]=0錛堥暱搴︿負0鐨勫瓧絎︿覆閮芥槸絀轟覆錛屽瓧鍏稿簭閮芥槸鏈灝忕殑錛屽彇鏈宸﹁竟鐨勭0浣嶏級銆?br>
鍙互鍙戠幇錛孎鏁扮粍鏈夊緢澶氶噸瑕佺殑鎬ц川錛?br>鎬ц川1 F[0..N]鏁扮粍鏄崟璋冮掑鐨勩?/strong>
璇佹槑錛氱敤鍙嶈瘉娉曘傝瀛樺湪涓涓紉(0<=x<N)浣垮緱F[x]>F[x+1]鍒欐牴鎹畾涔夛紝鏈塗[F[x+1]..F[x+1]+x]<=T[F[x]..F[x]+x]錛堣繖閲屼竴瀹氫笉浼氳秺鐣岋紝鍗矲[x]+x鐨勫間竴瀹氫笉澶т簬(2N-1)錛屽洜涓簒<N錛屽張鏍規嵁寰桭[x]<N錛屾晠F[x]+x<2N錛夛紝榪欐牱錛屽繀鏈塗[F[x+1]..F[x+1]+x-1]<=T[F[x]..F[x]+x-1]銆傜劧鑰屾牴鎹瓼[x]鐨勫畾涔夊張鍙互寰楀埌T[F[x+1]..F[x+1]+x-1]>T[F[x]..F[x]+x-1]錛堝惁鍒橣[x]鐨勫煎氨搴旇絳変簬F[x+1]鐨勫間簡錛夛紝鐭涚浘錛屾晠鍦‵[0..N]涓笉鍙兘瀛樺湪浠諱綍F[x]>F[x+1]鐨勬儏鍐碉紝涔熷嵆F[0..N]鏁扮粍鏄崟璋冮掑鐨勶紙浠ヤ笅灝咶[0..N]鏁扮粍綆縐頒負F鏁扮粍錛夈?br>鎬ц川2 瀵逛簬浠繪剰鍊紉(0<=x<N)錛屽繀鐒舵弧瓚矲[x+1]=F[x]鎴朏[x+1]>F[x]+x銆?/strong>
璇佹槑錛氬洜涓哄墠闈㈠凡緇忚瘉鏄庝簡F鏁扮粍鏄崟璋冮掑鐨勶紝榪欓噷鍙渶璇佹槑瀵逛簬浠繪剰x(0<=x<N)錛屼笉瀛楩[x]<F[x+1]<=F[x]+x鐨勬儏鍐靛嵆鍙?br>榪欓噷鍚屾牱鐢ㄥ弽璇佹硶銆傝瀛樺湪涓涓紉(0<=x<N)浣垮緱F[x]<F[x+1]<=F[x]+x銆傚垯鏍規嵁瀹氫箟鏈塗[F[x+1]..F[x+1]+x]<T[F[x]..F[x]+x]涓擳[F[x]..F[x]+x-1]<=T[F[x+1]..F[x+1]+x-1]錛岃繖鏍峰繀鏈塗[F[x]..F[x]+x-1]=T[F[x+1]..F[x+1]+x-1]涓擳[F[x+1]+x]<T[F[x]+x]銆傝D=F[x+1]-F[x]錛屽垯T[F[x]]=T[F[x]+D]錛屽洜涓篋<=x錛屽彲寰桾[F[x]+D]=T[F[x]+2D]錛屽嵆T[F[x]]=T[F[x]+2D]銆傝繖鏍鳳紝T[F[x]..F[x]+x-D-1]=T[F[x]+2D..F[x]+x+D-1]錛涘張鍥犱負T[F[x]+x-D]=T[F[x]+x]錛岃孴[F[x+1]+x]錛堝嵆T[F[x]+x+D]]錛?lt;T[F[x]+x]錛岃繖鏍鳳紝T[F[x]+x+D]<T[F[x]+x-D]錛屼篃灝辨槸錛孴[F[x]+2D..F[x]+x+D]<T[F[x]..F[x]+x-D]錛佽繖鏍峰彲浠ュ緱鍑猴紝浠?F[x]+2D)浣嶅紑濮嬬殑浠繪剰闀垮害涓嶅皬浜?x-D)鐨勫瓙涓詫紝鍏跺瓧鍏稿簭閮藉皬浜庝粠F[x]浣嶅紑濮嬬殑鍚屾牱闀垮害鐨勫瓙涓詫紝鐢變簬F[x]<F[x+1]<=F[x]+x錛孌=F[x+1]-F[x]錛屾墍浠ユ湁1<=D<=x錛岃繖鏍鳳紝F[x]鐨勫煎氨搴旇鏄?F[x]+2D)浜嗭紝榪欐樉鐒朵笉鍙兘銆傛墍浠ワ紝涓寮濮嬪亣璁劇殑榪欑鎯呭喌鏄笉鍙兘瀛樺湪鐨勶紝鍗沖浜庝換鎰忓紉錛?<=x<N錛夛紝蹇呯劧婊¤凍F[x+1]=F[x]鎴朏[x+1]>F[x]+x銆?br>
鏍規嵁F鏁扮粍鐨勪互涓婁袱涓ц川鍙互璁捐鍑烘湰棰樼殑綆楁硶錛?br>璁劇洰鍓嶅凡緇忔眰鍑轟簡F[0..x-1]鐨勫鹼紝涓擣[x-1]=i銆傞鍏堝皢T[0..i-1]鍏ㄩ儴鍒犲幓錛堝洜涓篎鏁扮粍鏄崟璋冮掑鐨勶紝F[x]鐨勫間竴瀹氫笉灝忎簬i錛夛紝鐒跺悗瀵筎鑷韓浣滄墿灞昁MP錛堝氨鏄互T涓烘ā鏉夸覆錛孴涓哄瓙涓茬殑鎵╁睍KMP錛岀浉褰撲簬鍏墮澶勭悊閮ㄥ垎錛夛紝涓寮濮嬪厛灝咶[x]緗負i錛岃絎琷浣嶇殑鍖歸厤闀垮害涓簄ext[j]錛岃嫢next[j]=x-1涓擳[j+x-1]<T[i+x-1]錛屽垯灝咶[x]鐨勫兼敼涓簀錛岃繖鏍鋒壂鎻忎竴閬嶏紝鍗蟲眰鍑轟簡F[x]鐨勫箋傝嫢鎵弿榪囩▼涓湭鍑虹幇浠諱綍next[j]=x-1錛屽垯璁炬墍鏈塶ext[j]鍊間笉灝忎簬x鐨勬渶灝弉ext[j]鍊間負y錛屽垯鍙互鐩存帴寰楀埌F[x..y-1]鐨勫煎潎絳変簬F[x-1]銆傚氨榪欐牱鐩村埌姹傚嚭F[N]鐨勫間負姝€?br>
鏃墮棿澶嶆潅搴︼細O(NÖN)錛屽彲浠ユ牴鎹ц川2寰楀埌銆?
]]>
銆愮綰縍MQ闂銆?br>棰樻剰錛氬浜庝竴涓簭鍒桝[1..N]錛屽叡鏈塎嬈℃彁闂紝姣忔閮芥槸闂瓵[l..r]錛?<=l<=r<=N)涓殑鏈鍊鹼紝姹傚嚭姣忔鎻愰棶鐨勭瓟妗堛?br>
錛?錛夌函鏆村姏鏋氫婦錛歄(NM)錛?br>錛?錛夋爲鐘舵暟緇勶細O(M(logN)^2)銆愯鏍戠姸鏁扮粍瑙e喅紱葷嚎RMQ闂銆?br>錛?錛塖T綆楁硶錛歄(MlogN)……
ST綆楁硶鏄熀浜庡垎鍧桪P鐨勩?br>璁綟[i][j]涓篈[i..(i+2^j-1)]錛堝叡2^j涓厓绱狅級涓殑鏈鍊鹼紙鍓嶆彁鏄笉鑳借秺鐣岋紝鍗砳+2^j-1 <= N錛夛紝鏄劇劧F鍙互閫氳繃DP鐨勬柟寮忓緱鍒幫細
F[i][j] = min||max{F[i][j-1], F[i+2^(j-1)][j-1]}
杈圭晫錛欶[i][0]=A[i]銆?br>DP姹侳鐨勫肩殑鏃墮棿澶嶆潅搴︿負O(NlogN)錛堜竴鍏卞彧鏈塏logN涓狥鍊兼湁鎰忎箟錛夛紱
鐒跺悗錛屽浜庢眰A[l..r]涓殑鏈鍊鹼紝鍙灝咥[l..r]鎷嗘垚鑻ュ共榪炵畫鐨勬錛屼嬌寰楁瘡孌電殑闀垮害閮芥槸2鐨勬暣鏁版騫傚氨琛屼簡錛屾瘮濡侫[3..28]鍙互鎷嗘垚A[3..18]銆丄[19..26]銆丄[27..28]涓夋錛岄暱搴﹀垎鍒槸16錛?^4錛夈?錛?^3錛夈?錛?^1錛夛紝鎵浠in||max{A[3..28]} = min||max{F[3][4], F[19][3], F[27][1]}銆?br>鍏抽敭鏄庝箞鎷嗭紵鏂規硶錛氭眰鍑?r-l+1)錛堝嵆A[l..r]鐨勯暱搴︼級鐨勪簩榪涘埗褰㈠紡錛岀劧鍚庝粠楂樹綅鍒頒綆浣嶄緷嬈¢亶鍘嗭紝濡傛灉鎵懼埌1浣嶅氨鍔犱笂鐩墠鐨勪綅瀵瑰簲鐨勫箓錛屽(28-3+1)=(11010)2錛屾墍浠ヤ緷嬈℃壘鍒癋[3][4]銆丗[3+2^4][3]銆丗[3+2^4+2^3][1]銆傛敞鎰忔鏃墮渶瑕侀鍏堣涓涓暟緇凚錛孊[2^i]=i錛屼互鏂逛究鎵懼埌鏌愪釜鍙栧嚭鐨勫箓瀵瑰簲鐨勬寚鏁般?br>鏄劇劧錛屾渶澶氬彧鏈塴ogN孌碉紝鎵浠ヤ竴嬈℃彁闂殑鏃墮棿澶嶆潅搴︿負O(logN)銆?br>
鍏跺疄榪樻湁涓縐嶆柟娉曪紝灝辨槸鍏堟眰鍑簂og(r-l+1)鐨勫鹼紙涓嬪彇鏁達級錛岃涓簒錛岀劧鍚嶧[l][x]鍜孎[r-2^x+1][x]涓殑杈冨ぇ/杈冨皬鍊煎氨鏄疉[l..r]涓殑鏈鍊箋傝繖鏍鳳紝涓嬈℃彁闂殑鏃墮棿澶嶆潅搴﹀氨闄嶅埌浜哋(1)銆傞棶棰樻槸錛岀郴緇焞og鍑芥暟鐏板父鎱紝涔熻綆椾竴嬈og鍑芥暟鍊肩殑鏃墮棿宸茬粡瓚呰繃浜唋ogN錛岃繖鏍鋒樉鐒跺緱涓嶅伩澶便傛墍浠ヤ粛鐒舵帹鑽愪笂闈㈢殑鏂規硶銆?br>
銆愭牳蹇冧唬鐮侊紙浠ユ眰鏈灝忓間負渚嬶紝鏈澶у肩被浼鹼級銆?br>鍒嗘娉曪細
{
int min = INF, h = l0, d0, b0;
for (int d = r0 - l0 + 1; d; d -= d0) {
d0 = d & -d; b0 = B[d0];
if (F[h][b0] < min) min = F[h][b0];
h += d0;
}
return min;
}
{
int v = (int)floor(log2(r0 - l0 + 1.0)), s1 = F[l0][v], s2 = F[r0 - (1 << v) + 1][v];
return s1 <= s2 ? s1 : s2;
}
{
re(i, n) F[i][0] = a[i];
int x;
re2(j, 1, MAXS) {
if ((1 << j) <= n) B[1 << j] = j;
x = n - (1 << j) + 1;
re(i, x) F[i][j] = min(F[i][j - 1], F[i + (1 << j - 1)][j - 1]);
}
}
銆愬悗緇忔晥鐜囨祴璇曪紝鍙戠幇褰揘=M=100000鐨勯殢鏈烘暟鎹腑錛屼袱縐嶆柟娉曢兘鍙互鍦?.4s浠ュ唴寰楀嚭姝g‘緇撴灉錛屽叾涓璴og鍊兼硶姣斿垎孌墊硶鐣ユ參0.01s宸﹀彸錛岀浉宸笉澶э紝浣嗚冭檻鍒?#8220;灝介噺灝戜嬌鐢ㄦ暟瀛﹀嚱鏁?#8221;鐨勫師鍒欙紝浠嶆帹鑽愬垎孌墊硶銆?br>
]]>