1. 程式人生 > >HDU1698 Just a Hook(線段樹成段替換)

HDU1698 Just a Hook(線段樹成段替換)

Just a Hook
Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 28728    Accepted Submission(s): 14242
Problem Description
In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic sticks which are of
the same length. Now Pudge wants to do some operations on the hook. Let us number the consecutive metallic sticks of the hook from 1 to N. For each operation, Pudge can change the consecutive metallic sticks, numbered from X to Y, into cupreous sticks, silver sticks or golden sticks. The total value
of the hook is calculated as the sum of values of N metallic sticks. More precisely, the value for each kind of stick is calculated as follows: For each cupreous stick, the value is 1. For each silver stick, the value is 2. For each golden stick, the value is 3. Pudge wants to know the total value of
the hook after performing the operations. You may consider the original hook is made up of cupreous sticks. Input The input consists of several test cases. The first line of the input is the number of the cases. There are no more than 10 cases. For each case, the first line contains an integer N, 1<=N<=100,000, which is the number of the sticks of Pudge’s meat hook and the second line contains an integer Q, 0<=Q<=100,000, which is the number of the operations. Next Q lines, each line contains three integers X, Y, 1<=X<=Y<=N, Z, 1<=Z<=3, which defines an operation: change the sticks numbered from X to Y into the metal kind Z, where Z=1 represents the cupreous kind, Z=2 represents the silver kind and Z=3 represents the golden kind. Output For each case, print a number in a line representing the total value of the hook after the operations. Use the format in the example. Sample Input 1 10 2 1 5 2 5 9 3 Sample Output Case 1: The total value of the hook is 24.
這道涉及的就是線段樹的成段替換還要區間求和。
成段替換就是加了一個Lazy_tag延遲標記。
然後由於是求整段的和,所以直接輸出sum[1]就可以了。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<ctime>
#include<string>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#include<set>
#include<map>
#include<cstdio>
#include<limits.h>
#define fir first
#define sec second
#define fin freopen("/home/ostreambaba/文件/input.txt", "r", stdin)
#define fout freopen("/home/ostreambaba/文件/output.txt", "w", stdout)
#define mes(x, m) memset(x, m, sizeof(x))
#define pii pair<int, int>
#define Pll pair<ll, ll>
#define INF 1e9+7
#define Pi 4.0*atan(1.0)
#define MOD 1000000007

#define lowbit(x) (x&(-x))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1

typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-12;
const int maxn = 100000+5;
using namespace std;

