Just a Hook

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 24474    Accepted Submission(s): 12194

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.
 
Source
 
线段树 区间更新 区间求和
理解这个博客
要多刷
http://www.douban.com/note/273509745/
4.14重刷 更新模板  注意 pushdown的使用 有些题目 懒散标记不能堆积,得向下更新
 
 #include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#define ll __int64
#define maxn 100000
using namespace std;
struct node
{
int l,r;
int add;
int sum;
}tree[*maxn];
int t;
int x,y,z;
int n,q;
int ans=;
void buildtree(int root,int left,int right)
{
tree[root].l=left;
tree[root].r=right;
tree[root].add=;
if(left==right)
{
tree[root].sum=;
return ;
}
int mid=(left+right)>>;
buildtree(root<<,left,mid);
buildtree(root<<|,mid+,right);
tree[root].sum=tree[root<<].sum+tree[root<<|].sum;
}
void pushdown(int root,int m)
{
tree[root<<].add=tree[root].add;
tree[root<<|].add=tree[root].add;
tree[root<<].sum=tree[root].add*(m-(m>>));
tree[root<<|].sum=tree[root].add*(m>>);
tree[root].add=;
}
void updata(int root,int left,int right,int c)
{
if(tree[root].l==left&&tree[root].r==right)
{
tree[root].add=c;
tree[root].sum=c*(right-left+);
return ;
}
if(tree[root].l==tree[root].r)
return ;
if(tree[root].add)
pushdown(root,tree[root].r-tree[root].l+);
int mid=(tree[root].l+tree[root].r)>>;
if(right<=mid)
updata(root<<,left,right,c);
else
{
if(left>mid)
updata(root<<|,left,right,c);
else
{
updata(root<<,left,mid,c);
updata(root<<|,mid+,right,c);
}
}
tree[root].sum=tree[root<<].sum+tree[root<<|].sum;
}
int query(int root,int left,int right)
{
if(tree[root].l==left&&tree[root].r==right)
{
return tree[root].sum;
}
if(tree[root].add)
pushdown(root,tree[root].r-tree[root].l+);
int mid=(tree[root].l+tree[root].r)>>;
if(right<=mid)
ans+=query(root<<,left,right);
else
{
if(left>mid)
ans+=query(root<<|,left,right);
else
{
ans+=query(root<<,left,mid);
ans+=query(root<<|,mid+,right);
}
}
return ans;
}
int main()
{
while(scanf("%d",&t)!=EOF)
{
for(int i=;i<=t;i++)
{
scanf("%d",&n);
buildtree(,,n);
scanf("%d",&q);
for(int j=;j<=q;j++)
{
scanf("%d %d %d",&x,&y,&z);
updata(,x,y,z);
}
ans=;
printf("Case %d: The total value of the hook is %d.\n",i,query(,,n));
}
} return ;
}

旧板子

 
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
struct ss
{
int l,r;
int sum;
int tag;
}tr[4*maxn];
void build (int k,int s,int t)
{
tr[k].l=s;
tr[k].r=t;
tr[k].tag=0;
if(s==t)
{
tr[k].sum=1;
return ;
}
int mid=(s+t)>>1;
build(k<<1,s,mid);
build(k<<1|1,mid+1,t);
tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
//cout<<tr[k].sum<<endl;
}
void pushdown(int k,int m)//向下更新节点
{
tr[k<<1].tag=tr[k].tag;
tr[k<<1|1].tag=tr[k].tag;
tr[k<<1].sum=tr[k].tag*(m-(m>>1));
tr[k<<1|1].sum=tr[k].tag*(m>>1);
tr[k].tag=0;
}
void update (int k,int s,int t,int exm)
{
if(tr[k].l==s&&tr[k].r==t)
{
tr[k].tag=exm;
tr[k].sum=exm*(t-s+1);
return ;
}
if(tr[k].l==tr[k].r)
return ;
if(tr[k].tag)
pushdown(k,tr[k].r-tr[k].l+1);
int mid=(tr[k].l+tr[k].r)>>1;
if(t<=mid)
update(k<<1,s,t,exm);
else if(s>mid)
update(k<<1|1,s,t,exm);
else
{
update(k<<1,s,mid,exm);
update(k<<1|1,mid+1,t,exm);
}
tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
}
int ask(int k,int s,int t)
{
if(tr[k].l==s&&tr[k].r==t)
{
return tr[k].sum;
}
if(tr[k].tag) pushdown(k,tr[k].r-tr[k].l+1);
int mid=(tr[k].l+tr[k].r)>>1;
int ans=0;
if(t<=mid)
ans+= ask(k<<1,s,t);
else
if(s>mid)
ans+=ask(k<<1|1,s,t);
else
{
ans+=ask(k<<1,s,mid);
ans+=ask(k<<1|1,mid+1,t);
}
return ans;
}
int t;
int n;
int m;
int qq,ww,ee;
//int a[maxn];
int main()
{
while(scanf("%d",&t)!=EOF)
{
for(int i=1;i<=t;i++)
{ scanf("%d",&n);
build(1,1,n);
scanf("%d",&m);
for(int j=1;j<=m;j++)
{
scanf("%d%d%d",&qq,&ww,&ee);
update(1,qq,ww,ee);
}
printf("Case %d: The total value of the hook is %d.\n",i,ask(1,1,n));
}
}
return 0;
}

  

