• <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无码精品麻豆| 久久99精品国产麻豆宅宅| 婷婷综合久久狠狠色99h| 久久天天躁狠狠躁夜夜不卡| 中文精品99久久国产| 精品久久无码中文字幕| 久久精品无码一区二区日韩AV| 久久久久亚洲AV无码专区首JN| 99久久无色码中文字幕| 久久久久亚洲AV无码观看 | AV无码久久久久不卡蜜桃| 狠狠色丁香久久婷婷综合五月| 四虎国产永久免费久久| 久久亚洲私人国产精品| 国产精品久久新婚兰兰| 国内精品久久久久久久亚洲| 久久99精品久久久久婷婷| 婷婷国产天堂久久综合五月| 久久99国产精品成人欧美| 久久精品国产亚洲精品2020| 99精品国产免费久久久久久下载| 国产精品丝袜久久久久久不卡| 久久ZYZ资源站无码中文动漫| 久久久受www免费人成| 久久99精品九九九久久婷婷| 久久精品国产半推半就| 亚洲精品无码久久千人斩| 2021国产精品午夜久久| 亚洲欧洲精品成人久久奇米网| 91精品国产高清久久久久久91| 久久99国产精品久久久| 91久久婷婷国产综合精品青草| 久久久久AV综合网成人| 久久综合综合久久综合| 人妻少妇久久中文字幕一区二区| 亚洲精品无码成人片久久| 久久久精品人妻一区二区三区蜜桃| 色欲综合久久躁天天躁蜜桃| 成人久久综合网| 日韩精品久久久久久|