Submission #22098

#TimeUsernameProblemLanguageResultExecution timeMemory
22098삼*전자 그린픽스 (#42)구간들 (KRIII5P_3)C++98
7 / 7
376 ms16480 KiB
#include<stdio.h> #include<algorithm> #define M 1000000007 #define I 262144 using namespace std; typedef pair<int, int> pii; int n; int x[I]; int xl; pii a[I]; long long int tw[I]; void input() { int i, j, k, l; xl = 0; x[xl++] = 0; x[xl++] = M; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d %d", &a[i].second, &a[i].first); if (a[i].second >= a[i].first) { n--; i--; continue; } x[xl++] = a[i].first; x[xl++] = a[i].second; } sort(a, a + n); sort(x, x + xl); xl = unique(x, x + xl) - x; for (i = 0; i < n; i++) { //change first and second k = a[i].first; a[i].first = lower_bound(x, x + xl, a[i].second) - x; a[i].second = lower_bound(x, x + xl, k) - x; } tw[0] = 1; for (i = 1; i < I; i++) tw[i] = (tw[i - 1] * 2) % M; } long long int resa, resb; int ms[2 * I]; long long int md[2 * I]; long long int ml[2 * I]; int get_ms(int dep, int ql, int qr, int ll, int rr) { if (qr < ll || rr < ql) return 0; if (ql <= ll && rr <= qr) return ms[dep]; return get_ms(dep * 2, ql, qr, ll, (ll + rr) / 2) + get_ms(dep * 2 + 1, ql, qr, (ll + rr) / 2 + 1, rr); } void update_ms(int i) { i += I; ms[i]++; i /= 2; while (i > 0) { ms[i] = ms[i * 2] + ms[i * 2 + 1]; i /= 2; } } long long int get_md(int dep, int ql, int qr, int ll, int rr) { if (qr < ll || rr < ql) return 0; if (ql <= ll && rr <= qr) return (md[dep] * tw[ml[dep]])%M; if (ml[dep]) { ml[dep * 2] += ml[dep]; ml[dep * 2 + 1] += ml[dep]; md[dep] = (md[dep] * tw[ml[dep]]) % M; ml[dep] = 0; } long long int cur = (get_md(dep * 2, ql, qr, ll, (ll + rr) / 2) + get_md(dep * 2 + 1, ql, qr, (ll + rr) / 2 + 1, rr))%M; // cur = (cur * tw[ml[dep]]) % M; return cur; } void update_from_me(int dep) { int i = dep; i /= 2; while (i > 0) { long long int cur = 0; cur = (cur + md[2 * i] * tw[ml[i * 2]]) % M; cur = (cur + md[2 * i + 1] * tw[ml[i * 2 + 1]]) % M; md[i] = cur; i /= 2; } } void update_md(int dep, int ql, int qr, int ll, int rr, int k) { if (qr < ll || rr < ql) return; if (ql <= ll && rr <= qr) { ml[dep] += k; update_from_me(dep); return; } int mid = (ll + rr) / 2; update_md(dep * 2, ql, qr, ll, mid, k); update_md(dep * 2+1, ql, qr, mid+1, rr, k); } long long int func(int xi) { int i, j, k; // return 2^s0 + 2^s1 + .. +2^sx[i] - 1 long long int res = 0; //naive solution if (0) { for (i = 0; i < xi; i++) { long long int cur; long long int dist = x[i + 1] - x[i]; long long int val = get_ms(1, 0, i, 0, I - 1); cur = (dist * tw[val]) % M; res = (res + cur); } } else { res = get_md(1, 0, xi - 1, 0, I - 1); } return res; } void process() { int i, j, k, l; /* resa += (2^sq - 1) * q - { (2^sp - 1) * p (2^sp+1 - 2^sp) * (p+1) ... (2^sq-1 - 2^sq-2) * (q-1) (2^sq - 2^sq-1) * q } +q-p = 2^sp + 2^sp+! + ... + 2^sq-2 + 2^sq-1 resb += (2^sq-1 - 1) + 1 */ resa = 0; resb = 0; //init for (i = 0; i < 2 * I; i++) { ml[i] = 0; ms[i] = 0; } for (i = 0; i < xl - 1; i++) { md[i + I] = x[i + 1] - x[i]; } for (; i < I; i++) { md[i + I] = 0; } for (i = I - 1; i > 0; i--) { md[i] = (md[2 * i] + md[2 * i + 1]) % M; } long long int cura, curb; for (i = n - 1; i >= 0; i--) { cura = 0; cura = (cura + func(a[i].second)) % M; cura = (cura - func(a[i].first) + M) % M; k = get_ms(1, 0, a[i].second - 1, 0, I - 1); curb = tw[k]; resa = (resa + cura) % M; resb = (resb + curb) % M; // printf("%d %d --> %lld %lld\n", x[a[i].first], x[a[i].second], cura, curb); update_ms(a[i].first); update_md(1, a[i].first, I - 1, 0, I - 1, 1); } printf("%lld %lld\n", resa, resb); } int main() { int i, j, k, l; input(); process(); return 0; }

Compilation message (stderr)

i.cpp: In function 'void input()':
i.cpp:15:9: warning: unused variable 'j' [-Wunused-variable]
  int i, j, k, l;
         ^
i.cpp:15:15: warning: unused variable 'l' [-Wunused-variable]
  int i, j, k, l;
               ^
i.cpp: In function 'long long int func(int)':
i.cpp:102:9: warning: unused variable 'j' [-Wunused-variable]
  int i, j, k;
         ^
i.cpp:102:12: warning: unused variable 'k' [-Wunused-variable]
  int i, j, k;
            ^
i.cpp: In function 'void process()':
i.cpp:124:9: warning: unused variable 'j' [-Wunused-variable]
  int i, j, k, l;
         ^
i.cpp:124:15: warning: unused variable 'l' [-Wunused-variable]
  int i, j, k, l;
               ^
i.cpp: In function 'int main()':
i.cpp:178:6: warning: unused variable 'i' [-Wunused-variable]
  int i, j, k, l;
      ^
i.cpp:178:9: warning: unused variable 'j' [-Wunused-variable]
  int i, j, k, l;
         ^
i.cpp:178:12: warning: unused variable 'k' [-Wunused-variable]
  int i, j, k, l;
            ^
i.cpp:178:15: warning: unused variable 'l' [-Wunused-variable]
  int i, j, k, l;
               ^
i.cpp: In function 'void input()':
i.cpp:19:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
                 ^
i.cpp:21:44: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &a[i].second, &a[i].first);
                                            ^
#Verdict Execution timeMemoryGrader output
Fetching results...