锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
棰樼洰鍦板潃 :
http://poj.org/problem?id=2352
棰樼洰鎻忚堪:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 14814 | Accepted: 6404 |
Description
Input
Output
Sample Input
5 1 1 5 1 7 1 3 3 5 5
Sample Output
1 2 1 1 0
涓庢爲鐘舵暟緇勭殑瑙f硶涓鏍? 鏌ヨ鏇存柊灝卞彲浠ヤ簡.
鏍戠姸鏁扮粍 瑙f硶浼犻侀棬 : http://www.cnblogs.com/MiYu/archive/2010/08/26/1808963.html
浠g爜濡備笅 :
/* Mail to : miyubai@gamil.com Link : http://www.cnblogs.com/MiYu || http://www.shnenglu.com/MiYu Author By : MiYu Test : 1 Complier : g++ mingw32-3.4.2 Program : POJ_2352 Doc Name : Stars */ //#pragma warning( disable:4789 ) #include <iostream> #include <fstream> #include <sstream> #include <algorithm> #include <string> #include <set> #include <map> #include <utility> #include <queue> #include <stack> #include <list> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> using namespace std; struct P{ int x, y; }p[15010]; int seg[100000]; int NN = 32768, res[15010]; int get ( int &n ) { int i = 1; while ( i < n ) i << 1; return i; } void modify ( int &pos ) { pos += NN; seg[pos] ++; while ( pos > 1 ) { if ( ~pos & 1 ) seg[pos>>1] ++; pos >>= 1; } } int query ( int pos ) { pos += NN; int sum = seg[pos]; while ( pos > 1 ) { if ( pos & 1 ) { sum += seg[pos>>1]; } pos >>= 1; } return sum; } int main () { int N; while ( scanf ( "%d", &N ) == 1 ) { int pos; memset ( res, 0, sizeof ( res ) ); memset ( seg, 0, sizeof ( seg ) ); for ( int i = 0; i < N; ++ i ) { scanf ( "%d%*d", &pos ); res[ query ( pos ) ] ++; modify ( pos ); } for ( int i = 0; i < N; ++ i ) { printf ( "%d\n", res[i] ); } } return 0; }
棰樼洰鍦板潃 :
http://acm.hdu.edu.cn/showproblem.php?pid=3016
棰樼洰鎻忚堪:
4 10 5 10 10 5 3 6 -100 4 7 11 20 2 2 1000 10
140
/*
棰樼洰鎻忚堪:
涓嶅悓楂樺害澶勬湁涓嶅悓鐨勬按騫蟲澘錛岃煩鍒拌鏉夸細鏈夎閲忓彉鍖杤錛?/p>
闂綋涓涓漢浠庢渶楂樻澘寮濮嬶紝鍙互鍚戝乏鎴栬呭悜鍙籌紝
绔栫洿璺沖埌涓嬮潰鐨勬澘錛屾眰涓嬭惤鍒板湴闈㈢殑鏈澶ц閲忥紝鎴栬?1銆?/p>
綰挎鏍?dp
闇瑕佺敤綰挎鏍戞煡璇㈠緱鍒版瘡涓澘鐨勪袱涓鐐逛笅钀藉悗浼氬埌鍝釜鏉匡紱
鐒跺悗鏍規(guī)嵁榪欎釜浠庢渶楂樼殑寮濮媎p灝卞彲浠ヤ簡
dp[i] = max ( dp[i], dp[i^].v ) // dp[i^] 浠h〃鑳借蛋鍒?i 鐨勭嚎孌?nbsp;
/*
/*
Mail to : miyubai@gamil.com
Link : http://www.cnblogs.com/MiYu || http://www.shnenglu.com/MiYu
Author By : MiYu
Test : 1
Complier : g++ mingw32-3.4.2
Program : HDU_3016
Doc Name : Man Down
*/
//#pragma warning( disable:4789 )
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <utility>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
struct seg_tree {
int id, left, right;
int mid () { return ( left + right )>>1; }
}seg[333333];
inline void creat ( int x, int y, int rt = 1 ) {
seg[rt].left = x;
seg[rt].right = y;
//0 浠h〃鍦伴潰 鍏朵粬鐨勮嚜鐒舵暟浠h〃鍚勫眰鐨勬湪鏉跨紪鍙? -1 浠h〃鏈夊鏉$嚎孌佃鐩?nbsp;
seg[rt].id = 0;
if ( x == y ) return ;
int mid = seg[rt].mid();
creat ( x, mid, rt << 1 );
creat ( mid + 1, y, rt << 1 | 1 );
}
inline void modify ( int x, int y, int id, int rt = 1 ) {
//鎵懼埌浜嗙嚎孌? 鐩存帴淇敼ID 瑕嗙洊鎺?nbsp;
if ( seg[rt].left == x && seg[rt].right == y ) {
seg[rt].id = id;
return;
}
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();
// 鍓嶉潰娌℃湁return鎺? 閭d箞榪欐潯綰挎鑲畾鏄瑕嗙洊鐨? 灝嗗畠鐨勬爣璁頒笅浼犲悗鏍囪涓?1
if ( seg[rt].id != -1 ) {
seg[LL].id = seg[RR].id = seg[rt].id;
seg[rt].id = -1;
}
if ( y <= mid ) modify ( x, y, id, LL ); //鍒嗘淇敼
else if ( x > mid ) modify ( x, y, id, RR );
else {
modify ( x, mid, id, LL );
modify ( mid + 1, y, id, RR );
}
}
inline int query ( int pos, int rt = 1 ) { // 鏌ヨ Pos 鎵鍦ㄧ嚎孌電殑 id
if ( seg[rt].id != -1 ) return seg[rt].id; //綰挎琚鐩?鐩存帴榪斿洖 ID
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();
if ( pos <= mid ) return query ( pos, LL ); //鍒嗘鏌ヨ
else return query ( pos, RR );
}
inline bool scan_d(int &num) //鏁存暟杈撳叆
{
char in;bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<'0'||in>'9')) in=getchar();
if(in=='-'){ IsN=true;num=0;}
else num=in-'0';
while(in=getchar(),in>='0'&&in<='9'){
num*=10,num+=in-'0';
}
if(IsN) num=-num;
return true;
}
struct Plank {
int x,y,h,v,left,right;
//鎸夐珮鎺掑簭
friend bool operator < ( const Plank &a, const Plank &b ) {
return a.h < b.h;
}
}pk[100010];
int dp[100010];
int main ()
{
int N, M;
creat ( 1, 100000 );
while ( scan_d ( N ) ) {
M = -1;
for ( int i = 1; i <= N; ++ i ) {
scan_d ( pk[i].h );scan_d ( pk[i].x );scan_d ( pk[i].y );scan_d ( pk[i].v );
if ( pk[i].y > M ) M = pk[i].y; // 璁板綍 鍖洪棿鏈澶у? 鍔犻熺敤鐨?nbsp;
}
modify ( 1, M, 0 );
sort ( pk + 1, pk + N + 1 ); // 鎸夐珮鎺掑簭
memset ( dp, 0, sizeof ( dp ) );
dp[N] = 100 + pk[N].v;
// 鑷簳鍚戜笂 鏇存柊 綰挎, 璁板綍 姣忔潯綰挎 宸﹀彸绔偣鑳藉埌杈劇殑 綰挎 ID
for ( int i = 1; i <= N; ++ i ) {
int x = pk[i].left = query ( pk[i].x );
int y = pk[i].right = query ( pk[i].y );
modify ( pk[i].x, pk[i].y, i );
}
int res = -1;
//鑷《鍚戜笅 DP dp[i] = max ( dp[i], dp[i^].v )
// dp[i^] 浠h〃鑳借蛋鍒?i 鐨勭嚎孌?nbsp;
for ( int i = N; i >= 1; -- i ) {
if ( dp[ pk[i].left ] < dp[i] + pk[ pk[i].left ].v )
dp[ pk[i].left ] = dp[i] + pk[ pk[i].left ].v;
if ( dp[ pk[i].right ] < dp[i] + pk[ pk[i].right ].v )
dp[ pk[i].right ] = dp[i] + pk[ pk[i].right ].v;
}
printf ( "%d\n",dp[0] > 0 ? dp[0] : -1 );
}
return 0;
}
杞澆鑷?nbsp;http://www.cnitblog.com/cockerel/archive/2006/09/13/16806.html
鐩鎬俊瀵圭畻娉曡璁℃垨鑰呮暟鎹粨鏋勬湁涓瀹氫簡瑙g殑浜哄綰挎鏍戦兘涓嶄細澶檶鐢熴傚畠鏄兘澶熷湪log(MaxLen)鏃墮棿鍐呭畬鎴愮嚎孌電殑娣誨姞銆佸垹闄ゃ佹煡璇㈢瓑鎿嶄綔銆備絾涓鑸殑瀹炵幇閮芥湁鐐瑰鏉傦紙鎴戣嚜鍐欑殑鏄閫掑綊鐨勶紝姣旇緝澶氳錛夈傝岀嚎孌墊爲搴旂敤涓湁涓縐嶆槸涓撻棬閽堝鐐圭殑銆傦紙鐐規(guī)爲錛燂級瀹冪殑瀹炵幇鍗撮潪甯哥畝鍗曘?br>銆銆榪欑鏁版嵁緇撴瀯鏈変粈涔堢敤錛熸垜浠厛鏉ヨ冭檻涓涓嬩笅闈㈢殑闇姹傦紙鍏ㄩ儴瑕佹眰鍦↙ogN鏃墮棿鍐呭畬鎴愶級錛氬浣曠煡閬撲竴涓偣鍦ㄤ竴涓偣闆嗛噷鐨勫ぇ灝?#8220;鎺掑悕”錛熷緢綆鍗曪紝寮涓涓偣鏁扮粍錛屾帓涓簭錛屽啀浜屽垎鏌ユ壘灝辮浜嗭紱濡備綍鍦ㄤ竴涓偣闆嗗唴鍔ㄦ佸鍒犵偣錛熶篃寰堢畝鍗曪紝寮勪釜騫寵 鏍戝氨琛屼簡錛堟湰鏉ュ鉤琛℃爲姣旂嚎孌墊爲澶嶆潅寰楀錛屼絾鑷粠涓栫晫涓婃湁浜哠TL set榪欎箞涓ソ涓滀笢錛屽氨……^_^錛夐偅濡傛灉鎴戞棦瑕佸姩鎬佸鍒犵偣錛屼篃瑕侀殢鏃舵煡璇㈠埌涓涓偣鐨勬帓鍚嶅憿錛熼偅瀵逛笉璧鳳紝鍙兘灝辮鍑哄姩鍒版垜浠殑“鐐規(guī)爲”浜嗐?br>銆銆鍏跺疄鐜板師鐞嗗緢綆鍗曪細姣忓綋澧炲姞錛堟垨鍒犻櫎錛変竴涓ぇ灝忎負X鐨勭偣鏃訛紝灝卞湪鏍戜笂娣誨姞錛堟垨鍒犻櫎錛変竴鏉?X,MaxLen)鐨勭嚎孌碉紙涓嶅惈绔偣錛夛紝褰撹鏌ヨ涓涓偣鐨勬帓鍚嶆椂錛屽彧瑕佺湅鐪嬪叾涓婃湁澶氬皯鏉$嚎孌靛氨鍙互浜嗐傞拡瀵硅繖涓闇姹傦紝榪欓噷鏈変釜闈炲父綆鍗曠殑瀹炵幇錛堣浠ヤ笅浠g爜錛屽崄澶氳錛屽鐭簡鍚э紵錛夊叾涓璫lear()鐢ㄤ簬娓呯┖鐐歸泦錛沘dd()鐢ㄤ簬娣誨姞涓涓偣錛沜ntLs()榪斿洖灝忎簬n鐨勭偣鐨勪釜鏁幫紝涔熷氨鏄痭鐨勫崌搴忔帓鍚嶏紝綾諱技鍦癱ntGt鏄檷搴忔帓鍚嶃?br>銆銆榪欎釜鐐規(guī)爲鏈変粈涔堢敤鍛紵鍏朵腑涓涓簲鐢ㄦ椂鍦∣(NlogN)鏃墮棿鍐呮眰鍑轟竴涓帓鍒楃殑閫嗗簭鏁幫紙http://acm.zju.edu.cn/show_problem.php?pid=1484錛屼綘鏈夋洿濂界殑綆楁硶鍚楋紵嬈㈣繋浜ゆ祦錛夋柟娉曟槸姣忚鍒頒竴涓暟x錛屽氨璁╅嗗簭鏁?=cntGt(x);鐒跺悗鍐峚dd(x)銆?br>銆銆榪欎釜瀹炵幇榪樺彲浠ヨ繘琛屼竴浜涙墿灞曘傛瘮濡傚垹闄el(int n)錛屽彧瑕佹妸add(int n)涓殑++size鎹㈡垚--size錛屾妸a[i/2]++鏀規(guī)垚a[i/2]--鍗沖彲銆傚彟澶栬繕鍙互閫氳繃浜屽垎鏌ユ壘鍔熻兘鍦∣(logN)鏃墮棿鍐呮煡鍒版帓鍚嶇n鐨勭偣鐨勫ぇ灝忋傚簲璇ヤ篃鍙互涓夊洓琛屽唴鎼炲畾銆?/p>
鍥犳錛屾墍鏈夊彲浠ョ敤鏍戠姸鏁扮粍瑙e喅鐨勯棶棰橀兘鍙互鐢ㄨ繖涓?#8220;鐐規(guī)爲”鏉ヨВ鍐籌紝鍙﹀瀹冭繕鏈変互涓嬪ソ澶勶細
posted on 2006-09-13 19:54 韙忛洩璧ゅ厰
MiYu鍘熷垱, 杞笘璇鋒敞鏄?: 杞澆鑷?nbsp;______________鐧界櫧銇眿
棰樼洰鍦板潃:
http://acm.hdu.edu.cn/showproblem.php?pid=2795
棰樼洰鎻忚堪:
3 5 5 2 4 3 3 3
1 2 1 3 -1
涓寮濮嬫病鎯蟲槑鐧芥庝箞鍋?, 浠旂粏鎯充簡鎯? 鍐嶆 璇婚鍚?鍙戠幇 , n <= 200000; 涔熷氨鏄 鏈澶?涔熷氨 200000 鏉″箍鍛?, 浣犲氨綆楁瘡琛岃創(chuàng)涓寮?,
鏈澶氫篃灝辮創(chuàng)鍒?200000 琛? 鎵浠? 涓嶈琚? h <= 10^9 嬈℃柟鍚撳埌浜? ,璁や負 綰挎鏍戝紑涓嶄簡閭d箞澶х殑鏁扮粍 . 鍙寮 200000 灝卞彲浠ヤ簡 .
鍏朵粬鐨?娌′粈涔?濂借鐨?, 鐭ラ亾榪欎釜 灝辯洿鎺?鏆?鍚?............灝嗚繎 7000MS .=姘磋繃................. g++鎻愪氦 榪樺崕涓界殑 閫佸嚭浜?涓嬈?TLE....
C++ 姘磋繃浜?............
// 涓鐩存病鏄庣櫧 涓轟粈涔堟垜鐨?浠g爜閫熷害 閭d箞 鎱? 鏌ヨ鍚?鏇存柊 鐨勬椂闂存槸 2000MS 宸﹀彸 , 鎴戠殑 鏄?鏌ヨ 灝辨洿鏂頒簡,
绔熺劧瑕?灝嗚繎 7000MS ? 闈炲父 閮侀椃 , 涓嶄俊閭殑 緇х畫 媯鏌?浠g爜, 鍦?鐬簡 1鍝ュ皬鏃跺悗 , 蹇界劧鎯沖埌 : 鎶?cout 鏀規(guī)垚
printf 浼氭庢牱? 緇撴灉 : 1640 MS AC ..............楝肩煡閬撲粬鐨?鏁版嵁閲忔湁澶氬ぇ..... cout 鍜?printf
绔熺劧 宸簡 5000 MS 鐨勬椂闂?...........鏃犺
浠g爜濡備笅 :
/*
Coded By : MiYu
Link : http://www.cnblogs.com/MiYu || http://www.shnenglu.com/MiYu
Author By : MiYu
Test : 1
Program : 2795
*/
//#pragma warning( disable:4789 )
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <utility>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
struct ADV {
int left, right, val;
int mid () { return ( left + right ) >> 1; }
}adv[800000];
int N, W, H, w;
void creat ( int l, int r, int rt = 1 ){
adv[rt].left = l;
adv[rt].right = r;
adv[rt].val = W;
if ( l == r )
return ;
int mid = adv[rt].mid();
creat ( l, mid, rt << 1 );
creat ( mid + 1, r, ( rt << 1 ) + 1 );
}
void add ( int rt = 1, int wei = w ){
if ( wei <= adv[rt].val ){
if ( adv[rt].left == adv[rt].right ){
adv[rt].val -= wei;
//cout << adv[rt].left << endl; //鏉叿鐨?鍦版柟
printf ( "%d\n", adv[rt].left );
return ;
} else if ( adv[rt<<1].val >= wei ) {
add ( rt << 1 );
adv[rt].val = max ( adv[rt<<1].val, adv[(rt<<1)+1].val );
} else {
add ( ( rt << 1 ) + 1 );
adv[rt].val = max ( adv[rt<<1].val, adv[(rt<<1)+1].val );
}
} else {
//cout << -1 << endl; //鏉叿鐨勫湴鏂?/span>
puts ( "-1" );
}
}
inline bool scan_ud(int &num)
{
char in;
in=getchar();
if(in==EOF) return false;
while(in<'0'||in>'9') in=getchar();
num=in-'0';
while(in=getchar(),in>='0'&&in<='9'){
num*=10,num+=in-'0';
}
return true;
}
int main ()
{
while ( scan_ud (H)&&scan_ud (W)&&scan_ud (N) ) {
if ( H > 200000 )
H = 200010;
creat ( 1, H );
for ( int i = 1; i <= N; ++ i ) {
scan_ud (w);
add ( );
}
}
return 0;
}
鍙?闄勪笂 鍌誨唇 紲炵墰 浠g爜 :
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <utility>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define FF(i,a) for( int i = 0 ; i < a ; i ++ )
#define FOR(i,a,b) for( int i = a ; i < b ; i ++ )
#define LL(a) a<<1
#define RR(a) a<<1|1
template<class T> inline void checkmin(T &a,T b) {if(a < 0 || a > b)a = b;}
template<class T> inline void checkmax(T &a,T b) {if(a < b) a = b;}
using namespace std;
struct Node {
int val;
int idx;
friend bool operator < (Node a , Node b) {
if(a.val == b.val) {
return a.idx > b.idx;
}
return a.val < b.val;
}
}error;
struct Seg_Tree{
int left,right;
Node node;
int mid() {
return (left + right)>>1;
}
}tt[800000];
int n , h , m;
void build(int l,int r,int idx) {
tt[idx].left = l;
tt[idx].right = r;
tt[idx].node.idx = l;
tt[idx].node.val = h;
if(l == r) return ;
int mid = tt[idx].mid();
build(l,mid,LL(idx));
build(mid+1,r,RR(idx));
}
void update(int l,int r,int val,int idx) {
if(l <= tt[idx].left && r >= tt[idx].right) {
tt[idx].node.val += val;
return ;
}
int mid = tt[idx].mid();
if(l <= mid) update(l,r,val,LL(idx));
if(mid < r) update(l,r,val,RR(idx));
tt[idx].node = max(tt[LL(idx)].node,tt[RR(idx)].node);
}
Node query(int w,int idx) {
if(tt[idx].node.val < w) {
return error;
}
if(tt[idx].left == tt[idx].right) {
return tt[idx].node;
}
if(tt[LL(idx)].node.val >= w) {
return query(w,LL(idx));
} else {
return query(w,RR(idx));
}
}
int main() {
error.idx = -1;
while(scanf("%d%d%d",&n,&h,&m) == 3) {
checkmin(n,m);
build(1,n,1);
while(m --) {
int w;
scanf("%d",&w);
Node ret = query(w,1);
printf("%d\n",ret.idx);
if(ret.idx != -1) {
update(ret.idx,ret.idx,-w,1);
}
}
}
return 0;
}
棰樼洰鍦板潃:
銆銆http://acm.hdu.edu.cn/showproblem.php?pid=1754
棰樼洰鎻忚堪:
銆銆
5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5
5 6 5 9HintHuge input,the C function scanf() will work better than cin
鎰熻濂戒箙娌℃湁A棰樹簡 , 鏈榪戜竴鐩存病鏈夌姸鎬? 璞嗚眴涔熻漿琛屼簡, 閮侀椃....... 鍥犱負鎵撶畻 涓撶簿 鏁版嵁緇撴瀯鏂歸潰,
鎵浠ヨ繖鍑犲ぉ涓鐩撮兘鍦ㄥ涔?鏁版嵁緇撴瀯, 鍐嶄竴嬈″涔犱簡 綰挎鏍? 浠ュ墠鍙細鐢ㄥ畠鏉?鏇存柊鐐?姹傚拰 , 鐜板湪緇堜簬姘翠簡涓
涓?RMQ 鐨勮8棰樹簡, HAPPY 涓涓?...
瀵逛簬 RMQ 鐨勯鐩? 鐪婸PT 涓婇潰鐨?DP 鎴戠洿鎺?rz浜?..........琛ㄧずDP鍙細鍋氭按棰?... 榪欐柟闈㈣繕鏄氦緇?br>
YCH 鍚? 涓嶈繃鐪嬩簡 sh菐宕?/a> 澶х 鍗氬鐨?綰挎鏍戜笓杈戝悗, 鍙戠幇 鐢ㄧ嚎孌墊爲澶勭悊 榪欑被闂 闈炲父鏂逛究, 淇敼鏌ヨ
閮芥槸 O (logN)鐨?, 紼嶇◢浼樺寲浜嗕笅杈撳叆, 234MS AC ........
浠g爜濡備笅 :
鍏堝墠鍋氫簡榪欎竴棰? 涓嶈繃鏄敤 鏍戠姸鏁扮粍鍋氱殑, 瀵逛簬榪欎竴綾誨瀷鐨勯鐩篃鏉ヨ闈炲父鏂逛究蹇嵎. 鍏蜂綋鍦板潃 : http://www.cnblogs.com/MiYu/archive/2010/08/25/1808441.html
榪欏嚑澶╁浜?綰挎鏍?, 涓嶆槸寰堟槑鐧藉畠鐨勭敤閫?鍜?浣跨敤鏂規(guī)硶, 鍥犱負 鍚 鏍戠姸鏁扮粍鏄?綰挎鏍戠殑 涓縐嶇壒孌婃儏鍐?( 閮ㄥ垎璧勬枡鏄繖涔堣鐨?) . 浜庢槸灝卞張鍋氫簡涓嬈¤繖涓鐩?
涓嶈繃浣跨敤鐨勬槸綰挎鏍戠殑 鏂規(guī)硶 :
浠g爜濡備笅 :