zoukankan      html  css  js  c++  java
  • HDU 1698 Just a Hook

    HDU_1698

        直接用线段树对区间成段更新即可。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 100010
    int N, M, flag[4 * MAXD], sum[4 * MAXD];
    void build(int cur, int x, int y)
    {
    int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;
    flag[cur] = 0, sum[cur] = 1;
    if(x == y)
    return ;
    build(ls, x, mid);
    build(rs, mid + 1, y);
    }
    void init()
    {
    scanf("%d%d", &N, &M);
    build(1, 1, N);
    }
    void pushdown(int cur, int x, int y)
    {
    if(flag[cur])
    {
    int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;
    flag[ls] = flag[rs] = flag[cur];
    sum[ls] = (mid - x + 1) * flag[cur];
    sum[rs] = (y - mid) * flag[cur];
    flag[cur] = 0;
    }
    }
    void update(int cur)
    {
    sum[cur] = sum[cur << 1] + sum[(cur << 1) | 1];
    }
    void change(int cur, int x, int y, int s, int t, int v)
    {
    int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;
    if(x >= s && y <= t)
    {
    flag[cur] = v;
    sum[cur] = v * (y - x + 1);
    return ;
    }
    pushdown(cur, x, y);
    if(mid >= s)
    change(ls, x, mid, s, t, v);
    if(mid + 1 <= t)
    change(rs, mid + 1, y, s, t, v);
    update(cur);
    }
    void solve()
    {
    int i, x, y, z;
    for(i = 0; i < M; i ++)
    {
    scanf("%d%d%d", &x, &y, &z);
    change(1, 1, N, x, y, z);
    }
    printf("The total value of the hook is %d.\n", sum[1]);
    }
    int main()
    {
    int t, tt;
    scanf("%d", &t);
    for(tt = 0; tt < t; tt ++)
    {
    init();
    printf("Case %d: ", tt + 1);
    solve();
    }
    return 0;
    }


  • 相关阅读:
    BZOJ_3133_[Baltic2013]ballmachine_堆+倍增
    机器学习—朴素贝叶斯及其优化
    机器学习-输出一颗树
    机器学习-决策树
    KNN-综合应用
    KNN-机器学习算法
    [转载]Jupyter notebook调试
    机器学习-归一化
    神经网络模型及反向传播代码完全解析
    [转载]神经网络偏置项(bias)的设置及作用
  • 原文地址:https://www.cnblogs.com/staginner/p/2433994.html
Copyright © 2011-2022 走看看