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

             

             

            精品久久久久久久久中文字幕| 思思久久好好热精品国产| 国内精品久久久久影院一蜜桃| 久久精品水蜜桃av综合天堂| 2020久久精品亚洲热综合一本| 日本福利片国产午夜久久| 久久久免费精品re6| 久久综合给合久久狠狠狠97色| 三级三级久久三级久久| 伊人久久大香线蕉AV一区二区| 久久久久人妻精品一区三寸蜜桃| 国产成人精品久久亚洲| 久久99热这里只有精品国产| 久久激情五月丁香伊人| 亚洲v国产v天堂a无码久久| 伊人久久大香线蕉成人| 性色欲网站人妻丰满中文久久不卡| 亚洲精品无码久久久久| 狠狠色丁香婷婷综合久久来| 91精品国产91久久久久久| 欧美大战日韩91综合一区婷婷久久青草 | 欧美精品丝袜久久久中文字幕 | 久久久久久综合一区中文字幕| 久久er国产精品免费观看2| 香港aa三级久久三级| 色综合合久久天天给综看| 亚洲人AV永久一区二区三区久久| 久久无码高潮喷水| 人妻无码αv中文字幕久久| 久久久久综合网久久| 综合久久给合久久狠狠狠97色 | 狠狠88综合久久久久综合网 | 国产女人aaa级久久久级| 久久只这里是精品66| 国产精品久久久久影视不卡 | 久久久综合香蕉尹人综合网| 欧美伊人久久大香线蕉综合| 国产成人无码精品久久久久免费| 久久久国产精品亚洲一区| 久久精品国产亚洲av麻豆色欲| 国内精品免费久久影院|