https://codeforces.com/contest/1236/problem/D
之前用了一种很笨的方法一直WA到最后
然后发现罗哥直接计算走的步数+k==n*m
我好菜啊
#include<bits/stdc++.h>
#define maxl 300010
using namespace std;
int n,m,k,ans;
struct node
{
int x,y;
}a[maxl];
set<int> ax[maxl],ay[maxl];
char s[maxl];
inline void prework()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
ax[a[i].x].insert(a[i].y);
ay[a[i].y].insert(a[i].x);
}
}
inline void mainwork()
{
int x=1,y=1,nxtx,nxty,dir=1,upx=n,lowx=1,upy=m,lowy=1;
long long sum=1;
while(lowx<=upx && lowy<=upy)
{
if(dir==1)
{
auto it=ax[x].upper_bound(y);
if(it!=ax[x].end())
{
nxty=min(upy,(*it)-1);
sum+=nxty-y,y=nxty,upy=y;
}
else
sum+=upy-y,y=upy;
lowx++;
}
if(dir==2)
{
auto it=ay[y].upper_bound(x);
if(it!=ay[y].end())
{
nxtx=min((*it)-1,upx);
sum+=nxtx-x,x=nxtx,upx=x;
}
else
sum+=upx-x,x=upx;
upy--;
}
if(dir==3)
{
auto it=ax[x].lower_bound(y);
if(it!=ax[x].begin())
{
--it;nxty=max((*it)+1,lowy);
sum+=y-nxty,y=nxty,lowy=y;
}
else
sum+=y-lowy,y=lowy;
upx--;
}
if(dir==4)
{
auto it=ay[y].lower_bound(x);
if(it!=ay[y].begin())
{
--it;nxtx=max((*it)+1,lowx);
sum+=x-nxtx,x=nxtx,lowx=x;
}
else
sum+=x-lowx,x=lowx;
lowy++;
}
dir++;
if(dir>4) dir=1;
}
if(sum+k==1ll*n*m)
ans=1;
else
ans=0;
}
inline void print()
{
if(ans)
puts("Yes");
else
puts("No");
}
int main()
{
int t=1;
//scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}