結果

問題 No.86 TVザッピング(2)
ユーザー tancahn2380
提出日時 2019-09-07 15:10:29
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 4 ms / 5,000 ms
コード長 12,860 bytes
コンパイル時間 3,432 ms
コンパイル使用メモリ 227,576 KB
最終ジャッジ日時 2025-01-07 17:10:04
ジャッジサーバーID
(参考情報)
judge1 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

# include "bits/stdc++.h"
using namespace std;
using LL = long long;
using ULL = unsigned long long;
const double PI = acos(-1);
template<class T>constexpr T INF() { return ::std::numeric_limits<T>::max(); }
template<class T>constexpr T HINF() { return INF<T>() / 2; }
template <typename T_char>T_char TL(T_char cX) { return tolower(cX); };
template <typename T_char>T_char TU(T_char cX) { return toupper(cX); };
const int vy[] = { -1, -1, -1, 0, 1, 1, 1, 0 }, vx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
const int dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 };
int popcnt(unsigned long long n) { int cnt = 0; for (int i = 0; i < 64; i++)if ((n >> i) & 1)cnt++; return cnt; }
int d_sum(LL n) { int ret = 0; while (n > 0) { ret += n % 10; n /= 10; }return ret; }
int d_cnt(LL n) { int ret = 0; while (n > 0) { ret++; n /= 10; }return ret; }
LL gcd(LL a, LL b) { if (b == 0)return a; return gcd(b, a%b); };
LL lcm(LL a, LL b) { LL g = gcd(a, b); return a / g*b; };
# define ALL(qpqpq) (qpqpq).begin(),(qpqpq).end()
# define UNIQUE(wpwpw) sort(ALL((wpwpw)));(wpwpw).erase(unique(ALL((wpwpw))),(wpwpw).end())
# define LOWER(epepe) transform(ALL((epepe)),(epepe).begin(),TL<char>)
# define UPPER(rprpr) transform(ALL((rprpr)),(rprpr).begin(),TU<char>)
# define FOR(i,tptpt,ypypy) for(LL i=(tptpt);i<(ypypy);i++)
# define REP(i,upupu) FOR(i,0,upupu)
# define INIT std::ios::sync_with_stdio(false);std::cin.tie(0)
//
double EPS = 1e-10;
//
double add(double a, double b) {
if (abs(a + b) < EPS*(abs(a) + abs(b)))return 0;
return a + b;
}
//Point
struct Point {
double x, y;
Point() {}
Point(double x, double y) :x(x), y(y) {
}
Point operator + (Point p) {
return Point(add(x, p.x), add(y, p.y));
}
Point operator - (Point p) {
return Point(add(x, -p.x), add(y, -p.y));
}
Point operator * (double d) {
return Point(x*d, y*d);
}
Point operator / (double d) {
return Point(x / d, y / d);
}
//
double dot(Point p) {
return add(x*p.x, y*p.y);
}
//
double det(Point p) {
return add(x*p.y, -y*p.x);
}
//
bool operator <(const Point &p)const {
if (fabs(add(x, -p.x)) < EPS)return y < p.y;
return x < p.x;
}
bool operator ==(const Point &p)const {
return fabs(x - p.x) < EPS&&fabs(y - p.y) < EPS;
}
};
//使
typedef Point Vector;
//2
double norm(Vector p) {
return p.x*p.x + p.y*p.y;
}
//
double abs(Vector p) {
return sqrt(norm(p));
}
//
struct Segment {
Point p1, p2;
};
//
typedef Segment Line;
//c,r
struct Circle {
Point c;
double r;
Circle(Point c = Point(), double r = 0.0) :c(c), r(r) {}
};
//
typedef vector<Point> Polygon;
//
typedef vector<Point> Points;
//
//CCW
static const int COUNTER_CLOCKWISE = 1;
static const int CLOCKWISE = -1;
static const int ONLINE_BACK = 2;
static const int ONLINE_FRONT = -2;
static const int ON_SEGMENT = 0;
int ccw(Point p0, Point p1, Point p2) {
Vector a = p1 - p0;
Vector b = p2 - p0;
if (a.det(b) > EPS)return COUNTER_CLOCKWISE;
if (a.det(b) < -EPS)return CLOCKWISE;
if (a.dot(b) < -EPS)return ONLINE_BACK;
if (norm(a) < norm(b))return ONLINE_FRONT;
return ON_SEGMENT;
}
//p1p2p3p4
bool intersect(Point p1, Point p2, Point p3, Point p4) {
return (ccw(p1, p2, p3)*ccw(p1, p2, p4) <= 0 && ccw(p3, p4, p1)*ccw(p3, p4, p2) <= 0);
}
bool intersect(Segment s1, Segment s2) {
return intersect(s1.p1, s1.p2, s2.p1, s2.p2);
}
static const int ICC_SEPERATE = 4;
static const int ICC_CIRCUMSCRIBE = 3;
static const int ICC_INTERSECT = 2;
static const int ICC_INSCRIBE = 1;
static const int ICC_CONTAIN = 0;
//
int intersect(Circle c1, Circle c2) {
if (c1.r<c2.r) swap(c1, c2);
double d = abs(c1.c - c2.c);
double r = c1.r + c2.r;
if (d == r) return ICC_CIRCUMSCRIBE;
if (d>r) return ICC_SEPERATE;
if (d + c2.r== c1.r) return ICC_INSCRIBE;
if (d + c2.r<c1.r) return ICC_CONTAIN;
return ICC_INTERSECT;
}
//a,b
bool isOrthogonal(Vector a, Vector b) {
return a.dot(b) == 0.0;
}
bool isOrthogonal(Point a1, Point a2, Point b1, Point b2) {
return isOrthogonal(a1 - a2, b1 - b2);
}
bool isOrthogonal(Segment s1, Segment s2) {
return (s1.p2 - s1.p1).dot(s2.p2 - s2.p1) == 0.0;
}
//a,b
bool isParallel(Vector a, Vector b) {
return a.det(b) == 0.0;
}
bool isParallel(Point a1, Point a2, Point b1, Point b2) {
return isParallel(a1 - a2, b1 - b2);
}
bool isParallel(Segment s1, Segment s2) {
return (s1.p2 - s1.p1).det(s2.p2 - s2.p1) == 0.0;
}
//(p1p2px)
Point project(Segment s, Point p) {
Vector base = s.p2 - s.p1;
double r = (p - s.p1).dot(base) / norm(base);
return s.p1 + base*r;
}
//(p1p2px)
Point reflect(Segment s, Point p) {
return p + (project(s, p) - p)*2.0;
}
//ab
double getDistance(Point a, Point b) {
return abs(a - b);
}
//lp
double getDistanceLP(Line l, Point p) {
return abs((l.p2 - l.p1).det(p - l.p1) / abs(l.p2 - l.p1));
}
//sp
double getDistanceSP(Segment s, Point p) {
if ((s.p2 - s.p1).dot(p - s.p1) < 0.0)return abs(p - s.p1);
if ((s.p1 - s.p2).dot(p - s.p2) < 0.0)return abs(p - s.p2);
return getDistanceLP(s, p);
}
//s1s2
double getDistance(Segment s1, Segment s2) {
if (intersect(s1, s2))return 0.0;
return min({ getDistanceSP(s1, s2.p1), getDistanceSP(s1, s2.p2), getDistanceSP(s2, s1.p1), getDistanceSP(s2, s1.p2) });
}
//s1s2
Point getCrossPoint(Segment l, Segment m) {
double d1 = (l.p2 - l.p1).det( m.p2 - m.p1);
double d2 = (l.p2 - l.p1).det( l.p2 - m.p1);
if (abs(d1) < EPS && abs(d2) < EPS) return m.p1;
return m.p1 + (m.p2 - m.p1) * d2 / d1;
}
//cl
pair<Point, Point>getCrossPoints(Circle c, Line l) {
Vector pr = project(l, c.c);
Vector e = (l.p2 - l.p1) / abs(l.p2 - l.p1);
double base = sqrt(c.r*c.r - norm(pr - c.c));
return make_pair(pr + e*base, pr - e*base);
}
//c1c2
double arg(Vector p) { return atan2(p.y, p.x); }
Vector polar(double a, double r) { return Point(cos(r)*a, sin(r)*a); }
pair<Point, Point>getCrossPoints(Circle c1, Circle c2) {
double d = abs(c1.c - c2.c);
double a = acos((c1.r*c1.r + d*d - c2.r*c2.r) / (2 * c1.r*d));
double t = arg(c2.c - c1.c);
return make_pair(c1.c + polar(c1.r, t + a), c1.c + polar(c1.r, t - a));
}
//pc
pair< Point, Point > tangent( Circle c1, Point p2) {
pair<Point, Point> d = getCrossPoints(c1, Circle(p2, sqrt(norm(c1.c - p2) - c1.r * c1.r)));
return minmax(d.first, d.second);
}
// 0:in,1:on,2:out
int contains(Polygon g, Point p) {
int n = g.size();
bool x = false;
for (int i = 0; i < n; i++) {
Point a = g[i] - p, b = g[(i + 1) % n] - p;
if (abs(a.det(b)) < EPS&&a.dot(b) < EPS) return 1;
if (a.y > b.y)swap(a, b);
if (a.y < EPS&&EPS < b.y&&EPS < a.det(b))x = !x;
}
return (x ? 2 : 0);
}
//(!=CLOCKWISE==COUNTER_CLOCKWISE)
Polygon convex_hull(Polygon s) {
Polygon u, l;
if (s.size() <= 2)return s;
sort(s.begin(), s.end(), [](const Point &p1, const Point &p2) {return p1.y == p2.y ? p1.x<p2.x : p1.y<p2.y; });
u.push_back(s[0]);
u.push_back(s[1]);
l.push_back(s[s.size() - 1]);
l.push_back(s[s.size() - 2]);
for (int i = 2; i < (int)s.size(); i++){
for (int n = u.size(); n >= 2 && ccw(u[n - 2], u[n - 1], s[i]) != CLOCKWISE&&ccw(u[n - 2], u[n - 1], s[i]) != ONLINE_FRONT; n--){
u.pop_back();
}
u.push_back(s[i]);
}
for (int i = s.size() - 3; i >= 0; i--){
for (int n = l.size(); n >= 2 && ccw(l[n - 2], l[n - 1], s[i]) != CLOCKWISE&&ccw(l[n - 2], l[n - 1], s[i]) != ONLINE_FRONT; n--){
l.pop_back();
}
l.push_back(s[i]);
}
reverse(l.begin(), l.end());
for (int i = u.size() - 2; i >= 1; i--)l.push_back(u[i]);
return l;
}
//y
bool compare_y(Point a, Point b) {
return a.y < b.y;
}
//
double closest_pair(Point *a, int n) {
if (n <= 1)return INF<double>();
sort(a, a + n);
int m = n / 2;
double x = a[m].x;
double d = min({ closest_pair(a,m),closest_pair(a + m,n - m) });//p,q
inplace_merge(a, a + m, a + n, compare_y);//2
//p,q
Points b;//d
for (int i = 0; i < n; i++) {
if (add(fabs(add(a[i].x, -x)), -d) >= 0.0)continue;
//byd
for (int j = 0; j < (int)b.size(); j++) {
Point dd;
dd.x = add(a[i].x, -b[b.size() - j - 1].x);
dd.y = add(a[i].y, -b[b.size() - j - 1].y);
if (add(dd.y, -d) >= 0.0)break;
d = min(d, abs(dd));
}
b.emplace_back(a[i]);
}
return d;
}
//
double area(Polygon p) {
int n = p.size();
double sum = 0.0;
for (int i = 0; i < n; i++) {
sum = add(sum,0.5*p[i].det(p[(i + 1) % n]));
}
return sum < 0.0 ? -sum : sum;
}
//
bool is_convex(Polygon p) {
for (int i = 0; i < (int)p.size(); i++) {
if (ccw(p[(i - 1 + p.size()) % p.size()], p[i], p[(i + 1) % p.size()]) == -1)return false;
}
return true;
}
//
Polygon convex_cut(Polygon p, Line l) {
Polygon ret;
for (int i = 0; i < (int)p.size(); i++) {
Point cur = p[i], nxt = p[(i + 1) % p.size()];
if (ccw(l.p1, l.p2, cur) != -1)ret.emplace_back(cur);
if (ccw(l.p1, l.p2, cur)*ccw(l.p1, l.p2, nxt) < 0) {
Segment seg;
seg.p1 = cur;
seg.p2 = nxt;
ret.emplace_back(getCrossPoint(seg, l));
}
}
return ret;
}
//
# define BOTTOM 0
# define LEFT 1
# define RIGHT 2
# define TOP 3
class EndPoint {
public:
Point p;
int seg, st;//ID,
EndPoint() {}
EndPoint(Point p, int seg, int st) :p(p), seg(seg), st(st) {}
bool operator <(const EndPoint &ep)const {
//y
if (p.y == ep.p.y) {
return st < ep.st;//y調
}
else {
return p.y < ep.p.y;
}
}
};
EndPoint EP[202020];//
//
int ManhattanIntersection(vector<Segment> s) {
int n = s.size();
for (int i = 0, k = 0; i < n; i++) {
//p1,p2調
if (s[i].p1.y == s[i].p2.y) {
if(s[i].p1.x>s[i].p2.x)swap(s[i].p1, s[i].p2);
}
else if (s[i].p1.y > s[i].p2.y)swap(s[i].p1, s[i].p2);
if (s[i].p1.y == s[i].p2.y) {//
EP[k++] = EndPoint(s[i].p1, i, LEFT);
EP[k++] = EndPoint(s[i].p2, i, RIGHT);
}
else {//
EP[k++] = EndPoint(s[i].p1, i, BOTTOM);
EP[k++] = EndPoint(s[i].p2, i, TOP);
}
}
sort(EP, EP + 2 * n);//y
set<LL> bt;//
bt.insert(1010101010);
int cnt = 0;
for (int i = 0; i < 2 * n; i++) {
if (EP[i].st == TOP) {
bt.erase(EP[i].p.x);//
}
else if (EP[i].st == BOTTOM) {
bt.insert(EP[i].p.x);
}
else if (EP[i].st == LEFT) {
set<LL>::iterator b = bt.lower_bound(s[EP[i].seg].p1.x);
set<LL>::iterator e = bt.upper_bound(s[EP[i].seg].p2.x);
cnt += distance(b, e);//be
}
}
return cnt;
}
int n, m;
char c[101][101];
int vis[101][101];
int main(){
cin >> n >> m;
REP(i, n)REP(j, m)cin >> c[i][j];
pair<int, int> s = make_pair(INF<int>(), INF<int>());
REP(i, n)REP(j, m)if(c[i][j] == '.')s = min(s, make_pair((int)i, (int)j));
int idx = 0, y = s.first, x = s.second;
int cntr = 0, cntl = 0;
auto isvalid = [&](int y, int x) -> bool {
return 0 <= y && y < n && 0 <= x && x < m && c[y][x] == '.';
};
while(true){
while(isvalid(y + dy[idx], x + dx[idx])){
y += dy[idx];
x += dx[idx];
c[y][x] = '#';
}
int ld = (idx + 3) % 4;
int rd = (idx + 1) % 4;
if(isvalid(y + dy[ld], x + dx[ld])){
idx = ld;
cntl++;
}else if(isvalid(y + dy[rd], x + dx[rd])){
idx = rd;
cntr++;
}else{
break;
}
}
int cnt = 0;
REP(i, n)REP(j, m)if(c[i][j] == '.')cnt++;
if(min(cntl, cntr) <= 1 && cnt == 0){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0