제출 #540384

#제출 시각아이디문제언어결과실행 시간메모리
540384alextodoranNuclearia (CEOI15_nuclearia)C++17
100 / 100
990 ms538532 KiB
/** ____ ____ ____ ____ ____ ||a |||t |||o |||d |||o || ||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\| **/ #include <bits/stdc++.h> #pragma GCC optimize ("O3,Ofast,fast-math,unroll-loops") #pragma GCC target ("avx2,tune=native") using namespace std; typedef long long ll; const int N_MAX = 2500000; const int BUFFER_SIZE = 40000; char buffer[BUFFER_SIZE]; int bpos = BUFFER_SIZE - 1; char read_char () { bpos++; if(bpos == BUFFER_SIZE) { fread(buffer, sizeof(char), BUFFER_SIZE, stdin); bpos = 0; } return buffer[bpos]; } bool isDigit[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int read_int () { int ans = 0; char c; while(isDigit[c = read_char()]) { ans = ans * 10 + c - '0'; } return ans; } ll** mat; ll** UL; ll** UR; ll** DL; ll** DR; ll U[N_MAX + 2]; ll D[N_MAX + 2]; ll L[N_MAX + 2]; ll R[N_MAX + 2]; int N, M; void addUL (int x, int y, int len, int val) { mat[1][1] += (ll) val * max(0, len - max(x, y)); DR[x][y] += val; if (x - len + 1 >= 1 && y - len + 1 >= 1) { DR[x - len][y - len] -= val; } else { int mn = min(x, y) - 1; x -= mn; y -= mn; DR[x - 1][y - 1] -= val; len -= mn; if (y == 1) { D[x - 1] += val; if (x - len >= 1) { D[x - len] -= val; } } else if (x == 1) { R[y - 1] += val; if (y - len >= 1) { R[y - len] -= val; } } } } void addUR (int x, int y, int len, int val) { DL[x][y] += val; if (x - len + 1 >= 1 && y + len - 1 <= M) { DL[x - len][y + len] -= val; } else { int mn = min(x, M - y + 1) - 1; x -= mn; y += mn; DL[x - 1][y + 1] -= val; len -= mn; if (x == 1) { L[y + 1] += val; if (y + len <= M) { L[y + len] -= val; } } } } void addDL (int x, int y, int len, int val) { UR[x][y] += val; if (x + len - 1 <= N && y - len + 1 >= 1) { UR[x + len][y - len] -= val; } else { int mn = min(N - x + 1, y) - 1; x += mn; y -= mn; UR[x + 1][y - 1] -= val; len -= mn; if (y == 1) { U[x + 1] += val; if (x + len <= N) { U[x + len] -= val; } } } } void addDR (int x, int y, int len, int val) { UL[x][y] += val; if (x + len <= N && y + len <= M) { UL[x + len][y + len] -= val; } } void add (int x, int y, int len, int val) { int x1 = x - len + 1, y1 = y - len + 1; int x2 = x + len - 1, y2 = y + len - 1; x1 = max(1, x1); y1 = max(1, y1); x2 = min(N, x2); y2 = min(M, y2); mat[x1][y1] += val; mat[x1][y2 + 1] -= val; mat[x2 + 1][y1] -= val; mat[x2 + 1][y2 + 1] += val; } int main () { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); N = read_int(); M = read_int(); mat = new ll*[N + 2]; UL = new ll*[N + 2]; UR = new ll*[N + 2]; DL = new ll*[N + 2]; DR = new ll*[N + 2]; for (int i = 0; i <= N + 1; i++) { mat[i] = new ll[M + 2]; UL[i] = new ll[M + 2]; UR[i] = new ll[M + 2]; DL[i] = new ll[M + 2]; DR[i] = new ll[M + 2]; for (int j = 0; j <= M + 1; j++) { mat[i][j] = 0; UL[i][j] = 0; UR[i][j] = 0; DL[i][j] = 0; DR[i][j] = 0; } } int K; K = read_int(); while (K--) { int x, y, a, b; x = read_int(); y = read_int(); a = read_int(); b = read_int(); int len = a / b; addUL(x, y, len, +b); addUR(x, y + 1, len, -b); addDL(x + 1, y, len, -b); addDR(x + 1, y + 1, len, +b); add(x, y, len + 1, a % b); } for (int i = 1; i <= N; i++) { U[i] += U[i - 1]; mat[i][1] += U[i]; } for (int i = N; i >= 1; i--) { D[i] += D[i + 1]; mat[i][1] += D[i]; } for (int j = 1; j <= M; j++) { L[j] += L[j - 1]; mat[1][j] += L[j]; } for (int j = M; j >= 1; j--) { R[j] += R[j + 1]; mat[1][j] += R[j]; } for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { UL[i][j] += UL[i - 1][j - 1]; UR[i][j] += UR[i - 1][j + 1]; } } for (int i = N; i >= 1; i--) { for (int j = M; j >= 1; j--) { DL[i][j] += DL[i + 1][j - 1]; DR[i][j] += DR[i + 1][j + 1]; } } for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { mat[i][j] += UL[i][j]; mat[i][j] += UR[i][j]; mat[i][j] += DL[i][j]; mat[i][j] += DR[i][j]; mat[i][j] += mat[i - 1][j] + mat[i][j - 1] - mat[i - 1][j - 1]; } } for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { mat[i][j] += mat[i - 1][j] + mat[i][j - 1] - mat[i - 1][j - 1]; } } int Q = read_int(); while (Q--) { int x1, y1, x2, y2; x1 = read_int(); y1 = read_int(); x2 = read_int(); y2 = read_int(); ll sum = mat[x2][y2] - mat[x1 - 1][y2] - mat[x2][y1 - 1] + mat[x1 - 1][y1 - 1]; ll area = (ll) (x2 - x1 + 1) * (y2 - y1 + 1); ll answer = sum / area; if (sum % area >= (area + 1) / 2 && area != 1) { answer++; } cout << answer << "\n"; } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

nuclearia.cpp: In function 'int read_int()':
nuclearia.cpp:58:21: warning: array subscript has type 'char' [-Wchar-subscripts]
   58 |     while(isDigit[c = read_char()])
      |                   ~~^~~~~~~~~~~~~
nuclearia.cpp: In function 'char read_char()':
nuclearia.cpp:30:14: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |         fread(buffer, sizeof(char), BUFFER_SIZE, stdin);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...