D. Alice and the Doll

http://codeforces.com/contest/1236/problem/D

#include <bits/stdc++.h>
//#include <cmath>
//#include <iostream>
//#include <unordered_map>

#define mem(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define INF 0x3f3f3f3f
#define ll long long
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

const int mod=1e9+7;
const int N=1e5+9;

set<int>x[N],y[N];
int n,m,k;
int main()
{
    FAST_IO;

    cin>>n>>m>>k;

    for(int i=1;i<=n;i++) x[i].insert(0),x[i].insert(m+1);
    for(int i=1;i<=m;i++) y[i].insert(0),y[i].insert(n+1);

    for(int i=0;i<k;i++)
    {
        int xx,yy;
        cin>>xx>>yy;
        x[xx].insert(yy);
        y[yy].insert(xx);
    }

    ll ans=1;
    int nowx=1;
    int nowy=1;
    int nx=n,ny=m;
    int maxx=n,maxy=m,minx=1,miny=1;
    for(int i=0;;i++)
    {
        if(i%4==0)
        {
            nx=nowx;
            int posy=*x[nowx].lower_bound(nowy);
            ny=min(maxy,posy-1);
            minx=nx+1;
        }
        else if(i%4==1)
        {
            ny=nowy;
            int posx=*y[nowy].lower_bound(nowx);
            nx=min(posx-1,maxx);
            maxy=ny-1;
        }
        else if(i%4==2)
        {
            nx=nowx;
            auto it=x[nowx].lower_bound(nowy);
            it--;
            int posy=*(it);
            ny=max(miny,posy+1);
            maxx=nx-1;
        }
        else
        {
            ny=nowy;
            auto it=y[nowy].lower_bound(nowx);
            it--;
            int posx=*(it);
            nx=max(minx,posx+1);
            miny=ny+1;
        }

        ans+=abs(nx-nowx)+abs(ny-nowy);

        //cout<<nowx<<" "<<nowy<<"  "<<nx<<" "<<ny<<" "<<ans<<endl;
        if(nx==nowx&&ny==nowy)
        {
            if(nowx==1&&nowy==1&&i%4==0);
            else break;
        }


        nowx=nx;
        nowy=ny;



    }



    if(ans==(ll)m*n-k) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;

    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值