Submission #54208

#TimeUsernameProblemLanguageResultExecution timeMemory
54208baactreePyramid Base (IOI08_pyramid_base)C++17
35 / 100
3947 ms58952 KiB
#include <bits/stdc++.h> using namespace std; namespace fio { const int BSIZE = 1 << 17; 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; } } typedef long long ll; ll tree[1 << 21][2]; const ll inf = 0x3f3f3f3f3f3f3f3f; void push(int nodele, int noderi, int node) { tree[node][0] += tree[node][1]; if (nodele != noderi) { tree[node * 2][1] += tree[node][1]; tree[node * 2 + 1][1] += tree[node][1]; } tree[node][1] = 0; } void update(int le, int ri, ll val, int nodele, int noderi, int node) { if (tree[node][1])push(nodele, noderi, node); if (le > noderi || ri < nodele)return; if (le <= nodele && noderi <= ri) { tree[node][1] = val; push(nodele, noderi, node); 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]); } ll query(int le, int ri, int nodele, int noderi, int node) { if (tree[node][1])push(nodele, noderi, node); if (le > noderi || ri < nodele)return inf; if (le <= nodele && noderi <= ri)return tree[node][0]; int mid = (nodele + noderi) / 2; return min(query(le, ri, nodele, mid, node * 2), query(le, ri, mid + 1, noderi, node * 2 + 1)); } int n, m, b, p; vector<tuple<int, int, int> > vec[1000005]; int btree[1000005]; void bupdate(int idx, int val,int k) { while (idx <= m - k + 1) { btree[idx] += val; idx += idx & (-idx); } } int bquery(int idx) { int ret = 0; while (idx) { ret += btree[idx]; idx -= idx & (-idx); } return ret; } bool possi(int k) { if(b)memset(tree, 0, sizeof(tree)); else { for (int i = 1; i <= m - k + 1; i++) btree[i] = 0; } for (int i = 1; i <= n; i++) { for (auto v : vec[i]) { int y1, y2, c; tie(y1, y2, c) = v; if (c > 0) { if (b)update(max(1, y1 - k + 1), min(m - k + 1, y2), c, 1, m - k + 1, 1); else { bupdate(max(1, y1 - k + 1), 1, k); bupdate(min(m - k + 1, y2) + 1, -1, k); } } } if (i >= k) { for (auto v : vec[i - k]) { int y1, y2, c; tie(y1, y2, c) = v; if (c < 0) { if (b)update(max(1, y1 - k + 1), min(m - k + 1, y2), c, 1, m - k + 1, 1); else { bupdate(max(1, y1 - k + 1), 1, k); bupdate(min(m - k + 1, y2) + 1, -1, k); } } } } if (i >= k && (b ? query(1, m - k + 1, 1, m - k + 1, 1) <= b : bquery(m - k + 1) == m - k + 1)) 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...