TopCoder SRM578 Div.2

来源:互联网 发布:淘宝保证金在哪里 编辑:程序博客网 时间:2024/04/29 20:14

既然开通了这个博客就先随便写点好了。

 

本人第二次刷TC。上次很不爽的只做出第一题。第二题来不及了。/_\。结果还升到Div.1了。肯定被虐。所以我用这个号再从零开始。

 

9点10分题目出现了。打开第一题。

 

250p:

题意:N个什么动物来着。每个动物有两个梯子(为什么是梯子?)。有的动物丢了一些。两个煞笔捡起了K个梯子。问最少和最多有多少个动物没掉梯子。

明显最少的话,K个梯子属于K个动物,答案是max(0,N-K)

最多的话就是所有掉梯子的都是掉两个,答案是(N*2-K)/2

然后匆忙test一下样例就交了。得了240p。我第二个交的。前面那个稍微比我快一点。

 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<queue>#include<deque>#include<cstdlib>#include<string>using namespace std;class DeerInZooDivTwo{    public:        vector<int> getminmax(int N,int K){            vector<int>ans;            ans.clear();            if(K>N)ans.push_back(0);            else ans.push_back(N-K);            ans.push_back((N*2-K)>>1);            return ans;        }};


然后我就点开了第二题。

500p:

题意:点阵上有一堆动物,有的是鸭子有的是鹅。至少有一只鹅。所有和鹅的曼哈顿距离小于d的动物一定是鹅。问有多少种鹅的分布情况。

我真是弱逼纠结了好久。后来发现可以dfs。找出所有鹅的连通块。计算连通块个数cnt。答案自然是2^cnt-1。

然后就不停地码代码。然后最大的test没过。纠结了一会儿发现没开long long。/_\然后改了一下就过了。交上去的时候只剩260p了。。/_\那个人还是比我早交一点。可能交晚了,500p只剩下260p了。。

 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<queue>#include<deque>#include<cstdlib>#include<string>using namespace std;int vis[60][60],block[60][60];class GooseInZooDivTwo{    public:        int n,m,bc;        long long qp(long long b,long long p,long long k){            long long ans=1;            while(p){                if(p&1)ans=ans*b%k;                p>>=1;                b=b*b%k;            }            return ans;        }        void floodfill(int x,int y,int bc,int d){            vis[x][y]=1;            block[x][y]=bc;            for(int i=0;i<=d && x-i>=0;i++){                for(int j=0;i+j<=d && j+y<m;j++)                    if(vis[x-i][y+j]==0)    floodfill(x-i,y+j,bc,d);                for(int j=0;i+j<=d && y-j>=0;j++)                    if(vis[x-i][y-j]==0)    floodfill(x-i,y-j,bc,d);            }            for(int i=0;i<=d && x+i<n;i++){                for(int j=0;i+j<=d && j+y<m;j++)                    if(vis[x+i][y+j]==0)    floodfill(x+i,y+j,bc,d);                for(int j=0;i+j<=d && y-j>=0;j++)                    if(vis[x+i][y-j]==0)    floodfill(x+i,y-j,bc,d);            }        }        int count(vector <string> field, int dist){            n=field.size();            m=field[0].size();            memset(vis,0xff,sizeof(vis));            for(int i=0;i<n;i++)                for(int j=0;j<m;j++)                    if(field[i][j]=='v'){                        vis[i][j]=0;                    }            int blockcnt=0;            for(int i=0;i<n;i++)                for(int j=0;j<m;j++)                    if(vis[i][j]==0){                        blockcnt++;                        floodfill(i,j,blockcnt,dist);                    }            int ans=int((qp(2LL,1LL*blockcnt,1000000007LL)-1+1000000007LL)%1000000007LL);            return ans;        }};


 

1000p:

不太会/_\看似dp。也来不及了,就没去写了。。

 

快结束的时候有人交了第三题。分数飙升。我一下就被挤到第三了。额。。

 

 

然后是激情的cha时间:

做题的时候我发现两个容易错的地方:

1.第一题那个除2分上取整和下取整,可以坑掉人。

2.第二题如果不开long long说不定会挂。(我自己就被坑了好久还好我发现了)

 

然后我先去看大家的第一题。看到一个感觉会挂的。我就迫不及待的cha了。结果没成功。。掉了25分。。T.T

 

然后看到那个交第三题的人的第三题瞬间被cha了。。

 

然后我去看他们的第二题。果然有没开long long的。而且连mod都没有!欣喜若狂1分钟之后开cpp制造大数据。然后他就被我cha掉了。第一次成功cha。~

留下证据纪念:然后我的分数又涨上去了,到了第二。比一开始还多了二十多分。哈哈。

 

 

比赛就结束了。结果是房间第二,所有Div2的第36名。呵呵还行吧。Rating涨到了1486,一下就蓝名了,再多14分就黄名了~唉。。可惜。。要是第一次cha错的那次看仔细就好了。

图片纪念:

 

下次应该要去Div.1了。加油吧!

明天CF继续刷!

 

原创粉丝点击