青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(24)

隨筆分類(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

MiYu原創, 轉帖請注明 : 轉載自 ______________白白の屋    

 

題目地址:

http://acm.hdu.edu.cn/showproblem.php?pid=1540

題目描述:

Tunnel Warfare

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1009    Accepted Submission(s): 334


Problem Description
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels lay in a line. Except the two at the ends, every village was directly connected with two neighboring ones.

Frequently the invaders launched attack on some of the villages and destroyed the parts of tunnels in them. The Eighth Route Army commanders requested the latest connection state of the tunnels and villages. If some villages are severely isolated, restoration of connection must be done immediately!
 

Input
The first line of the input contains two positive integers n and m (n, m ≤ 50,000) indicating the number of villages and events. Each of the next m lines describes an event.

There are three different events described in different format shown below:

D x: The x-th village was destroyed.

Q x: The Army commands requested the number of villages that x-th village was directly or indirectly connected with including itself.

R: The village destroyed last was rebuilt.
 

Output
Output the answer to each of the Army commanders’ request in order on a separate line.
 

Sample Input
7 9 D 3 D 6 D 5 Q 4 Q 5 R Q 4 R Q 4
 

Sample Output
1 0 2 4
 

 題目分析:

題目有三種操作 :

D:  摧毀村莊

Q: 查詢相連的村莊

R: 修復上次被摧毀的村莊

這個題目的關鍵部分就是 對線段的修改部分, 也是最難的部分, 這部分理解了, 這個題目就基本會了.

  在結構體里面, 需要保存 3個量, lVal : 從線段左端點能夠向右延伸的最大長度,

     rVal:從線段右端點能夠向左延伸的最大長度,

    mVal:當前線段的最大連續長度

         seg[rt].mVal = max ( seg[LL].rVal + seg[RR].lVal, max ( seg[LL].mVal, seg[RR].mVal ) ); //當前節點的最大連續長度 

         seg[rt].lVal = seg[LL].lVal + ( seg[LL].cov() ? seg[RR].lVal : 0 );   //當前節點的左端點能夠向右延伸的最大長度 

         seg[rt].rVal = seg[RR].rVal + ( seg[RR].cov() ? seg[LL].rVal : 0 );   //當前節點的右端點能夠向左延伸的最大長度  

查詢的時候也要注意幾種 情況 :  1 :  就是當前整個線段

      2 :  橫跨 左右子樹

      3 :  只在 左 或 右 子樹

詳細請看代碼注釋. 

代碼如下 : 

代碼
/*
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   : 1540
Doc Name  : Tunnel Warfare
*/
//#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;
inline int max ( int &a, int &b ) {
       
return a > b ? a : b;       
}
struct segTree {
       
int left, right, lVal, rVal, mVal; //lVal: 從線段左端點能夠向右延伸的最大長度
                                          
//rVal: 從線段右端點能夠向左延伸的最大長度 
                                          
//mVal: 當前線段的最大連續長度 
       int mid () { return (left + right)>>1;}  
       
int dis () { return right-left+1; }  // 線段的長度 
       void prs (int flag) { lVal = rVal = mVal = flag ? 0 : dis(); }   //按flag標記處理線段 
       bool cov () { return mVal == dis(); }   // 當前線段是否被覆蓋 , 即 這條線段上的點沒有任何一點被破壞 
}seg[160000];
inline void creat ( int left, int right, int rt = 1 ) {
     
int LL = rt << 1, RR = rt << 1 | 1
     seg[rt].left = left;
     seg[rt].right = right;
     seg[rt].prs (0);
     
if ( left == right ) return
     
int mid = seg[rt].mid();      
     creat ( left, mid, LL );
     creat ( mid + 1, right, RR );     
}
inline void modify ( int pos, int flag, int rt = 1 ) {
     
int LL = rt << 1, RR = rt << 1 | 1
     
if ( seg[rt].left == seg[rt].right ) {
          seg[rt].prs ( flag ); return;      
     } 
     
int mid = seg[rt].mid();
     
if ( pos <= mid ) modify ( pos, flag, LL );
     
else modify ( pos, flag, RR );
     
// 經典部分: 
     seg[rt].mVal = max ( seg[LL].rVal + seg[RR].lVal, max ( seg[LL].mVal, seg[RR].mVal ) ); //當前節點的最大連續長度 
     seg[rt].lVal = seg[LL].lVal + ( seg[LL].cov() ? seg[RR].lVal : 0 );   //當前節點的左端點能夠向右延伸的最大長度 
     seg[rt].rVal = seg[RR].rVal + ( seg[RR].cov() ? seg[LL].rVal : 0 );   //當前節點的右端點能夠向左延伸的最大長度 
}
inline int query ( int pos, int rt = 1 ) {
    
if ( seg[rt].cov() || seg[rt].mVal == 0 || seg[rt].left == seg[rt].right )
        
return seg[rt].mVal;
    
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();        
    
if ( pos <= mid ) {
         
if ( pos > mid - seg[LL].rVal )  // 查詢節點在左孩子節點所處的位置 
             return seg[LL].rVal + query ( mid+1, RR ); // 如果在線段的右端, 則還需要查詢右孩子節點的左端 
         else return query ( pos, LL );    //左端只需查詢左端 
    } else {
         
if ( pos <= mid + seg[RR].lVal )  // 同上 
             return seg[RR].lVal + query ( mid, LL );
         
else return query ( pos, RR );   
    }

inline int _getint(int &n){  //輸入加速 
 char c;for(c=getchar();!isdigit(c);c=getchar());for(;isdigit(c);c=getchar())n=n*10+c-'0';return n;
}
deque <int> st; // stack 沒有clear() 杯具了 
int main ()
{
    
int N, M;
    
char ask[3];
    
while ( scanf ( "%d%d"&N, &M ) == 2 ) {
           creat ( 1, N );
           st.clear();
           
while ( M -- ) {
                  scanf ( "%s",ask ); N = 0;
                  
switch ( ask[0] ) {
                         
case 'D':   _getint (N);
                                     modify ( N, 1 );
                                     st.push_back ( N );
                                     
break;
                         
case 'Q':   _getint (N);          
                                     printf ( "%d\n",query ( N ) );        
                                     
break;
                         
case 'R':   if ( st.empty() ) break;
                                     modify ( st.back(), 0 );
                                     st.pop_back();
                  }
           }
    }
    
return 0;
}

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性欧美激情精品| 亚洲精品欧洲精品| 欧美一区二区视频97| 国产亚洲综合精品| 久久影视精品| 猛男gaygay欧美视频| 日韩亚洲欧美成人一区| 一本色道久久88综合亚洲精品ⅰ| 欧美日韩在线视频一区| 久久电影一区| 女生裸体视频一区二区三区| 一本久道久久久| 亚洲一区二区精品视频| 国内成+人亚洲| 欧美激情网友自拍| 欧美视频网址| 美女被久久久| 欧美色中文字幕| 久久久蜜桃精品 | 欧美伊久线香蕉线新在线| 午夜影院日韩| 日韩午夜免费视频| 欧美一级网站| 欧美一区免费| 99视频精品免费观看| 午夜精品偷拍| 亚洲视频日本| 另类激情亚洲| 久久精品一区二区国产| 欧美日韩美女在线| 巨乳诱惑日韩免费av| 欧美精品一线| 久久久999成人| 免费精品视频| 欧美综合国产精品久久丁香| 中文高清一区| 国产在线观看精品一区二区三区 | 国内久久视频| 亚洲精一区二区三区| 国产精品海角社区在线观看| 久久精品一级爱片| 欧美精品v日韩精品v国产精品| 午夜一级久久| 欧美电影在线观看完整版| 亚洲欧美久久久久一区二区三区| 久久成人精品无人区| 一本色道久久综合一区 | 亚洲欧美日韩国产综合在线| 先锋影音国产精品| 亚洲激情影视| 99视频精品在线| 日韩视频一区二区三区| 欧美一区二区免费观在线| 夜夜嗨av一区二区三区四区| 性久久久久久久久久久久| 99国产精品99久久久久久粉嫩| 亚洲你懂的在线视频| 亚洲精品乱码久久久久久黑人| 亚洲男女自偷自拍| 一区二区三区导航| 欧美1区免费| 蜜臀99久久精品久久久久久软件| 国产精品美女久久久免费| 亚洲精品午夜| 91久久极品少妇xxxxⅹ软件| 欧美一区高清| 欧美一区影院| 国产欧美日韩精品专区| 性欧美xxxx视频在线观看| av成人老司机| 欧美日韩高清不卡| 亚洲精品久久久久久久久久久久久 | 一本久道综合久久精品| 久久综合狠狠综合久久激情| 久久久91精品国产一区二区精品| 国产欧美精品一区二区色综合 | 国内一区二区三区| 久久精品国产亚洲5555| 久久久久久色| 国产一区日韩二区欧美三区| 欧美一区二区免费视频| 久久精品国产清高在天天线| 国产日韩欧美三区| 性欧美videos另类喷潮| 久久综合久久综合这里只有精品| 久久久久国产精品一区| 亚洲国产精品va在线看黑人动漫| 久久免费高清视频| 亚洲精品乱码久久久久| 一本一本久久| 国产精品日韩欧美综合| 欧美一级播放| 久久综合色综合88| 亚洲人成7777| 欧美日韩网站| 亚洲综合精品四区| 久久久国产精彩视频美女艺术照福利| 国产美女扒开尿口久久久| 欧美一进一出视频| 久久一区欧美| 99精品久久久| 国产精品你懂的在线欣赏| 欧美一级理论性理论a| 麻豆精品精华液| 亚洲美女黄色| 亚洲国产欧美在线人成| 一本色道久久加勒比88综合| 国产欧美日韩视频一区二区三区| 久久精品亚洲热| 91久久久久久久久| 日韩午夜在线播放| 欧美岛国激情| 一区二区久久久久久| 久久久精品日韩| 亚洲精品视频在线看| 国产视频一区在线观看| 久久男人资源视频| 亚洲免费观看高清完整版在线观看| 亚洲影院在线| 亚洲国产高清视频| 国产精品热久久久久夜色精品三区| 久久久久久伊人| 亚洲一区二区三区在线看| 蜜乳av另类精品一区二区| 亚洲图片在线观看| 在线看成人片| 欧美精品激情blacked18| 欧美伊人久久大香线蕉综合69| 亚洲韩国精品一区| 榴莲视频成人在线观看| 日韩亚洲不卡在线| 狠狠综合久久| 国产麻豆日韩| 欧美大片免费| 久久久久综合网| 性8sex亚洲区入口| 亚洲精品在线免费| 久久精品国产99国产精品澳门| 亚洲一区二区三区成人在线视频精品| 在线欧美一区| 国产一区二三区| 国产精品无码永久免费888| 欧美精品一区二区三区在线看午夜 | 亚洲一区二区在线看| 亚洲日韩成人| 亚洲国产精品激情在线观看| 国产一区二区三区av电影| 男人天堂欧美日韩| 久久久精品网| 亚洲免费视频中文字幕| 中文在线一区| 日韩午夜电影在线观看| 亚洲国产一区二区三区a毛片 | 亚洲国产91色在线| 国产一区二区三区奇米久涩| 国产精品久久久久久福利一牛影视| 欧美日韩和欧美的一区二区| 欧美在线不卡| 亚洲天堂成人在线观看| 一本在线高清不卡dvd| 亚洲另类自拍| 一本高清dvd不卡在线观看| 99re66热这里只有精品3直播| 欧美国产专区| 久久午夜精品一区二区| 亚洲你懂的在线视频| 欧美一级黄色网| 久久精品国产第一区二区三区| 欧美中文在线观看| 另类尿喷潮videofree| 欧美 日韩 国产 一区| 亚洲国产成人一区| 亚洲免费观看高清在线观看| 一区二区三区日韩欧美精品| 久久综合久久久久88| 欧美成人午夜激情| 亚洲日本在线观看| 亚洲图片在区色| 久久精品导航| 欧美国产日本在线| 国产精品久久久久高潮| 激情综合在线| 亚洲精品精选| 9久草视频在线视频精品| 久久久精品国产免大香伊| 欧美本精品男人aⅴ天堂| 91久久午夜| 香蕉成人久久| 欧美激情精品久久久久久变态| 国产精品v欧美精品∨日韩| 国产亚洲精品资源在线26u| 亚洲日本成人| 亚洲一区在线免费| 久久婷婷久久| 亚洲精品一区二区三区99| 欧美中文日韩| 欧美日韩三级电影在线| 黄色成人免费观看| 亚洲天堂成人在线视频| 久久香蕉精品|