锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
錛?錛夊畠涓瀹氭槸涓涓瀬宸︾粨鐐癸紙灝辨槸浠庢牴寰瀹冪殑璺笂涓鐩撮兘鏄部鐫宸﹂摼璧幫級錛屽洜涓烘彃鍏ョ殑鏃跺欐瘡嬈¢兘鏄彃鍏ュ埌宸﹀瓙鏍戜腑錛?br />錛?錛夊畠涓瀹氭湪鏈夊彸瀛愭爲錛屽洜涓烘彃鍏ョ殑鏃跺欐瘡嬈¢兘鏄妸鍘熸潵鐨勬煇媯靛瓙鏍戜綔涓烘柊緇撶偣鐨勫乏瀛愭爲錛?br />
婊¤凍錛?錛夛紙2錛夌殑緇撶偣鍙兘鏈夊涓紝浣嗙揣鎺ョ潃鍙互鍙戠幇錛岃繖涓?strong style="color: red">鏂滃爢涓殑姣忎釜緇撶偣濡傛灉鏈ㄦ湁宸﹀瓙緇撶偣錛岄偅涔堜篃鏈ㄦ湁鍙沖瓙緇撶偣錛堟垨鑰呰錛屾瘡涓潪鍙剁粨鐐歸兘鏈夊乏瀛愭爲錛夛紝鑰屽湪鎻掑叆涓涓粨鐐逛箣鍓嶏紝鍏舵墍鏈夌殑紲栧厛閮借浜ゆ崲浜嗗乏鍙沖瓙鏍戯紝鎵浠ワ紝鑻ユ柊緇撶偣鐨勭鍏堜腑鏈夋弧瓚籌紙1錛夛紙2錛夌殑錛屼笖鏂扮粨鐐逛笉鏄彾緇撶偣錛岄偅涔堝湪鏂扮粨鐐規彃鍏ヤ箣鍓嶏紝榪欎釜婊¤凍錛?錛夛紙2錛夌殑紲栧厛蹇呯劧鏄彧鏈夊彸瀛愭爲鑰屾湪鏈夊乏瀛愭爲鐨勶紝榪欎笌涓婇潰鐨勯偅涓ц川鐭涚浘錛屾墍浠ワ紝鍙互寰楀嚭錛?strong>鏈鍚庢彃鍏ョ殑閭d釜緇撶偣涓瀹氭槸婊¤凍錛?錛夛紙2錛夌殑緇撶偣涓紝娣卞害鏈灝忕殑閭d釜錛堣涓篨錛夛紝闄ら潪X鐨勫乏瀛愮粨鐐規槸鍙剁粨鐐癸紝姝ゆ椂涓轟簡婊¤凍瀛楀吀搴忔渶灝忥紝搴旇鍙朮鐨勫乏瀛愮粨鐐逛負鏈鍚庢彃鍏ョ殑銆?/span>鎵懼埌榪欎釜鏈鍚庢彃鍏ョ殑緇撶偣浠ュ悗錛屽彧闇瑕佹妸瀹冨垹鎺夛紝騫舵妸瀹冪殑鎵鏈夌鍏堜氦鎹㈠乏鍙沖瓙鏍戯紝灝辨槸鎻掑叆璇ョ粨鐐逛互鍓嶇殑鐘舵佷簡銆傝繖鏍峰彲浠ユ壘鍒板瓧鍏稿簭鏈灝忕殑鎻掑叆欏哄簭銆?br />———————————————————————————————————————————————————
浣嗘槸錛岃繖涓鐨勬剰涔夎繕涓嶆浜庢錛屽繀欏昏鎼炴竻妤氭枩鍫嗗埌搴曟槸浠涔堬紝鏈変粈涔堝簲鐢ㄥ洤……
鏂滃爢鏄彲鍚堝茍鍫嗙殑涓縐嶅疄鐜板艦寮忥紝鍏舵洿紼沖畾鐨勫疄鐜版槸宸﹀亸鏍戯紙鏂滃爢鍙兘鍋氬埌鍧囨憡logN錛岃屽乏鍋忔爲鍒欏彲浠ヤ弗鏍煎仛鍒版瘡嬈℃搷浣淥(logN)錛夈?br />鏂滃爢鏈鍏稿瀷鐨勭壒鐐癸紝涓婇潰宸茬粡璇磋繃浜嗭紝濡傛灉涓涓粨鐐規病鏈夊乏瀛愭爲錛岄偅涔堝畠涔熶竴瀹氭病鏈夊彸瀛愭爲銆傝繖鏍鳳紝澶у鏁版枩鍫嗙湅涓婂幓鏄線宸﹀炬枩鐨勶紙榪欎篃灝辨槸瀹冪殑鍚嶅瓧鐨勭敱鏉?#8230;…錛夈傚鏋滅粰姣忎釜緇撶偣鍔犱笂涓涓?span style="color: #339966">璺濈鍊糳ist[]錛屼負璇ョ粨鐐瑰埌瀹冩渶榪戠殑娌℃湁鍙沖瓙鏍戠殑瀛愮粨鐐圭殑璺濈錛屽茍涓旀弧瓚充換鎰忕粨鐐圭殑宸﹀瓙緇撶偣鐨勮窛紱誨奸兘涓嶅皬浜庡彸瀛愮粨鐐圭殑璺濈鍊?/strong>鐨勮瘽錛屽氨鎴愪簡宸﹀亸鏍戝洤……
鍙悎騫跺爢錛岄【鍚嶆濅箟錛屽畠蹇呴』婊¤凍涓や釜鎬ц川錛氾紙1錛夋槸鍫嗭紝涔熷氨鏄瘡涓粨鐐圭殑鍏抽敭瀛楅兘涓嶅ぇ浜庯紙灝忛《鍫嗭級/涓嶅皬浜庯紙澶ч《鍫嗭級鍏朵袱涓瓙緇撶偣鐨勫叧閿瓧錛涳紙2錛夊畠蹇呴』鍦∣(logN)鏃墮棿鍐呭畬鎴愬悎騫舵搷浣滐紝鍗沖皢涓や釜鍫嗗悎騫朵負涓涓紝涓斿悎騫舵垚鐨勫爢浠嶆弧瓚沖師鏉ョ殑鎬ц川銆?br />鏂滃爢鐨勫悎騫舵搷浣滄湁鐐瑰儚鏌愪簺鍑芥暟寮忔暟鎹粨鏋勶紝浣嗗畠騫朵笉浼氬姩鐢ㄩ澶栫殑絀洪棿銆傝鍚堝茍鎿嶄綔浣跨敤閫掑綊瀹炵幇錛岃涓や釜鏂滃爢錛堝皬欏跺爢錛夌殑鏍圭粨鐐逛負A銆丅錛岃嫢A鍜孊涓殑鏌愪竴涓負絀猴紝鍒欒繑鍥炲彟涓涓紱鑻鍜孊鍧囬潪絀猴紝鍒欏厛灝嗗畠浠腑鍏抽敭瀛楀皬鐨勯偅涓殑鍙沖瓙鏍戜笌鍏抽敭瀛楀ぇ鐨勯偅涓殑鏁存5鏍戝悎騫訛紝浣滀負鍏抽敭瀛楀皬鐨勯偅涓殑鏂扮殑鍙沖瓙鏍戯紝鐒跺悗錛屽鏋滄槸宸﹀亸鏍戠殑璇濊鏇存柊dist錛岃嫢dist涓嶆弧瓚?#8220;宸︿笉灝忎簬鍙?#8221;錛岃繕瑕佷氦鎹㈠乏鍙沖瓙鏍戙?br />
鏂滃爢鍙互鏀寔鐨勬搷浣滄湁錛堟寚鑳藉湪O(logN)鏃墮棿鍐呭畬鎴愮殑鎿嶄綔錛夛細
錛?錛夋彃鍏ョ粨鐐癸細錛堢敤鍚堝茍瀹炵幇錛夛紱
錛?錛夊垹闄や換鎰忕粨鐐癸細錛堝皢寰呭垹闄ょ粨鐐圭殑涓ゆ5瀛愭爲鍚堝茍錛屽彇浠e師鏉ョ殑浣嶇疆錛岃嫢鏄乏鍋忔爲鐨勮瘽榪樿寰涓婃洿鏂癲ist鐩村埌dist涓嶅彉涓烘錛屾煇璁烘枃閲屾湁璇佹槑錛屾瘡嬈″垹闄ゆ洿鏂癲ist嬈℃暟涓嶄細瓚呰繃2logN錛夛紱
錛?錛夊悎騫朵袱涓枩鍫嗭紱
錛?錛夋壘鏈灝?澶у鹼紱
錛?錛夋眰浠ユ煇涓粨鐐逛負鏍圭殑瀛愭爲澶у皬錛堢淮鎶z鍗沖彲錛夛紱
鏂滃爢涓嶈兘鏀寔鐨勬搷浣滄湁錛堟寚涓嶈兘鍦∣(logN)鏃墮棿鍐呭畬鎴愮殑鎿嶄綔錛夛細
錛?錛夋煡鎵句換鎰忕粨鐐廣傚洜姝わ紝鑻ヨ鍒犻櫎鏌愪釜鎸囧畾緇撶偣錛屽垯蹇呴』鍏堢敤涓嬫爣絳夌儲寮曞埌瀹冿紱
錛?錛夋壘絎琄灝忥紙濡傛灉榪欎釜閮借兘瀹炵幇鐨勮瘽錛屾枩鍫嗗氨鍙互鏇夸唬騫寵 鏍戜簡鍥?#8230;…榪樻槸鍙悎騫跺鉤琛℃爲……錛夛紱
錛?錛夋壘鏌愪釜緇撶偣鎵鍦ㄦ爲鐨勬牴緇撶偣錛堜絾鏄厤鍚堝茍鏌ラ泦+绱㈠紩鍙互瀹炵幇錛岃瑙丠DU1512錛夛紱
鑷充簬緙栫▼澶嶆潅搴︽柟闈?#8230;…闈炲父闈炲父濂藉啓錛佸熀鏈笂涓涓悎騫舵搷浣滃氨澶熶簡錛?lt;10琛岋紙鏂滃爢鐨勫ソ鍐欑▼搴︿粎嬈′簬騫舵煡闆嗗拰鏅氬爢錛夛紱
鍐欑殑涔嬪悗鏈変笁涓富瑕佺殑鏄撶柕鐐癸細
錛?錛夊悎騫剁殑鏃跺欏埆蹇樹簡鏇存柊涓浜涗笢涓滐紝灝ゅ叾鍒繕浜嗚繑鍥炴牴緇撶偣錛?br />錛?錛夛紙鏋佹槗鐤電殑錛侊紒錛夊鏋滆鍒犻櫎鏌愪釜緇撶偣錛屽繀欏繪妸瀹冪殑鎵鏈変俊鎭仮澶嶅埌瀛ょ珛緇撶偣鐨勭姸鎬侊紝鍗蟲柇寮涓庡師鏍戠殑涓鍒囪仈緋伙紙pr銆丩銆丷鍏ㄩ儴緗?錛夛紝dist錛堝鏋滄槸宸﹀亸鏍戯級緗?銆乻z緗?錛涳紙3錛変笅鏍囦粠1寮濮嬶紝0鍙風粨鐐逛綔鐗規畩鐢ㄩ旓紙dist鍊間負-1錛宻z鍊間負0錛夛紝濡傛灉鏌愪釜緇撶偣鐨刾r銆丩銆丷涓嶅瓨鍦ㄥ垯涓?錛?br />
渚嬮錛堢敱浜庢兂紼沖畾錛屾湰娌欒尪鍏ㄩ兘鏄敤宸﹀亸鏍戝啓鐨勫洤錛夛細
銆?銆?a title="HDU1512" >HDU1512
鍩烘湰鎿嶄綔棰橈紝閰嶅悎騫舵煡闆?绱㈠紩鎵炬牴鍗沖彲錛?
#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 = 100010, INF = ~0U >> 2;
int n, u[MAXN], rt[MAXN], V[MAXN], dist[MAXN], pr[MAXN], L[MAXN], R[MAXN], res;
int UFS_find(int x)
{
int tmp = x, r = x; while (u[r] >= 0) r = u[r]; while (x != r) {tmp = u[x]; u[x] = r; x = tmp;} return r;
}
void UFS_union(int s1, int s2, int rt0)
{
if (u[s1] >= u[s2]) {u[s1] = s2; u[s2]--; rt[s2] = rt0;} else {u[s2] = s1; u[s1]--; rt[s1] = rt0;}
}
int heap_union(int s1, int s2)
{
if (!s1) return s2; else if (!s2) return s1; else if (V[s1] >= V[s2]) {
int z = heap_union(R[s1], s2);
R[s1] = z; pr[z] = s1; if (dist[L[s1]] < dist[z]) {int tmp = L[s1]; L[s1] = R[s1]; R[s1] = tmp;}
dist[s1] = dist[R[s1]] + 1; return s1;
} else {
int z = heap_union(s1, R[s2]);
R[s2] = z; pr[z] = s2; if (dist[L[s2]] < dist[z]) {int tmp = L[s2]; L[s2] = R[s2]; R[s2] = tmp;}
dist[s2] = dist[R[s2]] + 1; return s2;
}
}
void prepare()
{
dist[0] = -1; re1(i, n) {u[i] = -1; rt[i] = i; dist[i] = pr[i] = L[i] = R[i] = 0;}
}
void solve(int x, int y)
{
int s1 = UFS_find(x), s2 = UFS_find(y); if (s1 == s2) {res = -1; return;}
int rt1 = rt[s1], rt2 = rt[s2];
int z1 = heap_union(L[rt1], R[rt1]); L[rt1] = R[rt1] = pr[z1] = 0;
V[rt1] /= 2; z1 = heap_union(rt1, z1); pr[z1] = 0;
int z2 = heap_union(L[rt2], R[rt2]); L[rt2] = R[rt2] = pr[z2] = 0;
V[rt2] /= 2; z2 = heap_union(rt2, z2); pr[z2] = 0;
int z = heap_union(z1, z2); pr[z] = 0;
UFS_union(s1, s2, z);
res = V[z];
}
int main()
{
int m, x0, y0;
while (scanf("%d", &n) != EOF) {
re1(i, n) scanf("%d", &V[i]); prepare();
scanf("%d", &m);
re(i, m) {
scanf("%d%d", &x0, &y0);
solve(x0, y0);
printf("%d\n", res);
}
}
return 0;
}
銆?銆?a title="HDU3031" >HDU3031
緇煎悎鎿嶄綔棰橈紝闇瑕乻z錛屽悓鏃朵篃鍙互鑰冨療鏁版嵁緇撴瀯鐨勭患鍚堝簲鐢ㄨ兘鍔涖?
#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--)
#define ll long long
const int MAXN = 1000010, MAXM = 101, MAXLEN_M = 10010, INF = ~0U >> 2;
int n, m, len[MAXM], V0[MAXM][MAXLEN_M], root[2];
int V[MAXN], dist[MAXN], pr[MAXN], L[MAXN], R[MAXN], sz[MAXN];
bool FS;
void upd(int x)
{
sz[x] = sz[L[x]] + sz[R[x]] + 1;
}
int heap_union(int s1, int s2)
{
if (!s1) return s2; else if (!s2) return s1; else if (V[s1] >= V[s2]) {
int s0 = heap_union(R[s1], s2);
pr[s0] = s1; R[s1] = s0; if (dist[L[s1]] < dist[s0]) {int tmp = L[s1]; L[s1] = R[s1]; R[s1] = tmp;} dist[s1] = dist[R[s1]] + 1; upd(s1);
return s1;
} else {
int s0 = heap_union(s1, R[s2]);
pr[s0] = s2; R[s2] = s0; if (dist[L[s2]] < dist[s0]) {int tmp = L[s2]; L[s2] = R[s2]; R[s2] = tmp;} dist[s2] = dist[R[s2]] + 1; upd(s2);
return s2;
}
}
void opr_T(int x)
{
sort(V0[x], V0[x] + len[x]); int root0 = n + 1;
rre(i, len[x]) {
n++; if (i == len[x] - 1) pr[n] = 0; else pr[n] = n - 1; if (i) L[n] = n + 1; else L[n] = 0; R[n] = dist[n] = 0; V[n] = V0[x][i]; sz[n] = i + 1;
}
root[FS] = heap_union(root[FS], root0);
}
void opr_A(int x)
{
V[root[FS]] += x;
}
void opr_E(int x)
{
int root0 = root[FS], z0; pr[z0 = heap_union(L[root0], R[root0])] = 0; L[root0] = R[root0] = dist[root0] = 0; sz[root0] = 1; V[root0] = x;
root[FS] = heap_union(z0, root0);
}
void opr_L()
{
int root0 = root[FS], z0; pr[z0 = heap_union(L[root0], R[root0])] = 0; L[root0] = R[root0] = dist[root0] = 0; sz[root0] = 1;
}
void opr_C()
{
int root0 = root[0], root1 = root[1];
if (V[root0] > V[root1]) {
root[0] = heap_union(root0, root1); root[1] = 0;
} else if (V[root0] < V[root1]) {
root[1] = heap_union(root0, root1); root[0] = 0;
}
}
int main()
{
int tests, sc0 = 0, sc1 = 0, P, tmp; char ssss[10];
scanf("%d", &tests);
re(testno, tests) {
scanf("%d%d", &P, &m);
re(i, m) scanf("%d", &len[i]);
re(i, m) re(j, len[i]) scanf("%d", &V0[i][j]); n = root[0] = root[1] = 0; dist[0] = -1; sz[0] = 0; FS = 0;
re(i, P) {
scanf("%s", ssss);
if (ssss[0] == 'T') {scanf("%d", &tmp); opr_T(--tmp);}
else if (ssss[0] == 'A') {scanf("%d", &tmp); opr_A(tmp);}
else if (ssss[0] == 'E') {scanf("%d", &tmp); opr_E(tmp);}
else if (ssss[0] == 'L') opr_L(); else opr_C();
FS = !FS;
}
printf("%d:%d\n", sz[root[0]], sz[root[1]]);
if (sz[root[0]] >= sz[root[1]]) sc0++; else sc1++;
}
if (sc0 > sc1) puts("HahahaI win!!"); else puts("I will be back!!");
return 0;
}
]]>
鏈矙鑼惰寰楀潡鐘舵暟緇勫張濂藉啓鍙堟湁鐢紙鍏跺疄灝辨槸鍙︿竴縐嶆湸绱狅級……鍙槸閭d釜O(sqrt(n))鐨勫鏉傚害姣旇緝澶ц屽凡錛堝叾瀹炲鏋滃姞涓婂父鏁扮殑璇濆畠騫朵笉姣擲egplaytree鎱㈠灝戯級
緙栫▼鎶宸э細
錛?錛夋瘡鍧楅暱搴﹁涓簃=floor(sqrt(n))錛屾渶鍚庝笉瓚抽暱搴︾殑涓嶈ˉ鍊鹼紝璁緉0涓烘誨潡鏁幫紙鏄劇劧n0=(n-1)/m+1錛夛紱
錛?錛夎绔婰EN[i]=絎琲鍧楃殑瀹為檯闀垮害錛堟樉鐒墮櫎浜嗘渶鍚庝竴鍧楅兘鏄痬錛夛紝鍙互鍦ㄥ緩绔嬪潡鐘舵暟緇勶紙鐪熸鎼炴垚鍧楃姸錛屼篃灝辨槸浜岀淮錛夌殑鏃跺欏緱鍒幫紱
錛?錛夊浜庡尯闂碵l, r]錛岃娉ㄦ剰錛?lt;1>l銆乺浣嶄簬鍚屼竴鍧楋紙l/m==r/m錛夌殑鎯呭喌錛?lt;2>r浣嶄簬鏈鍚庝竴鍧楃殑鎯呭喌錛?br />錛?錛夊埆蹇樹簡鍚屾椂鏇存柊鍘熸暟緇勪笌鍧楃姸鏁扮粍錛?br />
鍙﹀錛屾湰渚嬮闇瑕佷簩鍒?鎵懼灝戜釜姣斿畠灝忕殑榪欐牱鐨勬搷浣滐紝鎬繪椂闂村鏉傚害鏄疧(N*sqrt(N)*log2N*log2N)錛堝垢浜廚鍙湁10000……錛夈?br />
濡傛灉鏈夋彃鍏ュ垹闄ゅ厓绱狅紝灝遍渶瑕佺敤鍔ㄦ佺殑鍧楃姸閾捐〃浜?#8230;…鏋佸叾闅炬悶錛屾湰娌欒尪涓嶆暍璇曚簡……閬囧埌榪欑棰樿繕鏄啓Segplaytree鍚у洤……