• <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>

            vijos1664 真-資源勘探題解

            Posted on 2009-10-06 12:28 hyf 閱讀(434) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): OI
                這是道怨念題,交了5次都等不到puppy,更詭異的是vj上顯示的是ac……
                題目的大意是給出n*m的矩陣,詢(xún)問(wèn)(1,1)->(x,y)的子矩陣中只出現(xiàn)一次的元素個(gè)數(shù)
                對(duì)于第i行來(lái)說(shuō),記錄1->i行內(nèi)元素x最小和次小的橫坐標(biāo)x0、x1,那么在該行內(nèi)將元素x記錄進(jìn)去的子矩陣只能是左下坐標(biāo)在x0到(x1-1)之間的。
                所以按行i掃描,維護(hù)(1,1)->(i,x)子矩陣的稀有資源個(gè)數(shù),也就是對(duì)于在本行內(nèi)出現(xiàn)的元素算出其新的區(qū)間[x0,x1),原區(qū)間全部減1,新區(qū)間加1,在該行沒(méi)有出現(xiàn)的元素不變。
                區(qū)間整體修改可以用線段樹(shù)來(lái)維護(hù),但是此題用線段樹(shù)T的可能性相當(dāng)大,注意到這里是維護(hù)區(qū)間詢(xún)問(wèn)點(diǎn),所以可以把樹(shù)狀數(shù)組逆向運(yùn)用,這樣常數(shù)大大降低。
                最終復(fù)雜度是O(n^2logn),C++還要進(jìn)行輸入優(yōu)化。

            囧代碼:
              1 #include <iostream>
              2 using namespace std;
              3 #define LOWBIT(x) (x&(-x))
              4 
              5 int n,m;
              6 int data[1100][1100];
              7 int r[2000000];
              8 int pre[2000000][2];
              9 int hash[2000000][2= {0};
             10 int ans = 0;
             11 int A[1101= {0};
             12 char s[10000];
             13 
             14 void Modify(int x, int c)
             15 {
             16     while(x)
             17     {
             18         A[x] += c;
             19         x -= LOWBIT(x);
             20     }
             21 }
             22 
             23 int Get(int x)
             24 {
             25     int ans = 0;
             26     while(x<=m)
             27     {
             28         ans += A[x];
             29         x += LOWBIT(x);
             30     }
             31     return ans;
             32 }
             33 
             34 void init()
             35 {
             36     int tmp, p;
             37     char *ptr;
             38     scanf("%d %d\n",&n,&m);
             39     for(int i = 0; i < n; i++)
             40     {
             41         gets(s);
             42         p = tmp = 0;
             43         ptr = s;
             44         while(*ptr)
             45         {
             46             if((*ptr)==' ')
             47                 data[i][p++= tmp, tmp = 0;
             48             else
             49                 tmp *= 10, tmp += (*ptr)-'0';
             50             ptr++;
             51         }
             52         data[i][p] = tmp;
             53     }
             54     for(int i = 0; i <= n*m; i++)
             55         hash[i][0= hash[i][1= m, pre[i][0= pre[i][1= m, r[i] = -1;
             56 }
             57 
             58 void solve()
             59 {
             60     int tmp = 0;
             61     for(int i = 0; i < n; i++)
             62     {
             63         for(int j = 0; j < m; j++)
             64         {
             65             tmp = data[i][j];
             66             pre[tmp][0= hash[tmp][0], pre[tmp][1= hash[tmp][1];
             67         }
             68         for(int j = 0; j < m; j++)
             69         {
             70             tmp = data[i][j];
             71             if(j<pre[tmp][0])
             72                 pre[tmp][1= pre[tmp][0], pre[tmp][0= j;
             73             else if(j<pre[tmp][1])
             74                 pre[tmp][1= j;
             75         }
             76         for(int j = 0; j < m; j++)
             77         {
             78             tmp = data[i][j];
             79             if(r[tmp]!=i)
             80             {
             81                 Modify(hash[tmp][1],-1);
             82                 Modify(hash[tmp][0],1);
             83                 Modify(pre[tmp][1],1);
             84                 Modify(pre[tmp][0],-1);
             85                 hash[tmp][0= pre[tmp][0], hash[tmp][1= pre[tmp][1];
             86                 r[tmp] = i;
             87             }
             88         }
             89         for(int j = 1; j <= m; j++)
             90             tmp = Get(j), ans ^= tmp;
             91     }       
             92 }
             93 
             94 void print()
             95 {
             96     printf("%d\n",ans);
             97 }
             98 
             99 int main(void)
            100 {
            101     init();
            102     solve();
            103     print();
            104     return 0;
            105 }

               

            Feedback

            # re: vijos1664 真-資源勘探題解[未登錄](méi)  回復(fù)  更多評(píng)論   

            2009-10-06 21:35 by Tim
            orz?
            ORZ!

            # re: vijos1664 真-資源勘探題解[未登錄](méi)  回復(fù)  更多評(píng)論   

            2009-11-27 08:32 by SonicMisora
            ORZ!
            久久精品人人做人人爽电影蜜月 | 精品国产91久久久久久久| 亚洲午夜久久久久久久久久| 亚洲国产另类久久久精品黑人 | 久久精品国产一区二区三区日韩| 很黄很污的网站久久mimi色 | 伊人久久大香线蕉影院95| 久久人人爽人人爽AV片| 伊人久久综合无码成人网| 久久久久久国产精品美女| 久久久亚洲欧洲日产国码aⅴ| 久久这里只有精品视频99| 久久国产精品无码一区二区三区| 久久精品国产精品亚洲下载| 亚洲va中文字幕无码久久| 无码8090精品久久一区| 91久久精品视频| 久久综合噜噜激激的五月天| 人妻丰满?V无码久久不卡| 亚洲国产天堂久久综合网站| 久久夜色精品国产网站| 亚洲中文字幕无码久久2017| 欧美日韩精品久久免费| 久久综合给合综合久久| 久久五月精品中文字幕| 丁香五月综合久久激情| 伊人久久大香线蕉影院95| 国产精品一久久香蕉国产线看| 久久人做人爽一区二区三区| 亚洲国产成人久久精品99| 久久久久久国产精品美女| 欧美激情精品久久久久久| 久久精品国产福利国产琪琪| 久久精品国产欧美日韩| 亚洲精品无码久久毛片| 日韩亚洲国产综合久久久| 久久精品中文字幕大胸| 麻豆精品久久久久久久99蜜桃 | 欧美粉嫩小泬久久久久久久 | 亚洲国产精品久久久久| 国产精品女同一区二区久久|