inline int read(){
    int x(0),f(1);
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int sum[maxn<<2];
int Lazy_tag[maxn<<2];
inline void PushUp(int rt)
{
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
inline void PushDown(int rt, int m)
{
    if(Lazy_tag[rt]){
        Lazy_tag[rt<<1] = Lazy_tag[rt<<1|1] = Lazy_tag[rt];
        sum[rt<<1] = (m-(m>>1))*Lazy_tag[rt];
        sum[rt<<1|1] = (m>>1)*Lazy_tag[rt];
        Lazy_tag[rt] = 0;
    }
}
inline void buildTree(int l, int r, int rt)
{
    Lazy_tag[rt] = 0;
    sum[rt] = 1;
    if(l == r){
        return;
    }
    int m = (l+r)>>1;
    buildTree(lson);
    buildTree(rson);
    PushUp(rt);
}
inline void query(int L, int R, int p, int l, int r, int rt)
{
    if(L <= l && r <= R){
        Lazy_tag[rt] = p;
        sum[rt] = (r-l+1)*p;
        return;
    }
    int m = (l+r)>>1;
    PushDown(rt, r-l+1);
    if(L <= m){
        query(L, R, p, lson);
    }
    if(R > m){
        query(L, R, p, rson);
    }
    PushUp(rt);
}
int main()
{
   // fin;
    int Case;
    Case = read();
    for(int k = 1; k <= Case; ++k){
        int N, Q, a, b, c;
        N = read();
        Q = read();
        buildTree(1, N, 1);
        for(int i = 1; i <= Q; ++i){
            a = read();
            b = read();
            c = read();
            query(a, b, c, 1, N, 1);
        }
        printf("Case %d: The total value of the hook is %d.\n", k, sum[1]);
    }
    return 0;
}



相關推薦

HDU1698 Just a Hook(線段替換)

Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28728 Accep

hdu1698 Just a Hook 線段替換

題意:給你T組資料,N個數(初始時每個數的值為1),M個操作,每個操作把區間[a,b]裡的數更新為c,問最後這N個數的和是多少 分析: 因為只是最後查詢總區間的和,所以只需要更新就可以了 #incl

HDU1698 Just a Hook 線段更新

基礎的線段樹成段更新,學習了notonlysuccess dalao的程式碼後寫的 #include<iostream> #include<cstdio> #include<cstring> #include<ctime> #

hdu 1698 Just a Hook 線段更新

void log ++ ase scan efi nbsp code upd 線段樹功能:update:成段替換 成段更新去要用到延遲標記,具體調試代碼就容易懂些 #include <iostream> #include <string>

HDU-1698 Just a Hook 線段更新

題目連結 #include "stdio.h" const int maxn = 100050; int n,x,y,z; struct Node { int val; }tree[maxn*4]; void pushup( int t ) { tree

Just a Hook 線段--更新

In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic stic

hdu1698 Just a Hook(線段,區間更新)

題目連結:http://acm.split.hdu.edu.cn/showproblem.php?pid=1698 題意: 某個鉤子由n個小鉤子組成,有q個操作,將某個區間內的小鉤子的材料改變,有金銀銅三中材料,每種材料價錢不同。問最後這個鉤子的價值 注意,題目中預設初

HDU1698 Just a Hook 線段區間更新

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 42281    Accepted Submission

hdu1698 Just a Hook (線段,區間更新)

Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is

hdu1698 Just a Hook 線段 延時更新

In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic sti

HDU1698 Just a Hook 線段入門題複習

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1698 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (

hdu1698 Just a Hook 線段更新延遲標記

Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is mad

HDU1698 Just a Hook(線段區間更新、區間查詢)

題目連結 題意 在 DotA 遊戲中,帕吉的肉鉤是很多英雄最害怕的東西。鉤子由連續若干段的等長金屬棒製成。 現在帕吉對鉤子由一些操作: 我們將金屬棒 1~n 依次編號,帕吉可以把編號 x~y 的金屬棒變成銅棒、銀棒、金棒。 每段銅棒的價值是 1;每

hdu1698 Just a Hook(線段區間更新)

In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic stic

hdu1698 Just a Hook 線段 區間更新 懶操作

題目連結: 題意: 輸入一個n表示一段長度為n的區間,有n個編號為1~n的點,初始值全部為1。 有q個操作, 每個操作有3個數:l,r,v表示將區間l~r的所有元素修改為v。 求經過q次修改後的整個區間的值之和。 題解: 線段樹。 區間更新

HDU 1698 Just a Hook 線段 區間更新

不同 描述 感覺 ring 這也 deque deb %d total   題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=1698   題目描述: 區間更新, 最後求出1 ~ n 之和     解題思路: 這裏涉及到區間

Just a Hook 線段 區間更新

output nod ins long repr actually max dota metal Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing

E - Just a Hook (線段+區間更新)

In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic

1698 Just a Hook 線段區間更新

    線段樹區間更新,有個懶惰標記,每次更新不進行到底,,用懶惰標記使得更新延遲到下次需要更新或者詢問到的時候。線段樹的精髓在於能不向下更新,儘可能利用子樹的根的資訊去獲取整棵子樹的資訊。 #in

HDU 1698 Just a Hook 線段區間修改

題意: 給定N個數,初始化全部為1. 一種操作,區間修改。把區間[L,R]內所有數字修改為另一個值X Q次操作之後,求區間[1,N]的和 分析: 簡單的線段樹區間修改操作應用題 具體實現見程式碼 #