傳送門
文章目錄
題意:
思路:
還以為這個題有什么高深的算法,結果就是個暴力。
由于n?mn*mn?m達到了1e101e101e10的級別,所以直接暴力肯定是不行的,考慮有很多空格,我們可以維護四個變量表示邊界,讓后在當前軸上二分最近的障礙點,讓后判斷即可。
實現的時候可以加兩個邊界比較方便。
要注意如果枚舉的四個方向,如果有一個方向不能走的話不能直接退出,有如下樣例:
333\ \ 33??3
0110\ \ 1\ \ 10??1??1
0110\ \ 1\ \ 10??1??1
0110\ \ 1\ \ 10??1??1
111代表障礙,一開始是向右走,顯然不能走,如果直接退出就錯了,我們還可以向下走。
只有這一種情況,所以特判一下是不是起點即可。
還有注意二分前先給數組排個序。。。
沒排序卡了我半天。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
,m
,k
;
vector
<int>x
[N
],y
[N
];int main()
{
scanf("%d%d%d",&n
,&m
,&k
);for(int i
=1;i
<=n
;i
++) x
[i
].pb(0);for(int i
=1;i
<=m
;i
++) y
[i
].pb(0);for(int i
=1;i
<=k
;i
++) {int xx
,b
; scanf("%d%d",&xx
,&b
);x
[xx
].pb(b
); y
[b
].pb(xx
);}for(int i
=1;i
<=n
;i
++) sort(x
[i
].begin(),x
[i
].end()),x
[i
].pb(m
+1);for(int i
=1;i
<=m
;i
++) sort(y
[i
].begin(),y
[i
].end()),y
[i
].pb(n
+1);int sx
,ex
,sy
,ey
;sx
=sy
=0; ex
=n
+1; ey
=m
+1;LL sum
=0;int dx
,dy
; dx
=dy
=1;int op
=0;while(1) {if(op
%4==0) {int pos
=lower_bound(x
[dx
].begin(),x
[dx
].end(),dy
)-x
[dx
].begin();int add
=min(x
[dx
][pos
],ey
);if(add
-1<=dy
) {if(op
==0) {sum
++; op
++;continue;} else break;} sum
+=add
-dy
;dy
=add
-1; ey
=dy
; sx
=dx
;} else if(op
%4==1) {int pos
=lower_bound(y
[dy
].begin(),y
[dy
].end(),dx
)-y
[dy
].begin();int add
=min(y
[dy
][pos
],ex
);if(add
-1<=dx
) break;sum
+=add
-dx
;dx
=add
-1; ex
=dx
; ey
=dy
;} else if(op
%4==2) {int pos
=upper_bound(x
[dx
].begin(),x
[dx
].end(),dy
)-x
[dx
].begin();pos
--;int add
=max(x
[dx
][pos
],sy
);if(add
+1>=dy
) break;sum
+=dy
-add
;dy
=add
+1; sy
=dy
; ex
=dx
;} else if(op
%4==3) {int pos
=upper_bound(y
[dy
].begin(),y
[dy
].end(),dx
)-y
[dy
].begin();pos
--;int add
=max(y
[dy
][pos
],sx
);if(add
+1>=dx
) break;sum
+=dx
-add
;dx
=add
+1; sx
=dx
; sy
=dy
;}op
++; }sum
-=op
-1;if(sum
==1ll*n
*m
-k
) puts("Yes");else puts("No");return 0;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Codeforces Round #593 (Div. 2) D. Alice and the Doll 暴力 + 二分的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。