Esempio n. 1
1
 public void solve(int testNumber, FastScanner in, FastPrinter out) {
   int n = in.nextInt();
   int p = in.nextInt();
   int m = in.nextInt();
   Query[] qs = new Query[m];
   int[] z = new int[4 * m + 10];
   int cn = 0;
   for (int i = 0; i < m; i++) {
     int time = in.nextInt();
     int type = in.next().equals("save") ? 0 : 1;
     int a = in.nextInt();
     int b = in.nextInt();
     qs[i] = new Query(time, type, a, b);
     if (type == 0) {
       z[cn++] = a - 1;
       z[cn++] = b;
     } else {
       --a;
       z[cn++] = a - b + 1;
       z[cn++] = a;
       z[cn++] = a + b;
     }
   }
   z[cn++] = 0;
   z[cn++] = n;
   z = Arrays.copyOf(z, cn);
   z = ArrayUtils.sortAndUnique(z);
   int[] cnt = new int[z.length - 1];
   {
     for (int i = 0; i < z.length - 1; i++) {
       cnt[i] = z[i + 1] - z[i];
     }
   }
   SegmentTree tree = new SegmentTree(cnt);
   int last = 0;
   double all = 0;
   for (int i = 0; i < m; i++) {
     int time = qs[i].time;
     tree.addValue(0, cnt.length, 1. * p * (time - last), 0);
     last = time;
     if (qs[i].type == 0) {
       int l = qs[i].a - 1;
       int r = qs[i].b;
       l = Arrays.binarySearch(z, l);
       r = Arrays.binarySearch(z, r);
       double sum = tree.getSum(l, r);
       all += sum;
       out.println(all);
       tree.setZero(l, r);
     } else {
       int index = qs[i].a - 1;
       int d = qs[i].b;
       double x = all / (2 * SegmentTree.sum(d) + d);
       int id = Arrays.binarySearch(z, index);
       tree.addValue(Arrays.binarySearch(z, index - d + 1), id, x, x);
       tree.addValue(id, Arrays.binarySearch(z, index + d), d * x, -x);
       all = 0;
     }
   }
 }
Esempio n. 2
0
  public static void main(String[] args) throws IOException {
    Scanner sc = new Scanner(System.in);
    PrintWriter out = new PrintWriter(System.out);

    int t = sc.nextInt();
    while (t-- > 0) {
      int n = sc.nextInt();
      int N = 1;
      while (N < 100001) N <<= 1; // padding
      SegmentTree st = new SegmentTree(N + 1);

      int ans = 0;
      for (int i = 0; i < n; i++) {
        int l = sc.nextInt(), r = sc.nextInt(), h = sc.nextInt();
        int tm = st.query(l, r - 1, h);
        st.update_range(l, r - 1, h);
        ans += tm;
      }

      out.println(ans);
    }

    out.flush();
    out.close();
  }
Esempio n. 3
0
 public void solve(int testNumber, FastScanner in, FastPrinter out) {
   int n = in.nextInt();
   int m = in.nextInt();
   int c = in.nextInt();
   int[] x = new int[n];
   for (int i = 0; i < n; i++) {
     x[i] = in.nextInt();
   }
   double[] prob = new double[n];
   for (int i = 0; i + 1 < n; i++) {
     prob[i] = in.nextInt() * .01;
   }
   SegmentTree tree = new SegmentTree(n - 1);
   for (int i = 0; i + 1 < n; i++) {
     tree.set(i, -.5 * (x[i + 1] - x[i]) + prob[i] * c);
   }
   double answer = 0;
   for (int i = 0; i < m; i++) {
     int a = in.nextInt() - 1;
     int b = in.nextInt() - 1;
     double profit = tree.getMin(a, b);
     profit = -profit;
     answer += profit;
   }
   out.println(answer);
 }
Esempio n. 4
0
 public SegmentTree build(int start, int end) {
   if (start > end) {
     return null;
   }
   SegmentTree root = new SegmentTree(start, end);
   if (start == end) {
     return root;
   }
   int mid = start + ((end - start) >> 1);
   root.left = build(start, mid);
   root.right = build(mid + 1, end);
   return root;
 }
Esempio n. 5
0
 public void update(SegmentTree root, int p) {
   if (root == null) {
     return;
   }
   if (root.start == p && root.end == p) {
     root.count++;
     return;
   }
   int mid = root.start + ((root.end - root.start) >> 1);
   if (mid >= p) {
     update(root.left, p);
   } else {
     update(root.right, p);
   }
   root.count = 0;
   if (root.left != null) {
     root.count += root.left.count;
   }
   if (root.right != null) {
     root.count += root.right.count;
   }
 }
Esempio n. 6
0
    /**
     * @param pages: an array of integers
     * @param k: an integer
     * @return: an integer
     */
    public int copyBooks(int[] pages, int k) {
        // write your code here

        // dp[i][j] means firt i books assigned to j peopler, need smallest minutes.
        // dp[i][j] = Math.max(dp[p-1][j-1] , cost[p][i]) where p<i;

        // Initialization:
        // dp[i][1] = cost[1][i];


        if(pages == null || pages.length == 0 ) return 0;
        if(k == 0) return Integer.MAX_VALUE;

        int size = pages.length;

        // Build a Segment_Tree to support the range sum query
        SegmentTree st = new SegmentTree(pages);
        int [][] dp = new int[size+1][k+1];

        // Initialization:
        for(int i = 1; i <= size; i++) {
            dp[i][1] = st.query(st.root, 0,i-1);
        }

        // Fill the dp
        for(int j = 2; j <= k; j++) {
            dp[i][j] = Integer.MAX_VALUE;
            for(int i = 1 ; i <= size; i++) {
                for(int p = 1; p < i; p++) {
                    dp[i][j] = Math.min(dp[i][j], Math.max(dp[p-1][j-1], st.query(st.root, p-1,i-1)));
                }
            }
        }

        return dp[size][k];
    }