hdu 1698 线段树 区间更新 区间求和的更多相关文章

  1. hdu 1166线段树 单点更新 区间求和

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. HDU 3308 线段树单点更新+区间查找最长连续子序列

    LCIS                                                              Time Limit: 6000/2000 MS (Java/Oth ...

  3. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  4. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  5. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

  6. hdu 4267 线段树间隔更新

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. hdu1166(线段树单点更新&区间求和模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:中文题诶- 思路:线段树单点更新,区间求和模板 代码: #include <iost ...

  8. hdu2795(线段树单点更新&区间最值)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题意:有一个 h * w 的板子,要在上面贴 n 条 1 * x 的广告,在贴第 i 条广告时要 ...

  9. J - Super Mario HDU - 4417 线段树 离线处理 区间排序

    J - Super Mario HDU - 4417 这个题目我开始直接暴力,然后就超时了,不知道该怎么做,直接看了题解,这个习惯其实不太好. 不过网上的思路真的很厉害,看完之后有点伤心,感觉自己应该 ...

随机推荐

  1. Python爬虫使用浏览器的cookies:browsercookie

    很多用Python的人可能都写过网络爬虫,自动化获取网络数据确实是一件令人愉悦的事情,而Python很好的帮助我们达到这种愉悦.然而,爬虫经常要碰到各种登录.验证的阻挠,让人灰心丧气(网站:天天碰到各 ...

  2. [Clr via C#读书笔记]Cp19可空值类型

    Cp19可空值类型 主要解决的是和数据库中null对应的问题: System.Nullable结构:值类型: int?语法: 可空实例能够使用操作符: C#空合并操作符??; 即可用于引用类型,也可以 ...

  3. Python3中@的作用

    可能是自己理解能力差,网上看了一大堆教程,完全没搞懂. 自己敲几行代码,终于理解是怎么回事了. #python 3.6 #!/usr/bin/env python # -*- coding:utf-8 ...

  4. [递推+矩阵快速幂]Codeforces 1117D - Magic Gems

    传送门:Educational Codeforces Round 60 – D   题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem ...

  5. Paper Reading - CNN+CNN: Convolutional Decoders for Image Captioning

    Link of the Paper: https://arxiv.org/abs/1805.09019 Innovations: The authors propose a CNN + CNN fra ...

  6. react和vue的区别

    1.数据改变的方式 react是通过setState来改变数据,然后重走组件的渲染过程.而vue是通过Object.defineProperty和watcher来显示响应式的数据,所以数据的改变是直接 ...

  7. Eclipse 安装SVN、Maven插件

    1先安装subeclipse插件就是svn svn - http://subclipse.tigris.org/update_1.6.x 我这里是灰色的说明我安装过了这里只是截图说明下,我就不继续安装 ...

  8. 最小生成树——prim

    prim:逐“点”生成最小生成树 与Dijkstra不同的是:加入点到生成树中,不要考虑与源点的距离,而是考虑与生成树的距离 #include <iostream> #include &l ...

  9. Lecture Sleep(尺取+前缀和)

    Description 你的朋友Mishka和你参加一个微积分讲座.讲座持续n分钟.讲师在第i分钟讲述ai个定理.   米什卡真的对微积分很感兴趣,尽管在演讲的所有时间都很难保持清醒.给你一个米什卡行 ...

  10. Internet Technologe

    Store and Forward Networking Efficient Message Transmission:Packet Switching(分组交换) Challenge: in a s ...