hdu1698_Just a Hook(线段树)

开始超时,后来请教了hdu的大牛才过

自己的超时版:

/*
 * File:   hdu1698.cpp
 * Author: Administrator
 *
 * Created on 2010年1月25日, 下午8:24
 */

#include <stdlib.h>
#include<iostream>
using namespace std;
#define N 100005

struct Node {
    int l, r, sum;
} Tree[3 * N];
int A[N], temp[N],s;

void Build_Tree(int l, int r, int k) {
    Tree[k].l = l;
    Tree[k].r = r;
    if (l == r) {
        Tree[k].sum = A[l];
        return;
    }
    int mid = (l + r) / 2;
    Build_Tree(l, mid, k + k);
    Build_Tree(mid + 1, r, k + k + 1);
    Tree[k].sum = Tree[k + k].sum + Tree[k + k + 1].sum;
}

void Update_Tree(int l, int r, int k) {
    if (Tree[k].l == l && Tree[k].r == r && Tree[k].l == Tree[k].r) {
        temp[l]=s-A[l];
        A[l]=s;
        Tree[k].sum += temp[Tree[k].l];
        return;
    }
    int mid = (Tree[k].l + Tree[k].r) / 2;
    if (r <= mid)Update_Tree(l, r, k + k);
    else if (l > mid)Update_Tree(l, r, k + k + 1);
    else {
        Update_Tree(l, mid, k + k);
        Update_Tree(mid + 1, r, k + k + 1);
    }
    Tree[k].sum = Tree[k + k].sum + Tree[k + k + 1].sum;
}

/*
 *
 */
int main(int argc, char** argv) {

    int n, m, i, j, t, x, y, i0;
    //cin >> t;
    scanf("%d",&t);
    for (i = 1; i <= t; i++) {
        //cin >> n;
        scanf("%d",&n);
        for (i0 = 1; i0 <= n; i0++) {
            A[i0] = 1;
            temp[i0] = 0;
        }
        Build_Tree(1, n, 1);
       // cin >> m;
        scanf("%d",&m);
        while (m--) {
            //cin >> x >> y >> s;
            scanf("%d%d%d",&x,&y,&s);
            Update_Tree(x, y, 1);
        }
        int ans = Tree[1].sum;
        cout << "Case " << i << ": The total value of the hook is " << ans << "." << endl;
    }
    return (EXIT_SUCCESS);
}

AC代码:

/*
 * File:   main.cpp
 * Author: Administrator
 *
 * Created on 2010年1月25日, 下午9:35
 */

#include <stdlib.h>
#include<iostream>
using namespace std;
#define N 100005
struct Node
{
    int l,r,value;
    bool cover;
}Tree[3*N];

void Build_Tree(int l,int r,int k)
{
    Tree[k].l=l;
    Tree[k].r=r;
    Tree[k].value=1;
    Tree[k].cover=true;
    if(l==r)return ;
    int mid=(l+r)/2;
    Build_Tree(l,mid,k+k);
    Build_Tree(mid+1,r,k+k+1);
}
void Update_Tree(int l,int r,int k,int value)
{
    if(Tree[k].l==l&&Tree[k].r==r)
    {
        Tree[k].cover=true;
        Tree[k].value=value;
        return ;
    }
   
    if(Tree[k].cover==true)
    {
        Tree[k].cover=false;
        Tree[k+k].value=Tree[k].value;
        Tree[k+k].cover=true;
        Tree[k+k+1].value=Tree[k].value;
        Tree[k+k+1].cover=true;
    }
    
    int mid=(Tree[k].l+Tree[k].r)/2;
    if(r<=mid)Update_Tree(l,r,k+k,value);
    else if(l>mid)Update_Tree(l,r,k+k+1,value);
    else
    {
        Update_Tree(l,mid,k+k,value);
        Update_Tree(mid+1,r,k+k+1,value);
    }
}
int Get_Value(int k)
{
    if(Tree[k].cover==true)
    {
        return Tree[k].value*(Tree[k].r-Tree[k].l+1);
    }
    int a=Get_Value(k+k);
    int b=Get_Value(k+k+1);
    return a+b;
}
/*
 *
 */
int main(int argc, char** argv) {

    int n, m, i, j, t, x, y,s, i0;
    scanf("%d",&t);
    for (i = 1; i <= t; i++) {
        scanf("%d",&n);
        Build_Tree(1, n, 1);
        scanf("%d",&m);
        while (m--) {
            scanf("%d%d%d",&x,&y,&s);
            Update_Tree(x, y, 1,s);
        }
        int ans = Get_Value(1);
        cout << "Case " << i << ": The total value of the hook is " << ans << "." << endl;
    }
    return (EXIT_SUCCESS);
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值