UESTC_秋实大哥下棋 2015 UESTC Training for Data StructuresProblem I
I - 秋實大哥下棋
Time Limit: 3000/1000MS (Java/Others) ??? Memory Limit: 65535/65535KB (Java/Others)
Submit?Status勝負胸中料已明,又從堂上出奇兵。秋實大哥是一個下棋好手,獨孤求敗的他覺得下棋已經無法滿足他了,他開始研究一種新的玩法。
在一個n×m的棋盤上,放置了k個車,并且他在棋盤上標出了q個矩形,表示矩形內部是戰略要地。
秋實大哥要求一個矩形內的每一個格子,都至少能被一輛在矩形內的車攻擊到,那么這個矩形就是被完整保護的。
現在秋實大哥想知道每一個矩形是否被完整保護。
Input
第一行包含四個整數n,m,k,q,表示棋盤的大小,車的數量以及矩形的數量。
接來下k行,每行包含兩個整數x,y,表示有一輛車位于從左往右第x列,從下往上第y行。
接下來q行,每行包含四個整數x1,y1,x2,y2,表示一個矩形的左下角和右上角坐標。
1≤n,m≤105,1≤k,q≤2?105,1≤x1≤x2≤105,1≤y1≤y2≤105,1≤x≤105,1≤y≤105。
Output
輸出q行,對于每一次詢問,這個矩形若被完整保護了輸出"YES",否則輸出"NO"。
Sample input and output
| 4 3 3 3 1 1 3 2 2 3 2 3 2 3 2 1 3 3 1 2 2 3 | YES YES NO |
Hint
樣例的圖形如下:
?
?
解題報告
1.如果一個矩形能被完整保護,肯定在矩形的寬?or?長上的車的投影是一段連續的曲線且全部被覆蓋.
2.首先先給矩形排個序(按照X2的大小),還有車(X坐標)
3.之后我們先考慮這些矩形能否在Y方向達成(被覆蓋),注意到X,Y的范圍皆為1e5,所以不必采用離散化,從左往右邊掃,遇到車就把它所對的Y的方向線段加上一個值val.
注意到這個加的值是必須考究的,首先我們想因為矩形的X2坐標是遞增的,一個在前面的車在Y方向的效果是必須被后面所抵消的(很顯然,前面車對Y方向的影響是沒有用的,因為前面的車很可能已經在后面的矩形外了)
因此我們必須維護這個車在Y方向投影值的max,有了這個還不夠,我們還不知道這個val值如何計算,才能使得我們能快速計算這個矩形的Y方向被覆蓋(注意到很有可能這個線段
上的某一個部分是前面的車所產生的。。因此為了判斷正確,我們必須設計好這個val值)
4.
以下為例子:?(?x為車?)
?
3?.?.?.?x?.
2?x?.?.?.?.
1?.?.?.?.?.?
0?1?2?3?4?5
?
我們考慮左下角坐標為(2,2)?,右上角坐標為(4,3)?的矩形,我們從左往右掃
首先遇到了車(1,2),我們給Y方向的(2,2)加上一個值?value1;
之后我們掃到了另外一個車和矩形,那么我們該處理誰呢?,顯然是車
該車的坐標為(4,3),我們給Y方向的(3,3)加上一個值?value2;
之后掃到矩形的右邊,矩形的Y方向為(2,3),我們在(2,3)方向的值為value1與value2..,那么如何才能確定呢。。。
用X值!,每個方向的投影val值為這個車的X值,并且維護這個最大值,這樣我們就可以判斷了。why?
當我們判斷[L1,L2]上時,我們只查詢這里面的最小值,如果這里面的最小值小于了矩形的X1,那么這個矩形肯定在Y方向沒法被完全保護..
?
至此,就解決了本題.?
?
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm>using namespace std; const int maxn = 2e5 + 5000; int n,m,k,q; typedef struct Node {int l,r,min; };typedef struct Area {int x1,x2,y1,y2,id;friend bool operator < (const Area&a,const Area& b){return a.x2 < b.x2;} };typedef struct Point {int x,y;friend bool operator < (const Point &a,const Point & b){return a.x < b.x;} }; // 車 bool protect[maxn]; //矩形保護 Node tree[4*maxn]; Area s[maxn]; Point p[maxn];void push_up(int cur) {tree[cur].min = min(tree[2*cur].min , tree[2*cur+1].min ); } // 把點pos的權值設置為v(取較大) void updata(int pos,int v,int cur) {int l = tree[cur].l , r = tree[cur].r; if (l == r){tree[cur].min = max(tree[cur].min,v);}else{int mid = l + (r-l)/2;if (mid >= pos)updata(pos,v,2*cur);elseupdata(pos,v,2*cur+1);push_up(cur);} }int query(int ql,int qr,int cur) {int l = tree[cur].l , r = tree[cur].r;if (ql <= l && qr >= r)return tree[cur].min;else{int mid = l + (r-l)/2;int res = 1 << 28;if (mid >= ql)res = min(res,query(ql,qr,2*cur));if (mid < qr)res = min(res,query(ql,qr,2*cur+1));return res;} }void build_tree(int cur,int l ,int r) {tree[cur].l = l , tree[cur].r = r , tree[cur].min = -1;if (r > l){int mid = l + (r-l)/2;build_tree(2*cur,l,mid);build_tree(2*cur+1,mid+1,r);}}int main(int argc,char *argv[]) {scanf("%d%d%d%d",&n,&m,&k,&q);build_tree(1,1,max(n,m)+50);for(int i = 0 ; i < k ; ++ i){int x,y;scanf("%d%d",&x,&y);p[i].x = x , p[i].y = y;}memset(protect,false,sizeof(protect));for (int i = 0 ; i < q ; ++ i){scanf("%d%d%d%d",&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2);s[i].id = i;}sort(p,p+k);sort(s,s+q);int k1 = 0 , k2 = 0 ; // 記錄目前在線右邊邊的車,矩形 for(int i = 1 ; i <= n ; ++ i) //掃描線 {while(k1 < k && p[k1].x <= i) // 車更新 {updata(p[k1].y,p[k1].x,1);k1++;}while(k2 < q && s[k2].x2 <= i) // 矩形更新 {int minx = query(s[k2].y1,s[k2].y2,1);if (minx >= s[k2].x1 && minx <= s[k2].x2)protect[s[k2].id] = true;k2++;}}build_tree(1,1,max(n,m)+50); //reset_tree//翻轉for(int i = 0 ; i < k ; ++ i)swap(p[i].x ,p[i].y);for(int i = 0 ; i < q; ++ i){swap(s[i].x1,s[i].y1);swap(s[i].x2,s[i].y2);}sort(p,p+k);sort(s,s+q);k1 = k2 = 0;for(int i = 1 ; i <= m ; ++ i) //掃描線 {while(k1 < k && p[k1].x <= i) // 車更新 {updata(p[k1].y,p[k1].x,1);k1++;}while(k2 < q && s[k2].x2 <= i) // 矩形更新 {int minx = query(s[k2].y1,s[k2].y2,1);if (minx >= s[k2].x1 && minx <= s[k2].x2)protect[s[k2].id] = true;k2++;}}for(int i = 0 ; i < q ; ++ i)if (protect[i])printf("YES\n");elseprintf("NO\n");return 0; }?
轉載于:https://www.cnblogs.com/Xiper/p/4470218.html
總結
以上是生活随笔為你收集整理的UESTC_秋实大哥下棋 2015 UESTC Training for Data StructuresProblem I的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hitool java_Hitool打开
- 下一篇: putty, puttycm区别