题目链接

分析:1-N区间内初始都是1,然后q个询问,每个询问修改区间【a,b】的值为2或3或者1,统计最后整个区间的和

本来想刷刷手速,结果还是写了一个小时,第一个超时,因为输出的时候去每个区间查找了,直接输出tree[1].value就可以了 =_=

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdio>
using namespace std;
const int Max = ;
int hook[Max + ];
struct node
{
int l,r;
int value;
int tag;
};
node tree[ * Max];
void buildTree(int left, int right, int k)
{
tree[k].l = left;
tree[k].r = right;
tree[k].tag = -;
if(left == right)
{
tree[k].value = ;
return;
}
int mid = (left + right ) / ;
buildTree(left, mid, k * );
buildTree(mid + , right, k * + );
tree[k].value = tree[k * ].value + tree[k * + ].value;
}
void upDate(int left, int right, int k, int newp)
{
if(tree[k].l ==left && tree[k].r == right)
{
tree[k].value = (right - left + ) * newp;
tree[k].tag = newp;
return;
}
if(tree[k].tag != -)
{
tree[k * ].tag = tree[k * + ].tag = tree[k].tag;
tree[k * ].value = (tree[k * ].r - tree[k * ].l + ) * tree[k].tag;
tree[k * + ].value = (tree[k * + ].r - tree[k * + ].l + ) * tree[k].tag;
tree[k].tag = -;
}
int mid = (tree[k].l + tree[k].r) / ;
if(right <= mid)
{
upDate(left, right, k * , newp);
}
else if(mid < left)
{
upDate(left, right, k * + , newp);
}
else
{
upDate(left, mid, k * , newp);
upDate(mid + , right, k * + , newp);
}
tree[k].value = tree[k * ].value + tree[k * + ].value;
}
int Search(int k)
{
if(tree[k].tag != -)
{
tree[k * ].tag = tree[k * + ].tag = tree[k].tag;
tree[k * ].value = (tree[k * ].r - tree[k * ].l + ) * tree[k].tag;
tree[k * + ].value = (tree[k * + ].r - tree[k * + ].l + ) * tree[k].tag;
tree[k].tag = -;
}
if(tree[k].l == tree[k].r)
return tree[k].value;
return Search(k * ) + Search(k * + );
}
int main()
{
int test,n;
scanf("%d", &test);
for(int t = ; t <= test; t++)
{
int q,a,b,newp;
scanf("%d", &n);
buildTree(, n, );
scanf("%d", &q);
for(int i = ; i <= q; i++)
{
scanf("%d%d%d", &a, &b, &newp);
upDate(a, b, , newp);
}
printf("Case %d: The total value of the hook is %d.\n", t, tree[].value);
}
return ;
}

HDU1698Just a Hook(线段树 + 区间修改 + 求和)的更多相关文章

  1. 题解报告:hdu 1698 Just a Hook(线段树区间修改+lazy懒标记的运用)

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

  2. Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)

    题意: 给出一个具有N个点的树,现在给出两种操作: 1.get x,表示询问以x作为根的子树中,1的个数. 2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0). 思路:dfs序加上一个线 ...

  3. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  4. poj 2528 线段树区间修改+离散化

    Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...

  5. E - Just a Hook HDU - 1698 线段树区间修改区间和模版题

    题意  给出一段初始化全为1的区间  后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...

  6. HDU 1698 Just a Hook(线段树 区间替换)

    Just a Hook [题目链接]Just a Hook [题目类型]线段树 区间替换 &题解: 线段树 区间替换 和区间求和 模板题 只不过不需要查询 题里只问了全部区间的和,所以seg[ ...

  7. HDU 1698 线段树 区间更新求和

    一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...

  8. (简单) HDU 1698 Just a Hook , 线段树+区间更新。

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

  9. HDU 1698 Just a Hook(线段树区间更新查询)

    描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...

随机推荐

  1. 化茧成蝶,开源NetWorkSocket通讯组件

    前言 前后历时三年,期间大量参考.Net Framework和Asp.net MVC源代码,写写删删再重构,组件如今更新到V1.5.x了.从原来的丑小鸭,变成今天拥有稳定和强大的tcp协议支持基础层, ...

  2. SQL Server数据库转换成oracle

    来源:http://blog.csdn.net/hzfu007/article/details/6182151 经常碰到需要把sql server的数据迁移到Oracle的情况. 在网上查找一下,有很 ...

  3. Oracle 死锁的检测查询及处理

    来源于: http://www.cnblogs.com/hoojo/archive/2012/08/31/2665583.html -- 死锁查询语句 SELECT bs.username " ...

  4. android launchmode(四种启动模式)应用场景及实例

    模式介绍 [1] standard 模式 这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中. [2] singleTop 模式 如果在任务的栈顶正好存在该Activ ...

  5. zabbix 监控MySQL

    现在我来说一下我的监控环境 zabbix-3.0.3 MySQL-5.6.23 1.首先我们要登录MySQL,创建一个监控MySQL的用户 GRANT USAGE,PROCESS,SUPER,REPL ...

  6. noip复习模板

    我只会这么多 tarjan:codevs 1332 void tarjan(int u) { dfn[u]=low[u]=Time++; s.push(u); for(int i=head[u];~i ...

  7. HTTP协议学习---(十二)理解转发与重定向

    解释一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个方法在容 ...

  8. js清除浏览器缓存的几种方法

    2014年9月24日 4692次浏览 关于浏览器缓存 浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能.但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数 ...

  9. 树莓派利用PuTTY进行远程登录

    得到树莓派的IP:192.168.199.220 打开PuTTY: 端口为22 选择SSH 点击Open: 输入账号密码:pi/raspberry(注意,在linux下输入密码是看不见的) 如果要使用 ...

  10. TeamViewer11的安全设置

    一.关闭随机密码,使用固定的复杂密码 二.关闭文件共享传输 三.关闭在线状态,关闭会议功能