1. 程式人生 > 實用技巧 >CF1236D Alice and the Doll(模擬)

CF1236D Alice and the Doll(模擬)

最重要的是觀察到一點,最優策略一定是走到最遠不能走的地方在轉彎

因為我們一旦轉彎,就永遠不能越過這條線,因為只能右轉,其實就相當於一個蛇形

所以只需要暴力模擬即可

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,pll> plll;
const int N=5e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
vector<int
> col[N],row[N]; int main(){ ios::sync_with_stdio(false); int n,m; ll k; cin>>n>>m>>k; int i; for(i=1;i<=k;i++){ int a,b; cin>>a>>b; row[a].push_back(b); col[b].push_back(a); } ll sum=1; int mxrow=n,mirow=2
,mxcol; int micol=1; int ed=m; int x=1,y=1; for(auto a:row[1]){ if(a>y){ ed=min(ed,a-1); } } sum+=ed-1; mxcol=ed-1; y=ed; while(1){ ed=mxrow; for(auto a:col[y]){ if(a>x){ ed=min(ed,a-1); } }
if(ed==x) break; sum+=ed-x; x=ed; mxrow=ed-1; ed=micol; for(auto a:row[x]){ if(a<y){ ed=max(ed,a+1); } } if(ed==y) break; sum+=y-ed; y=ed; micol=ed+1; ed=mirow; for(auto a:col[y]){ if(a<x){ ed=max(ed,a+1); } } if(ed==x) break; sum+=x-ed; x=ed; mirow=ed+1; ed=mxcol; for(auto a:row[x]){ if(a>y) ed=min(ed,a-1); } if(ed==y) break; sum+=ed-y; y=ed; mxcol=ed-1; } if((ll)n*m-sum!=k){ cout<<"No"<<endl; } else{ cout<<"Yes"<<endl; } return 0; }
View Code