2018暑期牛客网多校第二场签到题---思维(规律题)

这道题,有点意思,比赛解束2分钟后,队友把这道题AC了。照他的说法是我的题意没解释清楚,但是题目上的题意就是那样,我也很尴尬。

题意,给你n*n的矩阵,代表停车场,你只能往边界上放车,你在上边界放车,车就会向下走,你在下边界放车,车就会向上走,左边界和右边界,同样如此。边界如何处理呢?

看一张图片

2表示n,后面的0表示会有0个陷阱,接下来会给出陷阱的坐标。陷阱的意思是,车走到这里会GG,还有一种GG的方式是两个车相撞了。问最多能放多少辆车。n <= 100000

 

题解:我们不难发现一个陷阱的位置虽然能挡住这一行和这一列的汽车排放,但是我们可以对称一下,就相当于换个位置放车,一样的。

上代码吧。

#include<assert.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<ctime>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define File(S) freopen(S".in","r",stdin);freopen(S".out","w",stdout);
using namespace std;

typedef long long LL;

const int INF=2147483647;

LL getint()
{
    LL res=0,p=1;
    char ch=getchar();
    while ((ch<'0'||ch>'9') && ch!='-') ch=getchar();
    if (ch=='-') p=-1,ch=getchar();
    while (ch>='0'&&ch<='9') res=res*10+ch-'0',ch=getchar();
    return res*p;
}

int n,m,ans;
bool S1[100050],S2[100050];

int main()
{
    n=getint();
    m=getint();
	assert(1<=n&&n<=1e5);
	assert(0<=m&&m<=1e5);
    ans=n*2;
    int x,y;
    while (m--) {
        x=getint();
        y=getint();
        if (!S1[x]) {
            S1[x]=1;
            ans--;
        }
        if (!S2[y]) {
            S2[y]=1;
            ans--;
        }
    }
    if (n&1 && !S1[n/2+1] && !S2[n/2+1]) ans--;
    printf("%d\n",ans);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值