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

            SRM458

            Posted on 2010-01-23 21:35 rikisand 閱讀(230) 評論(0)  編輯 收藏 引用

            繼續補上srm的總結:

            250pt

            Problem Statement

            Desertification (the process of good land turning into desert) is a severe problem on Bob's island. Bob's island is a rectangular grid of cells. You are given a vector <string> island that shows the current state of Bob's island. The j-th character of the i-th element of island is 'D' if cell in row i, column j of the grid is desert and is 'F' if this cell is forest.
            The desert spreads each year as follows:

            • If a cell is desert, it remains desert forever.
            • If a cell is forest and it is adjacent to at least one desert cell (in one of the four orthogonal directions), it becomes desert after one year.
            • Otherwise the cell remains forest for another year.
            Return the number of desert cells after T years.
            Definition

            Class:
            Desertification

            Method:
            desertArea

            Parameters:
            vector <string>, int

            Returns:
            int

            Method signature:
            int desertArea(vector <string> island, int T)

            (be sure your method is public)

            Constraints

            -
            island will contain between 1 and 10 elements, inclusive.

            -
            Each element of island will contain between 1 and 10 characters, inclusive.

            -
            Each character in island will be 'D' or 'F'.

            -
            Each element of island will contain the same number of characters.

            -
            T will be between 1 and 1,000,000,000, inclusive.

             

            記得當時寫了遍歷,如果一個是沙漠則把周圍的都設置為沙漠,這樣牽涉到一個問題,循環到某年時候遇到的可能是剛剛變成沙漠的,因此需要每次用一個Vector<string> 記錄新的。

            其實對每一個來計算在其T距離內有沒有沙漠即可,復雜度 O(n^4)不過數據很小可以過

            Code Snippet
            int desertArea(vector <string>  land, int T)
            {
                     int r= land.size(); int c = land[0].size();
                     int cnt=0;
                     REP(i,r)REP(j,c)  {
                         if(land[i][j] == 'D') {cnt++;continue;}
                         bool tag=false;
                         REP(x,r){
                             if(tag)break;
                             REP(y,c){
                             if(land[x][y]=='D'&&abs(x-i)+abs(y-j)<=T){
                                tag=true;break;
                             }
                             }
                         }
                         if(tag)cnt++;
                     }
                     return cnt;
            }

            500pt

            Problem Statement

            John is playing with balls. All of the balls are identical in weight and considered to have a zero radius. All balls are located on the same straight line and can move only along this line. If a ball rolling to the right and a ball rolling to the left at the same speed collide, they do not change speed, but they change direction.
            You are given vector <int> x. x[i] is the initial position of the i-th ball. John decides the direction for each ball (right or left) with equal probability. At time 0, he rolls the balls in the chosen directions simultaneously at a speed of one unit per second. Return the expected number of bounces between all balls during T seconds (including those collisions that happen exactly at T seconds).

            Definition

            Class:
            BouncingBalls

            Method:
            expectedBounces

            Parameters:
            vector <int>, int

            Returns:
            double

            Method signature:
            double expectedBounces(vector <int> x, int T)

            (be sure your method is public)

            Notes

            -
            There is no friction. Each ball continues rolling at the same speed forever.

            -
            Your return value must have an absolute or relative error less than 1e-9.

            Constraints

            -
            x will contain between 1 and 12 elements, inclusive.

            -
            Each element of x will be between 0 and 100,000,000, inclusive.

            -
            All elements of x will be distinct.

            -
            T will be between 1 and 100,000,000, inclusive.

            Examples

            蠻有意思的題,只需要注意到,兩個球碰撞后立即反向,而且速度不變,可以看做兩個球穿越····然后枚舉所有可能的方向2^n種可能即可~~

            Code Snippet
            class BouncingBalls
            {
                    public:
                    double expectedBounces(vector <int> x, int T)
                    {
                        int n = x.size();int ans=0;
                        sort(x.begin(),x.end());
                        REP(i,(1<<n)){
                            int mask=1;
                            vector<int> vec(n);
                            for(int k=0;k<n;k++,mask<<=1){
                                if(mask&i)vec[k] = x[k] + T;
                                else vec[k] = x[k] - T;
                            }
                            for(int a=0;a<n;a++)
                                for(int b=a+1;b<n;b++){
                                    if(vec[a]>=vec[b])ans++;
                                }
                        }
                        return double(ans)/(1<<n);
                    }

             

            500分和250分的基本都會用到一些簡化的思想,化復雜為簡單,化特殊為一般~

            1000pt

            Problem Statement

            You are given six integers, minx, maxx, miny, maxy, minz and maxz. Return the number of triplets of integers (x,y,z) that satisfy the following three conditions:

            • x is between minx and maxx, inclusive.
            • y is between miny and maxy, inclusive.
            • z is between minz and maxz, inclusive.
            • x * y = z
            Definition

            Class:
            ProductTriplet

            Method:
            countTriplets

            Parameters:
            int, int, int, int, int, int

            Returns:
            long long

            Method signature:
            long long countTriplets(int minx, int maxx, int miny, int maxy, int minz, int maxz)

            (be sure your method is public)

            Constraints

            -
            maxx will be between 1 and 1,000,000,000, inclusive.

            -
            maxy will be between 1 and 1,000,000,000, inclusive.

            -
            maxz will be between 1 and 1,000,000,000, inclusive.

            -
            minx will be between 1 and maxx, inclusive.

            -
            miny will be between 1 and maxy, inclusive.

            -
            minz will be between 1 and maxz, inclusive.

             

            貼一下tutorial中的解釋,挺明白:

            The problem asks about the number of triplets of integers (x, y, z), such that
            x1 ≤ x ≤ x2
            y1 ≤ y ≤ y2
            z1 ≤ z ≤ z2
            and x * y = z

            Let's look at a special case of the problem. Given a fixed x0. Calculate the number of integer triplets (x0, y, z), such that
            y1 ≤ y ≤ y2
            z1 ≤ z ≤ z2
            and x0 * y = z

            The conditions on z will derive the following conditions on y.
            z1 ≤ x0 * y ≤ z2
            z1/x0 ≤ y ≤ z2/x0
            ceil(z1/x0) ≤ y ≤ floor(z2/x0)

            Another condition on y is y1 ≤ y ≤ y2. So, max(y1, ceil(z1/x0)) ≤ y ≤ min(y2, floor(z2/x0)) are the only limiting conditions on y and z, because any value of y in this range will give a valid (x0, y, z) triplet.

            The number of candidate values to y is: min(y2, floor(z2/x0))-max(y1, ceil(z1/x0))+1, provided that the result of the subtraction is not negative. i.e.: the interval is not empty.

             

            然后按照這種思想很容易得到第一種方法:

            Code Snippet
            int64 cacl(int x,int miny,int maxy,int minz,int maxz){
                 minz = max(minz,x*x+1);
                 if(minz>maxz)return 0;
                 miny = max(miny,(minz+x-1)/x);
                 maxy = min(maxy,maxz/x);
                 return max(0,maxy-miny+1);
            }
            class ProductTriplet
            {
                    public:
                    long long countTriplets(int minx, int maxx, int miny, int maxy, int minz, int maxz)
                    {
                        int64 ans=0;
                        for(int64 i=minx;i<=maxx && i*i<maxz ;i++)
                            ans+=cacl(i,miny,maxy,minz,maxz);
                        for(int64 i=miny;i<=maxy && i*i<maxz ;i++)
                            ans+=cacl(i,minx,maxx,minz,maxz);
                        for(int64 i=max(minx,miny);i<=min(maxx,maxy) && i*i<=maxz;i++)
                            if(i*i>=minz)ans++;
                        return ans;
                    }

            首先計算出x<sqrt(z) 然后y<sqrt(z) 最后x==y

            注意cacl 中首先要更新minz至少為x*x+1保證x<y;

            關鍵是想到x*y=z直接枚舉會超時,但是分別枚舉x,y 均在sqrt(z) 之內可以完成

            其他的方法:

            Code Snippet
            int64 cacl2(int x1,int x2,int y1,int y2,int z1,int z2){
                int x=x1,y=y1;
                int64 ans=0;
                while(x<=x2 && y<=y2 && x*y<=z2){
                    int low = (z1+x-1)/x ;
                    int high = z2/x;
                    low = max(y,low);
                    high = min(y2,high);
                    if(high>=low)ans+=(high-low+1);
                    x++;
                    if(high-low<100)
                        swap(x,y),swap(x2,y2);
                }
                return ans;
            }
            int64 cacl(int x1,int x2,int y1,int y2,int z){
                if(z==0)return 0;
                int x=x1,y=y1;
                int64 ans=0;
                while(x<=x2 && y<=y2 && x*y<=z){
                    if(x>y){
                        swap(x2,y2);swap(x,y);
                    }
                    int k = z/x ;
                    int low = max(1,y);
                    int high = min(y2,k);
                    if(high>=low)ans+=(high-low+1);
                    x++;
                }
                return ans;
            }  
            class ProductTriplet
            {
                    public:
                    long long countTriplets(int minx, int maxx, int miny, int maxy, int minz, int maxz)
                    {
                         int64 ans = cacl(minx,maxx,miny,maxy,maxz);
                         return ans-cacl(minx,maxx,miny,maxy,minz-1);
                        /*return cacl(minx,maxx,miny,maxy,minz,maxz2);*/
                    }

             

            一種使用cacl函數,計算1 ~maxz的可用對數,然后減去1~(minz-1)的可用對數即可

            計算過程中,枚舉x的值,如果x>y則swap(x,y)其實也是保證枚舉次數不超過sqrt(z)

            另一種方法使用cacl2函數直接計算結果,同樣枚舉x的值,不過在得到的y的值小于一定大小

            ->100 的時候交換x和y,這是基于此時枚舉y值可能更有效率而來的。

            在計算ceil(x) 時候有點技巧 low = (z-1+x)/x;

             

             

            人人狠狠综合久久88成人| 99久久久精品免费观看国产| 国产精品美女久久久久av爽 | 国产精品成人久久久久三级午夜电影 | 婷婷久久综合九色综合绿巨人| 久久婷婷五月综合成人D啪| 久久亚洲AV无码精品色午夜 | 久久毛片免费看一区二区三区| 久久中文字幕视频、最近更新| 人妻无码αv中文字幕久久琪琪布| 亚洲一区中文字幕久久| 香蕉久久AⅤ一区二区三区| 91久久婷婷国产综合精品青草| 婷婷久久五月天| 婷婷久久五月天| 久久精品国产亚洲麻豆| 久久精品国产清自在天天线| 国产精品美女久久久| 亚洲精品乱码久久久久久自慰| 国产免费福利体检区久久| 香蕉久久夜色精品升级完成| 亚洲精品tv久久久久久久久久| 亚洲一本综合久久| 国产成人久久精品一区二区三区 | 日本WV一本一道久久香蕉| 久久狠狠色狠狠色综合| 久久综合久久自在自线精品自 | 久久久久女人精品毛片| 久久99热这里只有精品66| 久久99精品九九九久久婷婷| 久久99国产亚洲高清观看首页| 伊人久久大香线蕉AV色婷婷色| 亚洲性久久久影院| 中文字幕久久亚洲一区| 伊人久久大香线蕉综合热线| 久久久久亚洲AV成人网人人网站| 国产精品久久久久一区二区三区| 国产99久久九九精品无码| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久国内免费视频| 久久久午夜精品|