TopCoder SRM578 Div.2

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

 

本人第二次刷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继续刷!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值