Madiyar

2012-2013 neercshool 17 november Taks C

Jan 3rd, 2013
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. /*
  2.  
  3. for every current segment , I find all segments , that have common points with current.
  4. After that I joined these segments to current segment. To find fast maximum color I used Set.
  5.  
  6. */
  7. #include <iostream>
  8. #include <cstdio>
  9. #include <cstdlib>
  10. #include <cstring>
  11. #include <algorithm>
  12. #include <cmath>
  13. #include <vector>
  14. #include <map>
  15. #include <set>
  16. #include <ctime>
  17. #include <cassert>
  18. #include <queue>
  19.  
  20. using namespace std;
  21.  
  22. #define f first
  23. #define s second
  24. #define mp make_pair
  25. #define pb push_back
  26. #define forit(it,con) for (typeof(con.begin()) it = con.begin(); it != con.end(); ++it)
  27. #define f0(a) memset(a, 0, sizeof(a))
  28. #define all(v) v.begin(), v.end()
  29. #define pii pair<int,int>
  30. #define vi vector<int>
  31. #define ll long long
  32.  
  33. #ifdef WIN32
  34.     #define I64 "%I64d"
  35. #else
  36.     #define I64 "%lld"
  37. #endif
  38. const int maxn = (int)1e6;
  39. struct Tree {
  40.     int Max, flag ;
  41.     Tree() {
  42.         Max = 0, flag = -1;
  43.     }
  44. } T[maxn * 4];
  45.  
  46. struct CMPAVE {
  47.     bool operator() (const pair<ll, int> a, pair<ll, int> b) const {
  48.         double x = a.f * 1.0 / a.s;
  49.         double y = b.f * 1.0 / b.s;
  50.         return y - x > 1e-5;
  51.     }
  52. };
  53.  
  54. pair<pii, int > e[maxn];
  55. int A[maxn], An;
  56. pair<ll, int> COL[maxn];
  57. int le[maxn], ri[maxn];
  58. multiset<pair<ll, int> , CMPAVE> AVE;
  59. int p[maxn], rank[maxn];
  60. int n;
  61.  
  62. void Push(int v, int sl, int sr) {
  63.    
  64.     if (T[v].flag == -1) return;
  65.  
  66.     T[v].Max = T[v].flag;
  67.     if (sl != sr)
  68.         T[v + v].flag = T[v + v + 1].flag = T[v].flag;
  69.  
  70.     T[v].flag = -1;
  71. }
  72.  
  73. int findMax(int v, int sl, int sr, int l, int r) {
  74.     Push(v, sl, sr);
  75.  
  76.     if (min(r, sr) - max(l, sl) < 0) return 0;
  77.    
  78.     if (l <= sl && sr <= r) return T[v].Max;
  79.     int mid = (sl + sr) >> 1;
  80.     return max(findMax(v + v, sl, mid, l, r), findMax(v + v + 1, mid + 1, sr, l, r));
  81. }
  82.  
  83. void Paint(int v, int sl, int sr, int l, int r, int col) {
  84.     Push(v, sl, sr);
  85.  
  86.     if (min(sr, r) - max(sl, l) < 0) return;
  87.  
  88.     if (l <= sl && sr <= r) {
  89.         T[v].flag = col;
  90.         Push(v, sl, sr);
  91.         return;
  92.     }
  93.     int mid = (sl + sr) >> 1;
  94.     Paint(v + v, sl, mid, l, r, col);
  95.     Paint(v + v + 1, mid + 1, sr, l, r, col);
  96.     T[v].Max = max(T[v + v].Max, T[v + v + 1].Max);
  97. }
  98.  
  99. void join(int u, int v) {
  100.     int lu = le[u], ru = ri[u];
  101.     int &lv = le[v], &rv = ri[v];
  102.  
  103.     AVE.erase(AVE.find(COL[u]));
  104.     AVE.erase(AVE.find(COL[v]));
  105.  
  106.     pair<ll, int> tmp = mp(COL[u].f + COL[v].f, COL[u].s + COL[v].s);
  107.     Paint(1, 1, An, lu, ru, 0);
  108.     COL[v] = tmp;
  109.     AVE.insert(tmp);
  110.     lv = min(lv, lu);
  111.     rv = max(rv, ru);
  112. }
  113.  
  114. int main() {
  115.     freopen("painting.in","r",stdin);
  116.     freopen("painting.out","w",stdout);
  117.  
  118.     scanf("%d", &n);
  119.     for (int i = 0; i < n; ++i) {
  120.         int l, r, col;
  121.         scanf("%d%d%d", &l, &r, &col); --r;
  122.         e[i + 1] = mp(mp(l, r), col);
  123.         A[An++] = l;
  124.         A[An++] = r;
  125.     }
  126.    
  127.     sort(A, A + An);
  128.     An = unique(A, A + An) - A;
  129.    
  130.     for (int i = 1; i <= n; ++i) {
  131.         int l = lower_bound(A, A + An, e[i].f.f) - A + 1;
  132.         int r = lower_bound(A, A + An, e[i].f.s) - A + 1;
  133.            
  134.         le[i] = l; ri[i] = r;
  135.         COL[i] = mp(e[i].s, 1);
  136.         AVE.insert(COL[i]);
  137.         while (true) {
  138.             int with = findMax(1, 1, An, l, r);
  139.             if (with == 0) break;
  140.             join(with, i);
  141.         }
  142.  
  143. //      cerr << A[le[i] - 1] << " " << A[ri[i] - 1] + 1 << endl;
  144.      
  145.         Paint(1, 1, An, le[i], ri[i], i);
  146.         set<pair<ll,int> > :: iterator it = AVE.end();
  147.         --it;
  148.    
  149.         printf("%.6lf\n", it -> f * 1.0 / it -> s);
  150.     }
  151.        
  152.    
  153.     return 0;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment