Submission #1199396

#TimeUsernameProblemLanguageResultExecution timeMemory
1199396randnt93Foehn Phenomena (JOI17_foehn_phenomena)C++20
30 / 100
1095 ms2444 KiB
#include <stdio.h> #include <stdlib.h> #include <set> #include <map> #include <list> #include <queue> #include <bitset> #include <vector> #include <climits> #include <algorithm> using namespace std; #define int long long #define uint unsigned int #define inf ULLONG_MAX const uint blksize = 2000; struct block { uint s; int* a; int v, pv; }; int calc(uint blkc, struct block* blocks, uint S, uint T) { #ifdef __DEBUG for (uint x = 0; x < blkc; x++) { printf("Block ID: %llu\n", x); printf("\t%lld", blocks[x].a[0]); for (uint i = 1; i < blocks[x].s; i++) printf(" %lld", blocks[x].a[i]); printf("\n"); printf("\tv = %lld, pv = %lld\n", blocks[x].v, blocks[x].pv); } #endif int pv = blocks[0].pv; for (uint b = 1; b < blkc; b++) { pv += blocks[b].pv; int r = blocks[b].a[0] + blocks[b].v, l = blocks[b - 1].a[blocks[b - 1].s - 1] + blocks[b - 1].v; if (r > l) pv -= S * (r - l); else pv += T * (l - r); } return pv; } void update_block(struct block& block, uint S, uint T, uint l, uint r, int v) { if (l == 0 && r == block.s - 1) { block.v += v; return; } if (l == 0) block.a[l++] += v; for (; l <= r; l++) block.a[l] += v; l = 1, block.pv = 0; for (; l < block.s; l++) { if (block.a[l] > block.a[l - 1]) block.pv -= S * (block.a[l] - block.a[l - 1]); else block.pv += T * (block.a[l - 1] - block.a[l]); } } signed main() { uint N, Q, S, T; scanf("%llu%llu%llu%llu", &N, &Q, &S, &T); const uint blkc = ((N + 1) / blksize) + ((N + 1) % blksize > 0); struct block blocks[blkc]; uint n = N + 1; for (uint x = 0; x < blkc; x++) { blocks[x].s = min(blksize, n); blocks[x].a = (int*)malloc(blocks[x].s * sizeof(int)); blocks[x].pv = 0, blocks[x].v = 0; scanf("%lld", &blocks[x].a[0]); for (uint i = 1; i < blocks[x].s; i++) { scanf("%lld", &blocks[x].a[i]); if (blocks[x].a[i] > blocks[x].a[i - 1]) blocks[x].pv -= (int)S * (blocks[x].a[i] - blocks[x].a[i - 1]); else blocks[x].pv += (int)T * (blocks[x].a[i - 1] - blocks[x].a[i]); } n -= min(blksize, n); } while (Q--) { uint l, r; int v; scanf("%llu%llu%lld", &l, &r, &v); uint sbid = l / blksize; uint ebid = r / blksize; if (sbid == ebid) update_block(blocks[sbid], S, T, l % blksize, r % blksize, v); else { update_block(blocks[sbid++], S, T, l % blksize, blksize - 1, v); for (; sbid < ebid; sbid++) update_block(blocks[sbid], S, T, 0, blksize - 1, v); update_block(blocks[ebid], S, T, 0, r % blksize, v); } printf("%lld\n", calc(blkc, blocks, S, T)); } }

Compilation message (stderr)

foehn_phenomena.cpp: In function 'int main()':
foehn_phenomena.cpp:75:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |   scanf("%llu%llu%llu%llu", &N, &Q, &S, &T);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foehn_phenomena.cpp:86:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |     scanf("%lld", &blocks[x].a[0]);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
foehn_phenomena.cpp:88:12: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |       scanf("%lld", &blocks[x].a[i]);
      |       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
foehn_phenomena.cpp:99:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |     scanf("%llu%llu%lld", &l, &r, &v);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...