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

算法學社
記錄難忘的征途
posts - 141,comments - 220,trackbacks - 0

題意描述:

    10^7 * 10^7 的平面上有N(N<50,000)個不相交的矩形。要在這個平面上放置一個長度為M(M<1,000)的線段,有多少種方法。

吐槽:

    1. 今天杭電被黑了.... 導致題解現在才出來....
    2. 果然還是自己寫對拍好,想要AC總是要付出代價的么.....

算法分析:

    掃描線豎直的掃一遍,維護掃過的橫向區間集合... 每個空白的一段是我們想要的可以放線段的地方...
    
    由于插入一個線段只會刪除一個空白區間,增加兩個空白區間。這樣的話我們可以根據上一個事件點的情況,推出這個事件點的情況。
    刪除一個區間同理。
    那么如何知道增加和刪除的空白區間的長度呢?
    線段樹維護的是實際區間的最左點和最右點。
    插入一個區間[l,r]的時候,我們同時計算出[0,l)的最右點R和(r,inf)的最左點L。
    那么新的情況就是 new = last - f(R,L) + f(R,l) + f(r,L)
    刪除同理, 和求矩形周長并很像....
    
    我們加入兩個左右哨兵以防止空集的情況...
    trick:
        1. n=0;
        2. m=1;
    這兩個要額外討論一下,另外離散化的時候注意一下上邊和下邊。
    最后還要吐槽一句: 對拍是debug最有效的手段
  
  1 #include<iostream>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cstdio>
  5 #include<cassert>
  6 using namespace std;
  7 typedef long long ll;
  8 template <typename T> inline void chkmax(T &a,const T b){ if(a < b) a=b;}
  9 template <typename T> inline void chkmin(T &a,const T b){ if(a > b) a=b;}
 10 const int N = 100005;
 11 int lt[N<<2],rt[N<<2],cnt[N<<2];
 12 int w,h,n,m,L,R;
 13 int X[N],num[N][4];
 14 struct node{
 15     int l,r,h,p;
 16     node(){}
 17     node(int L,int R,int H,int P):l(L),r(R),h(H),p(P){}
 18     bool operator < (const node &A) const {
 19         return h == A.h? p < A.p: h < A.h;
 20     }
 21 } seg[N];
 22 // segment_tree
 23 inline void upt(int pos,int l,int r){
 24     assert(!cnt[pos] && l<r);
 25     lt[pos] = lt[pos<<1] == -1 ? lt[pos<<1|1] : lt[pos<<1];
 26     rt[pos] = rt[pos<<1|1] == -1 ? rt[pos<<1] : rt[pos<<1|1];
 27 }
 28 void update(int l,int r,int pos,int ML,int MR,int ct){
 29     if(r >= MR && l <= ML){
 30         cnt[pos] += ct;
 31         if(cnt[pos]) lt[pos] = ML==l? l:-1, rt[pos] = MR == r ? r:-1;
 32         else lt[pos] = rt[pos] = -1;
 33         return;
 34     }
 35     int mid = ML + MR >>1;
 36     if(mid >= l) update(l,r,pos<<1,ML,mid,ct);
 37     else chkmax(R,rt[pos<<1]);
 38     if(mid < r) update(l,r,pos<<1|1,mid+1,MR,ct);
 39     else if(lt[pos<<1|1]!=-1) chkmin(L,lt[pos<<1|1]);
 40     upt(pos,ML,MR);
 41 }
 42 // sweep line
 43 ll cal(int len,int m){
 44     if(m>len) return 0;
 45     return len -m + 1;
 46 }
 47 int search(int val,int n){
 48     int l =0, r = n;
 49     while(l<r){
 50         int mid = l + r>>1;
 51         if(X[mid]>=val) r = mid;
 52         else l = mid+1;
 53     }
 54     return l;
 55 }
 56 ll work(){
 57     int len = 0,k = 1;
 58     for(int i=0;i<n;i++){
 59         seg[len] = node(num[i][0],num[i][2],num[i][1]-1,1);
 60         X[len++] = num[i][0];
 61         seg[len] = node(num[i][0],num[i][2],num[i][3],-1);
 62         X[len++] = num[i][2];
 63     }
 64     sort(seg,seg+len);
 65     sort(X,X+len);
 66     for(int i=1;i<len;i++)
 67         if(X[i]!=X[i-1]) X[k++] = X[i];
 68     for(int i=k;i>=1;i--) X[i] = X[i-1];
 69     memset(lt,-1,sizeof(lt));
 70     memset(rt,-1,sizeof(rt));
 71     memset(cnt,0,sizeof(cnt));
 72     X[0] = 0; X[k+1] = w+1;
 73     update(0,0,1,0,k+1,1);
 74     update(k+1,k+1,1,0,k+1,1);
 75     ll last = cal(w,m);
 76     ll ans = last * seg[0].h;
 77     for(int i=0;i<len-1;i++){
 78         int l = search(seg[i].l,k+1);
 79         int r = search(seg[i].r,k+1);
 80         L = w+1, R = -1;
 81         update(l,r,1,0,k+1,seg[i].p);
 82         last -= seg[i].p * cal(X[L]-X[R]-1,m);
 83         last += seg[i].p * cal(X[L]-X[r]-1,m);
 84         last += seg[i].p * cal(X[l]-X[R]-1,m);
 85         ans += last * (seg[i+1].h - seg[i].h);
 86     }
 87     ans += cal(w,m) * (h - seg[len-1].h);
 88     return ans;
 89 }
 90 // main
 91 int main(){
 92     ll ans ;
 93     while(~scanf("%d%d%d%d",&w,&h,&n,&m)){
 94         for(int i=0;i<n;i++) for(int j=0;j<4;j++)
 95             scanf("%d",&num[i][j]);
 96         if(n==0) { 
 97             ans = h*cal(w,m) + w*cal(h,m);
 98             if(m == 1) cout<<ans/2<<endl;
 99             else cout<<ans<<endl;
100             continue;
101         }
102         ans = work();
103         swap(w,h);
104         for(int i=0;i<n;i++){
105             swap(num[i][0],num[i][1]);
106             swap(num[i][2],num[i][3]);
107         }
108         ans += work();
109         if(m==1)
110             cout<<ans/2<<endl;
111         else cout<<ans<<endl;
112     }
113 }
114 
posted on 2012-05-09 22:20 西月弦 閱讀(547) 評論(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>
            欧美乱人伦中文字幕在线| 男女精品网站| 亚洲人午夜精品| 久久国产天堂福利天堂| 欧美性片在线观看| 国内外成人在线视频| 欧美精品三级| 欧美一站二站| 日韩亚洲欧美在线观看| 久久精品av麻豆的观看方式| 99亚洲一区二区| 一区久久精品| 海角社区69精品视频| 亚洲精选大片| 亚洲精品视频在线观看网站| 9色国产精品| 欧美亚洲综合另类| 嫩草国产精品入口| 国产精品久久久久久影院8一贰佰| 国产欧美日韩亚洲精品| 亚洲第一福利视频| 亚洲欧美日韩国产一区二区| 另类欧美日韩国产在线| 一区二区精品国产| 麻豆精品精华液| 国产精品免费视频xxxx| 亚洲东热激情| 欧美在线91| 亚洲区国产区| 久久国产精品亚洲va麻豆| 欧美大片免费观看| 国内精品久久久久久| 亚洲综合精品自拍| 亚洲国产三级网| 久久99在线观看| 欧美日本一区二区三区| 激情懂色av一区av二区av| 亚洲视屏在线播放| 欧美激情乱人伦| 久久精品亚洲国产奇米99| 国产美女搞久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美大片免费看| 久久久久久9| 国产亚洲一区二区三区在线观看| 亚洲一区二区三区中文字幕在线 | 伊人久久亚洲美女图片| 亚洲乱码久久| 亚洲精品久久视频| 亚洲国产高清aⅴ视频| 欧美日产在线观看| 亚洲电影下载| 久久综合九色综合欧美就去吻| 亚洲欧美在线高清| 国产精品久久久久久久久免费樱桃| 亚洲美女福利视频网站| 欧美激情按摩| 久久综合狠狠综合久久激情| 国产嫩草一区二区三区在线观看| 亚洲大胆av| 欧美伊久线香蕉线新在线| 国产欧美日韩综合一区在线播放 | 欧美三级韩国三级日本三斤| 亚洲欧洲三级电影| 亚洲福利一区| 欧美激情综合五月色丁香| 亚洲精品中文字幕在线| 91久久精品日日躁夜夜躁欧美| 欧美激情一区二区三区蜜桃视频 | 亚洲国产免费看| 噜噜噜在线观看免费视频日韩| 亚洲福利一区| 亚洲精品黄色| 国产精品视频网| 久久久亚洲国产天美传媒修理工| 久久久久久久尹人综合网亚洲 | 日韩视频中文字幕| 日韩亚洲欧美成人| 国产三级欧美三级日产三级99| 欧美在线二区| 久久一区二区三区国产精品 | 欧美高清视频一区二区三区在线观看| 另类春色校园亚洲| av成人免费在线| 亚洲欧美成人在线| 亚洲国产精品成人| 一区二区日本视频| 亚洲电影在线| 亚洲网友自拍| 亚洲高清在线精品| 亚洲一区bb| 午夜精品一区二区三区在线视| 久久se精品一区精品二区| 在线观看91精品国产麻豆| 亚洲丰满在线| 国产嫩草一区二区三区在线观看 | 国产精品不卡在线| 久久永久免费| 国产精品国产三级国产专区53| 久久久国产视频91| 欧美日韩国产电影| 久热精品视频在线免费观看| 欧美日韩精品一区| 美女视频黄a大片欧美| 国产精品久久久久久久久久免费看 | 久久蜜桃资源一区二区老牛| 亚洲一区二区黄色| 美女主播一区| 久久久综合免费视频| 国产精品福利在线| 亚洲国产日韩美| 影音先锋久久久| 亚洲欧美大片| 亚洲午夜激情| 欧美精品大片| 欧美激情精品久久久久久蜜臀| 国产一区二区三区黄视频| 一区二区三区日韩精品视频| 亚洲乱码国产乱码精品精| 久久久精品一区二区三区| 西西裸体人体做爰大胆久久久| 欧美日韩成人在线| 亚洲国产欧美另类丝袜| 亚洲国产一区二区三区在线播| 欧美伊人久久久久久久久影院 | 亚洲精品在线一区二区| 久久国产免费| 久久国产乱子精品免费女| 欧美性事在线| 一区二区三区久久精品| 这里只有精品视频| 欧美区国产区| 日韩亚洲欧美成人| 亚洲午夜一区| 国产精品日韩精品欧美在线| 在线视频一区观看| 亚洲一区精品在线| 国产精品久久久久久亚洲调教| 这里只有精品视频在线| 午夜精品一区二区三区在线视| 欧美亚州一区二区三区| 亚洲图片在线观看| 久久免费观看视频| 在线观看日韩精品| 女仆av观看一区| 日韩一级黄色片| 性18欧美另类| 国产一区久久| 久久久久久久久久久一区| 欧美国产一区二区在线观看| 日韩一区二区精品视频| 亚洲综合首页| 久久不射中文字幕| 国产一区二区三区久久精品| 久久精品亚洲国产奇米99| 亚洲国产精品999| 亚洲午夜视频在线观看| 国产欧美亚洲一区| 狂野欧美一区| 日韩视频一区二区三区在线播放免费观看| 一本色道**综合亚洲精品蜜桃冫| 欧美天堂亚洲电影院在线播放| 亚洲欧美国产精品桃花| 老鸭窝亚洲一区二区三区| 亚洲精品国偷自产在线99热| 欧美午夜精品久久久久久超碰| 欧美一区二区三区在线视频| 欧美激情精品久久久| 亚洲欧美成人网| 在线看无码的免费网站| 欧美日韩一区在线观看| 午夜精品福利在线观看| 亚洲电影免费| 久久se精品一区精品二区| 91久久国产精品91久久性色| 国产精品久久久久999| 鲁大师影院一区二区三区| aa成人免费视频| 欧美成人精品在线视频| 亚洲免费人成在线视频观看| 亚洲国产经典视频| 国产精品一区二区你懂得| 久久综合伊人77777| 亚洲欧美国产三级| 亚洲精品欧美| 欧美激情亚洲一区| 久久久国产成人精品| 亚洲一区二区三区免费观看| 亚洲青涩在线| 樱桃视频在线观看一区| 国产精品久久福利| 欧美久久电影| 欧美sm重口味系列视频在线观看| 亚洲一区视频在线| 日韩亚洲一区在线播放| 亚洲国产精品久久久久秋霞蜜臀| 久久看片网站| 久久免费视频在线| 欧美专区日韩专区| 西西裸体人体做爰大胆久久久|