Cutting Bamboos (2019 Nian cattle off more than half of school H + title + Chairman of the tree)

Topic Link

Portal

The meaning of problems

There are n-$ $ bamboo trees, then there is $ Q $ operations, each operation you $ l, r, x, y $, showing the bamboo of $ [l, r] $ $ Y $ cut interval times felled and an equal length (height set their own cut $ len $, the interval is greater than $ len $ trees have Kandao $ len $), ask your first $ x $ times the height of cut is how much (note that after $ y after the interval $ felled times the height of the bamboo will become $ 0 $ simultaneously and ask).

Thinking

Since the $ Y $ times are cut down trees height becomes $ 0 $, and the total length of each cut are equal, and the length of each cut bamboo section for x-height divided by $ Y $, $ front the total height of $ felled for the $ the X- len $, and then half of the first $ x $ times cut the height of the Chairman which tree to find than it is tall bamboo cut down the number of trees (denoted as $ sum1 $), the height of the bamboo and to $ sum2 $, then compare $ sum2-sum1 relations mid $ and $ x * len $ adjustment of bounds.

Because the birthday go home for a few days, more than two cushions of the school, write a few blog pretend to have water problems in training ~

Code

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> pil;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;

#define lson (rt<<1),L,mid
#define rson (rt<<1|1),mid + 1,R
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("/home/dillonh/CLionProjects/Dillonh/in.txt","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)

const double eps = 1e-8;
const int mod = 1000000007;
const int maxn = 200000 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;

int n, q, cnt, l, r, x, y;
int root[maxn];
LL sum1, sum2, sum[maxn];

struct node {
    int l, r;
    LL sum1, sum2;
}tree[maxn*40];

void update(int l, int r, int& x, int y, int pos) {
    tree[++cnt] = tree[y], tree[cnt].sum1 += 1, tree[cnt].sum2 += pos, x = cnt;
    if(l == r) return;
    int mid = (l + r) >> 1;
    if(pos <= mid) update(l, mid, tree[x].l, tree[y].l, pos);
    else update(mid + 1, r, tree[x].r, tree[x].r, pos);
}

void query(int l, int r, int x, int y, double pos) {
    if(l == r) {
        if(pos - l >= eps) {
            sum1 += tree[y].sum1 - tree[x].sum1;
            sum2 += tree[y].sum2 - tree[x].sum2;
        }
        return;
    }
    int mid = (l + r) >> 1;
    if(mid - pos > eps) query(l, mid, tree[x].l, tree[y].l, pos);
    else {
        sum1 += tree[tree[y].l].sum1 - tree[tree[x].l].sum1;
        sum2 += tree[tree[y].l].sum2 - tree[tree[x].l].sum2;
        query(mid + 1, r, tree[x].r, tree[y].r, pos);
    }
}

int main() {
#ifndef ONLINE_JUDGE
    FIN;
#endif
    scanf("%d%d", &n, &q);
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &x);
        sum[i] = sum[i-1] + x;
        update(0, 100000, root[i], root[i-1], x);
    }
    while(q--) {
        scanf("%d%d%d%d", &l, &r, &x, &y);
        double len = 1.0 * (sum[r] - sum[l-1]) / y * x;
        double ub = 100000.0, lb = 0.0, mid, ans = 0.0;
        for(int i = 0; i < 100; ++i) {
            mid = (ub + lb) / 2;
            sum1 = sum2 = 0;
            query(0, 100000, root[l-1], root[r], mid);
            double tot = 1.0 * (sum[r] - sum[l-1] - sum2);
            double big = 1.0 * (r - l + 1 - sum1);
            if(tot - big * mid - len > eps) {
                ans = mid;
                lb = mid;
            } else {
                ub = mid;
            }
        }
        printf("%.7f\n", ans);
    }
    return 0;
}

Guess you like

Origin www.cnblogs.com/Dillonh/p/11360196.html