Submission #54251

#TimeUsernameProblemLanguageResultExecution timeMemory
54251baactreePyramid Base (IOI08_pyramid_base)C++17
70 / 100
5050 ms55604 KiB
#include <bits/stdc++.h> using namespace std; namespace fio { const int BSIZE = 524288; unsigned char buffer[BSIZE]; auto p = buffer + BSIZE; inline unsigned char readChar() { if (p == buffer + BSIZE) { fread(buffer, 1, BSIZE, stdin); p = buffer; } return *p++; } int readInt() { unsigned char c = readChar(); while (c < '-') { c = readChar(); } int ret = 0; while (c >= '-') { ret = ret * 10 + c - '0'; c = readChar(); } return ret; } } int tree[1 << 21][2]; void update(int le, int ri, int val, int nodele, int noderi, int node) { if (le > noderi || ri < nodele)return; if (le <= nodele && noderi <= ri) { tree[node][0] += val; tree[node][1] += val; return; } int mid = (nodele + noderi) / 2; update(le, ri, val, nodele, mid, node * 2); update(le, ri, val, mid + 1, noderi, node * 2 + 1); tree[node][0] = min(tree[node * 2][0], tree[node * 2 + 1][0])+tree[node][1]; } void init(int nodele, int noderi, int node) { tree[node][0] = tree[node][1] = 0; if (nodele == noderi) return; int mid = (nodele + noderi) / 2; init(nodele, mid, node * 2); init(mid + 1, noderi, node * 2 + 1); } int n, m, b, p; vector<tuple<int, int, int> > vec[1000005]; bool possi(int k) { init(1, m - k + 1, 1); for (int i = 1; i <= n; i++) { for (auto v : vec[i]) { int y1, y2, c; tie(y1, y2, c) = v; if (c > 0) update(max(1, y1 - k + 1), min(m - k + 1, y2), c, 1, m - k + 1, 1); } if (i >= k) { for (auto v : vec[i - k]) { int y1, y2, c; tie(y1, y2, c) = v; if (c < 0) update(max(1, y1 - k + 1), min(m - k + 1, y2), c, 1, m - k + 1, 1); } } if (i >= k && tree[1][0] <= b) return true; } return false; } int main() { //scanf("%d%d%d%d", &n, &m, &b, &p); n = fio::readInt(); m = fio::readInt(); b = fio::readInt(); p = fio::readInt(); for (int i = 0; i < p; i++) { int x1, y1, x2, y2, c; //scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c); x1 = fio::readInt(); y1 = fio::readInt(); x2 = fio::readInt(); y2 = fio::readInt(); c = fio::readInt(); vec[x1].emplace_back(y1, y2, b ? c : 1); vec[x2].emplace_back(y1, y2, b ? -c : -1); } int le, ri, ans, mid; le = 1; ri = m; ans = 0; while (le <= ri) { mid = (le + ri) / 2; if (possi(mid)) { ans = mid; le = mid + 1; } else ri = mid - 1; } printf("%d\n", ans); return 0; }

Compilation message (stderr)

pyramid_base.cpp: In function 'unsigned char fio::readChar()':
pyramid_base.cpp:9:9: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
    fread(buffer, 1, BSIZE, 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...
#Verdict Execution timeMemoryGrader output
Fetching results...