Submission #56229

#TimeUsernameProblemLanguageResultExecution timeMemory
56229aome팀들 (IOI15_teams)C++17
77 / 100
4034 ms143852 KiB
#include "teams.h" #include <bits/stdc++.h> using namespace std; const int N = 5000005; const int M = 1005; int n; int ver[N]; int g[M], h[M], f[M][M]; vector< pair<int, int> > seg; struct SegmentTree { struct Node { int cnt, l, r; }; int num; Node T[20 * N]; #define mid ((l + r) >> 1) void build(int i, int l, int r) { if (l == r) return; T[i].l = ++num; build(T[i].l, l, mid); T[i].r = ++num; build(T[i].r, mid + 1, r); } void upd(int i, int j, int l, int r, int p) { T[j].cnt = T[i].cnt + 1; if (l == r) return; if (mid >= p) { T[j].l = ++num, T[j].r = T[i].r; upd(T[i].l, T[j].l, l, mid, p); } else { T[j].l = T[i].l, T[j].r = ++num; upd(T[i].r, T[j].r, mid + 1, r, p); } } int get(int i, int l, int r, int L, int R) { if (l > R || L > r) return 0; if (L <= l && r <= R) return T[i].cnt; return get(T[i].l, l, mid, L, R) + get(T[i].r, mid + 1, r, L, R); } #undef mid } IT; void init(int _n, int A[], int B[]) { n = _n; for (int i = 0; i < n; ++i) { seg.push_back({A[i], B[i]}); } sort(seg.begin(), seg.end()); IT.build(0, 1, n); for (int i = 0; i < n; ++i) { ver[i + 1] = ++IT.num; IT.upd(ver[i], ver[i + 1], 1, n, seg[i].second); } } int can(int m, int K[]) { // cout << "#query\n"; sort(K, K + m); vector< pair<int, int> > vec; for (int i = 0; i < m; ++i) { int j = i; while (j < m && K[j] == K[i]) j++; vec.push_back({K[i], j - i}), i = j - 1; } int sz = vec.size(); for (int i = 0; i < sz; ++i) { h[i] = 0; g[i] = lower_bound(seg.begin(), seg.end(), make_pair(vec[i].first + 1, 0)) - seg.begin(); } for (int i = 0; i < sz; ++i) { for (int j = i; j < (sz - 1); ++j) { f[i][j] = IT.get(ver[g[i]], 1, n, vec[j].first, vec[j + 1].first - 1); } f[i][sz - 1] = IT.get(ver[g[i]], 1, n, vec[sz - 1].first, n); // cout << g[i] << '\n'; // for (int j = i; j < sz; ++j) cout << f[i][j] << ' '; // cout << '\n'; } bool fail = 0; for (int i = 0; i < sz; ++i) { int need = vec[i].second * vec[i].first; for (int j = i; j < sz; ++j) { f[i][j] -= h[j]; int tmp = min(need, f[i][j]); h[j] += tmp, need -= tmp; } if (need) fail = 1; } return !fail; }

Compilation message (stderr)

teams.cpp: In function 'int can(int, int*)':
teams.cpp:77:19: warning: conversion to 'int' from 'std::vector<std::pair<int, int> >::size_type {aka long unsigned int}' may alter its value [-Wconversion]
  int sz = vec.size();
           ~~~~~~~~^~
teams.cpp:80:78: warning: conversion to 'int' from '__gnu_cxx::__normal_iterator<std::pair<int, int>*, std::vector<std::pair<int, int> > >::difference_type {aka long int}' may alter its value [-Wconversion]
   g[i] = lower_bound(seg.begin(), seg.end(), make_pair(vec[i].first + 1, 0)) - seg.begin();
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...