marat_snowbear

Untitled

Jun 29th, 2015
479
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1. #include "assert.h"
  2. #include <algorithm>
  3. #include <bitset>
  4. #include <cctype>
  5. #include <cmath>
  6. #include <cstdio>
  7. #include <deque>
  8. #include <functional>
  9. #include <iomanip>
  10. #include <iostream>
  11. #include <map>
  12. #include <queue>
  13. #include <set>
  14. #include <sstream>
  15. #include <stack>
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string>
  19. #include <string.h>
  20. #include <time.h>
  21. #include <vector>
  22.  
  23. #if LOCAL
  24.     #define DO_NOT_SEND
  25. #endif
  26.  
  27. typedef long long LL;
  28.  
  29. int IntMaxVal = (int) 1e20;
  30. int IntMinVal = (int) -1e20;
  31. LL LongMaxVal = (LL) 1e20;
  32. LL LongMinVal = (LL) -1e20;
  33.  
  34. #define FOR(i, a, b) for(int i = a; i < b ; ++i)
  35. #define FORD(i, a, b) for(int i = a; i >= b; --i)
  36.  
  37. template<typename T> inline void minimize(T &a, T b) { a = std::min(a, b); }
  38. template<typename T> inline void maximize(T &a, T b) { a = std::max(a, b); }
  39.  
  40. #define all(v) v.begin(),v.end()
  41.  
  42. using namespace std;
  43.  
  44. #define endl '\n'
  45. template<typename T> struct argument_type;
  46. template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
  47. #define next(t, i) argument_type<void(t)>::type i; cin >> i;
  48.  
  49. template <typename T1, typename T2> istream& operator >>(istream& is, pair<T1, T2>& s) { is >> s.first >> s.second; return is; }
  50. template <typename T> ostream& operator << (ostream& os, const vector<T> &v) { for (int i = 0 ; i < v.size() ; i++) { if (i) os << ' '; os << v[i]; } os << endl; return os; }
  51. template <typename T1, typename T2> ostream& operator <<(ostream& s, const pair<T1, T2>& t) { s << t.first << ' ' << t.second; return s; }
  52. template <typename T> vector<T> readVector(int n) { vector<T> res(n); for (int i = 0 ; i < n ; i++) cin >> res[i]; return res; }
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60. struct query
  61. {
  62.     int index, param, value;
  63. };
  64.  
  65. bool byParam(const query &x1, const query &x2) {
  66.     return x1.param < x2.param;
  67. }
  68.  
  69. bool byIndex(const query &x1, const query &x2) {
  70.     return x1.index < x2.index;
  71. }
  72.  
  73. istream& operator >> (istream& is, query &x) {
  74.     static int id = 0;
  75.     x.index = id++;
  76.     return is >> x.param;
  77. }
  78.  
  79. vector<vector<int>> colour_groups(100 * 1000 + 1);
  80. vector<query> queries;
  81.  
  82. void add_on_range(int l, int r, int val) {
  83.     queries[l].value += val;
  84.     if (r + 1 < queries.size()) queries[r + 1].value -= val;
  85. }
  86.  
  87. int solve_on_queries_range_straightforward(int c, int query_index) {
  88.     int maxLength = queries[query_index].param;
  89.     int res = 0;
  90.     int upTo = -1;
  91.     for (auto x : colour_groups[c]) if (x > upTo) {
  92.         res++;
  93.         upTo = x + maxLength;
  94.     }
  95.     return res;
  96. }
  97.  
  98. void solve_on_queries_range(int c, int l, int ans1, int r, int ans2) {
  99.     if (l + 1 >= r) return;
  100.     if (ans1 == ans2) {
  101.         add_on_range(l + 1, r - 1, ans1);
  102.     } else {
  103.         int mid = (l + r) / 2;
  104.         int ans_mid = solve_on_queries_range_straightforward(c, mid);
  105.         add_on_range(mid, mid, ans_mid);
  106.         solve_on_queries_range(c, l, ans1, mid, ans_mid);
  107.         solve_on_queries_range(c, mid, ans_mid, r, ans2);
  108.     }
  109. }
  110.  
  111. int main() {
  112.     ios_base::sync_with_stdio(false); cin.tie(NULL);
  113.    
  114.     next(int, n);
  115.     auto v = readVector<int>(n);
  116.  
  117.     FOR (i, 0, n) colour_groups[v[i]].push_back(i);
  118.  
  119.     next(int, q);
  120.     queries = readVector<query>(q);
  121.  
  122.     sort(all(queries), byParam);
  123.     FOR (c, 1, colour_groups.size()) {
  124.         int ans1 = solve_on_queries_range_straightforward(c, 0);
  125.         int ans2 = solve_on_queries_range_straightforward(c, q - 1);
  126.         add_on_range(0, 0, ans1);
  127.         if (q > 1) add_on_range(q - 1, q - 1, ans2);
  128.         solve_on_queries_range(c, 0, ans1, q - 1, ans2);
  129.     }
  130.     FOR (i, 1, q) queries[i].value += queries[i - 1].value;
  131.     sort(all(queries), byIndex);
  132.     for (auto &q : queries) cout << q.value << ' ';
  133. }
Advertisement
Add Comment
Please, Sign In to add comment