結果

問題 No.274 The Wall
ユーザー uetsu840
提出日時 2019-12-09 23:34:07
言語 C++11
(gcc 13.3.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 12,266 bytes
コンパイル時間 1,171 ms
コンパイル使用メモリ 101,716 KB
最終ジャッジ日時 2025-01-25 17:58:27
合計ジャッジ時間 2,004 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp:19:16: error: ‘uint64_t’ does not name a type
   19 | using QWORD  = uint64_t;
      |                ^~~~~~~~
main.cpp:17:1: note: ‘uint64_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
   16 | #include <list>
  +++ |+#include <cstdint>
   17 | using namespace std;
main.cpp:21:16: error: ‘uint32_t’ does not name a type
   21 | using DWORD  = uint32_t;
      |                ^~~~~~~~
main.cpp:21:16: note: ‘uint32_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
main.cpp:23:16: error: ‘uint16_t’ does not name a type
   23 | using WORD   = uint16_t;
      |                ^~~~~~~~
main.cpp:23:16: note: ‘uint16_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
main.cpp:25:16: error: ‘uint8_t’ does not name a type
   25 | using BYTE   = uint8_t;
      |                ^~~~~~~
main.cpp:25:16: note: ‘uint8_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
main.cpp:50:15: error: ‘QWORD’ does not name a type; did you mean ‘SWORD’?
   50 | static inline QWORD MAX(QWORD a, QWORD b) { return a > b ? a : b; }
      |               ^~~~~
      |               SWORD
main.cpp:51:15: error: ‘DWORD’ does not name a type; did you mean ‘SWORD’?
   51 | static inline DWORD MAX(DWORD a, DWORD b) { return a > b ? a : b; }
      |               ^~~~~
      |               SWORD
main.cpp:54:15: error: ‘QWORD’ does not name a type; did you mean ‘SWORD’?
   54 | static inline QWORD MIN(QWORD a, QWORD b) { return a < b ? a : b; }
      |               ^~~~~
      |               SWORD
main.cpp:55:15: error: ‘DWORD’ does not name a type; did you mean ‘SWORD’?
   55 | static inline DWORD MIN(DWORD a, DWORD b) { return a < b ? a : b; }
      |               ^~~~~
      |               SWORD
main.cpp: In function ‘DOUBLE inputFP()’:
main.cpp:146:5: error: ‘DWORD’ was not decl

ソースコード

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

#pragma GCC optimize ("O3")
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <set>
#include <algorithm>
#include <numeric>
#include <list>
using namespace std;
using QWORD = uint64_t;
using SQWORD = int64_t;
using DWORD = uint32_t;
using SDWORD = int32_t;
using WORD = uint16_t;
using SWORD = int16_t;
using BYTE = uint8_t;
using SBYTE = int8_t;
using DOUBLE = double;
using FLOAT = float;
#define MIN_SDWORD (-2147483648)
#define MAX_SDWORD (2147483647)
#define MIN_SBYTE (-128)
#define MAX_SBYTE (127)
#define MIN_SQWORD (0x8000000000000000)
#define MAX_SQWORD (0x7FFFFFFFFFFFFFFF)
#define MAX_QWORD (0xFFFFFFFFFFFFFFFF)
#define MAX_DWORD (0xFFFFFFFF)
#define MAX_WORD (0xFFFF)
#define MAX_BYTE (0xFF)
#define MAX_DOUBLE (1.0e+308)
#define DOUBLE_EPS (1.0e-12)
#define MIN_DOUBLE_N (-1.0e+308)
#define ArrayLength(a) (sizeof(a) / sizeof(a[0]))
static inline DOUBLE MAX(DOUBLE a, DOUBLE b) { return a > b ? a : b; }
static inline QWORD MAX(QWORD a, QWORD b) { return a > b ? a : b; }
static inline DWORD MAX(DWORD a, DWORD b) { return a > b ? a : b; }
static inline SDWORD MAX(SDWORD a, SDWORD b) { return a > b ? a : b; }
static inline DOUBLE MIN(DOUBLE a, DOUBLE b) { return a < b ? a : b; }
static inline QWORD MIN(QWORD a, QWORD b) { return a < b ? a : b; }
static inline DWORD MIN(DWORD a, DWORD b) { return a < b ? a : b; }
static inline SDWORD MIN(SDWORD a, SDWORD b) { return a < b ? a : b; }
#define BYTE_BITS (8)
#define WORD_BITS (16)
#define DWORD_BITS (32)
#define QWORD_BITS (64)
static inline void inputStringSpSeparated(char *pcStr)
{
char *pcCur = pcStr;
for (;;) {
char c = getchar();
if (('\n' == c) || (EOF == c) || (' ' == c)) {
break;
}
*pcCur = c;
pcCur++;
}
*pcCur = '\0';
}
static inline void inputString(char *pcStr)
{
char *pcCur = pcStr;
for (;;) {
char c = getchar();
if (('\n' == c) || (EOF == c)) {
break;
}
*pcCur = c;
pcCur++;
}
*pcCur = '\0';
}
static inline SQWORD inputSQWORD(void)
{
SQWORD sqNumber = 0;
SQWORD sqMultiplier = 1;
bool bRead = false;
for (;;) {
char c = getchar();
if (!bRead) {
if ('-' == c) {
sqMultiplier = -1;
}
}
if (('0' <= c) && (c <= '9')) {
sqNumber *= 10LL;
sqNumber += (SQWORD)(c - '0');
bRead = true;
} else {
if (bRead) {
return sqNumber * sqMultiplier;
}
}
}
}
static inline SDWORD inputSDWORD(void)
{
SDWORD lNumber = 0;
SDWORD lMultiplier = 1;
bool bRead = false;
for (;;) {
char c = getchar();
if (!bRead) {
if ('-' == c) {
lMultiplier = -1;
}
}
if (('0' <= c) && (c <= '9')) {
lNumber *= 10;
lNumber += (c - '0');
bRead = true;
} else {
if (bRead) {
return lNumber * lMultiplier;
}
}
}
}
static inline DOUBLE inputFP(void)
{
DOUBLE dInt = 0.0;
DOUBLE dFrac = 0.0;
DOUBLE dMultiplier = 1.0;
DWORD dwFpCnt = 0;
DOUBLE *pdCur = &dInt;
bool bRead = false;
for (;;) {
char c = getchar();
if (!bRead) {
if ('-' == c) {
dMultiplier = -1;
}
}
if ('.' == c) {
pdCur = &dFrac;
} else if (('0' <= c) && (c <= '9')) {
(*pdCur) *= 10;
(*pdCur) += (DOUBLE)(c - '0');
bRead = true;
if (pdCur == &dFrac) {
dwFpCnt++;
}
} else {
if (bRead) {
return dMultiplier * (dInt + dFrac / (pow((DOUBLE)10.0 , (DOUBLE)dwFpCnt)));
}
}
}
}
/*----------------------------------------------*/
/**
* mod
*/
#define ANS_MOD (1000000007)
class MODINT {
static SQWORD MOD;
SQWORD m_x;
public:
MODINT(SQWORD val) {
m_x = (val % MOD + MOD) % MOD;
};
MODINT() {
m_x = 0;
}
static void Init(SQWORD sqMod) {
MOD = sqMod;
}
MODINT& operator+= (const MODINT a)
{
m_x = (m_x + a.m_x) % MOD;
return *this;
};
MODINT& operator-= (const MODINT a)
{
m_x = (m_x - a.m_x + MOD) % MOD;
return *this;
};
MODINT& operator*= (const MODINT a)
{
m_x = (m_x * a.m_x) % MOD;
return *this;
};
MODINT pow(SQWORD t) const {
if (!t) return 1;
MODINT a = pow(t>>1);
a *= a;
if (t&1) a *= *this;
return a;
}
MODINT operator+ (const MODINT a) const {
MODINT res(*this);
return (res += a);
}
MODINT operator- (const MODINT a) const {
MODINT res(*this);
return (res -= a);
}
MODINT operator* (const MODINT a) const {
MODINT res(*this);
return (res *= a);
}
MODINT operator/ (const MODINT a) const {
MODINT res(*this);
return (res /= a);
}
/* */
MODINT inv() const {
return pow(MOD-2);
}
/* */
MODINT& operator/=(const MODINT a) {
return (*this) *= a.inv();
}
/* */
MODINT& operator+= (const SQWORD a) {*this += MODINT(a); return *this;};
MODINT& operator-= (const SQWORD a) {*this -= MODINT(a); return *this;};
MODINT& operator*= (const SQWORD a) {*this *= MODINT(a); return *this;};
MODINT& operator/= (const SQWORD a) {*this /= MODINT(a); return *this;};
SQWORD getVal() { return m_x; };
};
SQWORD MODINT::MOD = ANS_MOD;
/*----------------------------------------------*/
/*----------------------------------------------*/
struct EDGE_ST {
SQWORD sqTo;
EDGE_ST(SQWORD to) {
sqTo = to;
};
};
#define N_MAX_NODES (100000)
#define MAX_LOG_NODES (20)
class SCC_Graph {
vector<vector<EDGE_ST>> vvstEdge;
vector<vector<EDGE_ST>> vvstRevEdge;
vector<SQWORD> vsqInOrderFwd;
SQWORD sqNumNode;
vector<SQWORD> vsqOrder;
vector<SQWORD> vsqComp;
void dfs(SQWORD sqNode, vector<bool> &vbIsVisited)
{
if (vbIsVisited[sqNode]) {
return;
}
vbIsVisited[sqNode] = true;
for (auto e: vvstEdge[sqNode]) {
dfs(e.sqTo, vbIsVisited);
}
vsqOrder.emplace_back(sqNode);
}
void rdfs(SQWORD sqNode, SQWORD sqCnt, vector<vector<SQWORD>> &rnodes)
{
if (vsqComp[sqNode] != -1) {
return;
}
vsqComp[sqNode] = sqCnt;
rnodes[sqCnt].push_back(sqNode);
for(auto to : vvstRevEdge[sqNode]) {
rdfs(to.sqTo, sqCnt, rnodes);
}
}
public:
SCC_Graph(SQWORD sqN) {
sqNumNode = sqN;
vvstEdge.resize(sqNumNode + 1, vector<EDGE_ST>{});
vvstRevEdge.resize(sqNumNode + 1, vector<EDGE_ST>{});
vsqComp.resize(sqNumNode + 1, -1);
}
void RegistEdge(SQWORD sqA, SQWORD sqB)
{
vvstEdge[sqA].emplace_back(sqB);
vvstRevEdge[sqB].emplace_back(sqA);
}
SQWORD operator[](SQWORD k) {
return vsqComp[k];
}
/**
* t: 1
* rnodes:
*
* 1
*/
void Build(
vector<vector<EDGE_ST>> &t,
vector<vector<SQWORD>> &rnodes)
{
vector<bool> vIsVisitedFwd(sqNumNode, false);
vector<bool> vIsVisitedRev(sqNumNode, false);
rnodes.resize(sqNumNode + 1);
t.resize(sqNumNode + 1);
for (SQWORD sqStart = 1; sqStart < sqNumNode + 1; sqStart++) {
dfs(sqStart, vIsVisitedFwd);
}
reverse(vsqOrder.begin(), vsqOrder.end());
SQWORD ptr = 1;
for (auto rStart: vsqOrder) {
if (vsqComp[rStart] == -1) {
rdfs(rStart, ptr, rnodes);
ptr++;
}
}
rnodes.resize(ptr);
t.resize(ptr);
for(SQWORD sqNode = 1; sqNode < sqNumNode + 1; sqNode++) {
for(auto &to : vvstEdge[sqNode]) {
SQWORD sqX = vsqComp[sqNode], sqY = vsqComp[to.sqTo];
if (sqX != sqY) {
t[sqX].push_back(EDGE_ST{sqY});
}
}
}
}
};
/*----------------------------------------------*/
/*----------------------------------------------*/
#define N_MAX_BITS (60)
struct COLOR_RANGE {
SQWORD sqL;
SQWORD sqR;
};
static bool IsWallOnNml(
const COLOR_RANGE &c,
SQWORD sqM,
SQWORD sqPos)
{
// printf(" tst [%lld %lld] %lld\n", c.sqL, c.sqR, sqPos);
if ((c.sqL <= sqPos) && (sqPos <= c.sqR)) {
return true;
}
return false;
}
static bool IsWallOnRev(
const COLOR_RANGE &c,
SQWORD sqM,
SQWORD sqPos)
{
SQWORD sqRevL = (sqM - 1) - c.sqR;
SQWORD sqRevR = (sqM - 1) - c.sqL;
// printf(" revtst [%lld %lld][%lld %lld] %lld\n", c.sqR, c.sqL, sqRevL, sqRevR, sqPos);
if ((sqRevL <= sqPos) && (sqPos <= sqRevR)) {
return true;
}
return false;
}
int main(void)
{
SQWORD sqN = inputSQWORD();
SQWORD sqM = inputSQWORD();
vector<COLOR_RANGE> vstColorRange;
SQWORD sqSum = 0;
for (SQWORD sqIdx = 0; sqIdx < sqN; sqIdx++) {
SQWORD sqL = inputSQWORD();
SQWORD sqR = inputSQWORD();
vstColorRange.emplace_back(COLOR_RANGE{sqL, sqR});
sqSum += (sqR - sqL + 1);
}
if (sqM < sqSum) {
printf("NO\n");
return 0;
}
/**
* 2_SAT
* Rj : jTRUEFALSE
*
*
* ()
*
*
*
* 2*j : Rj
* 2*j+1: not Rj
*/
vector<vector<bool>> vvEdgeMatrix(sqN * 2, vector<bool>(sqN * 2, false));
for (SQWORD sqCol = 0; sqCol < sqM; sqCol++) {
vector<SQWORD> vsqConds;
for (SQWORD sqRow = 0; sqRow < sqN; sqRow++) {
if (IsWallOnNml(vstColorRange[sqRow], sqM, sqCol)) {
vsqConds.emplace_back(sqRow * 2);
}
if (IsWallOnRev(vstColorRange[sqRow], sqM, sqCol)) {
vsqConds.emplace_back(sqRow * 2 + 1);
}
}
SQWORD sqCondNum = vsqConds.size();
for (SQWORD sqIdxI = 0; sqIdxI < sqCondNum - 1; sqIdxI++) {
for (SQWORD sqIdxJ = sqIdxI + 1; sqIdxJ < sqCondNum; sqIdxJ++) {
SQWORD sqNode1 = vsqConds[sqIdxI];
SQWORD sqNode2 = vsqConds[sqIdxJ];
SQWORD sqNotNode1 = (sqNode1 % 2) ? sqNode1 - 1 : sqNode1 + 1;
SQWORD sqNotNode2 = (sqNode2 % 2) ? sqNode2 - 1 : sqNode2 + 1;
/* p1 or p2 <========> not p1 -> p2 , not p2 -> p1 */
// printf("%lld:%lld\n", sqNotNode1, sqNode2);
// printf("%lld:%lld\n", sqNotNode2, sqNode1);
vvEdgeMatrix[sqNotNode1][sqNode2] = true;
vvEdgeMatrix[sqNotNode2][sqNode1] = true;
}
}
}
SCC_Graph scc(sqN * 2);
for (SQWORD sqIdxF = 0; sqIdxF < sqN * 2; sqIdxF++) {
for (SQWORD sqIdxT = 0; sqIdxT < sqN * 2; sqIdxT++) {
if (vvEdgeMatrix[sqIdxF][sqIdxT]) {
scc.RegistEdge(sqIdxT + 1, sqIdxF + 1); /* 1 -indexed */
}
}
}
vector<vector<EDGE_ST>> vvstCompEdge;
vector<vector<SQWORD>> vvCompNodes;
scc.Build(vvstCompEdge, vvCompNodes);
for (SQWORD sqIdx = 0; sqIdx < sqN; sqIdx++) {
if (scc[sqIdx * 2 + 1] == scc[sqIdx * 2 + 2]) {
printf("NO\n");
return 0;
}
}
printf("YES\n");
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0