hihoCoder #1080 : 更为复杂的买卖房屋姿势 (线段树,多tag)
题意:
有编号为0~n的n+1个房屋,给出每个房屋的起始价格,随后给出m种修改,每次修改都要进行输出所有房屋的价格总和。修改有两种方式:(1)政府调控,编号L~R全置为同一价格(0)房屋自行涨跌,编号L~R的房屋价格全部涨/跌一部分。
思路:
只需要一个tag+浮动的价格就可以解决这个问题了。当tag=1时,表示需要对该节点的孩子进行修改。进行何种修改?看浮动价格flo是否为0,若为0,表示需要设置为同一价格,否则,表示价格需要涨跌。当先进行set后进行add时,按照set的方式下放即可;当先进行add后进行set时,set直接覆盖掉add,依然按照set的方式下放即可。
不知道错在哪
#include <bits/stdc++.h>
using namespace std;
int n, m, e, l, r, d, v;
bool flag;
struct node
{
int sum; //总和
int flo; //浮动价格
bool tag; //lazy tag
node *ll,*rr;
}; node *create()
{
node *tmp=new(node);
tmp->sum=tmp->flo=tmp->tag=;
tmp->ll=tmp->rr=;
return tmp;
} node * create_tree(int LL,int RR)
{
node *tmp=create();
if(LL==RR) //没有必要设置lazy tag
{
int a;
cin>>a;
tmp->sum=a;
return tmp;
}
int mid=((LL+RR)>>);
tmp->ll= create_tree(LL,mid);
tmp->rr= create_tree(mid+,RR);
tmp->sum= tmp->ll->sum + tmp->rr->sum;
return tmp;
} int dfs(const int ll,const int rr,const int LL,const int RR,const int val,node *t)
{
if(ll==LL&&rr==RR)
{
t->tag=;
if(flag==) //政府调控
{
t->flo=;
t->sum=(RR-LL+)*val;
}
else //自发涨价
{
t->flo=val;
t->sum+=(RR-LL+)*val;
}
return t->sum;
} int mid=(LL+RR)/;
if(t->tag) //下放
{
t->tag=;
t->ll->tag= t->rr->tag= ;
if(t->flo==)//政府调控
{
t->ll->flo= t->rr->flo= ;
t->ll->sum= t->sum/(RR-LL+)*(mid-LL+);
t->rr->sum= t->sum - t->ll->sum;
}
else //需要改浮动价格的
{
t->ll->flo= t->rr->flo= t->flo;
t->ll->sum+= (mid-LL+)* t->flo;
t->rr->sum+= (RR-mid)* t->flo;
}
} if(ll>mid)
t->sum= t->ll->sum + dfs(ll,rr,mid+,RR,val,t->rr);
else if(rr<=mid)
t->sum= t->rr->sum + dfs(ll,rr,LL,mid,val,t->ll);
else
t->sum=dfs(ll,mid,LL,mid,val,t->ll) + dfs(mid+,rr,mid+,RR,val,t->rr);
return t->sum;
} int main()
{
//freopen("input.txt", "r", stdin);
cin>>n>>m;
node *tree=create_tree(,n+); //建树
for(int i=; i<m; i++) //修改并输出
{
scanf("%d",&e);
if(e)
{
flag=;
scanf("%d%d%d",&l,&r,&v);
printf("%d\n",dfs(l+, r+, , n+, v, tree));
}
else
{
flag=;
scanf("%d%d%d",&l,&r,&d);
printf("%d\n",dfs(l+, r+, , n+, d, tree));
}
}
return ;
}
WA代码
hihoCoder #1080 : 更为复杂的买卖房屋姿势 (线段树,多tag)的更多相关文章
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- hiho#1080 更为复杂的买卖房屋姿势 线段树+区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- HihoCoder1080 更为复杂的买卖房屋姿势(线段树+多重lazy)
描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们可以化身上帝模式,买卖房产. 在这个游戏里,会不断的发生如下两种事件:一种是房屋自发的涨价或者降价,而另一种是政 ...
- hiho1080 更为复杂的买卖房屋姿势
题目链接: hihocoder1080 题解思路: 题目中对区间改动有两个操作: 0 区间全部点添加v 1 区间全部点改为v easy想到应该使用到两个懒惰标记 一个记录替换 一个记录增减 ...
- hihocoder1080 更为复杂的买卖房屋姿势
思路: 线段树区间修改,需要使用两个懒标记set和add.处理好两个标记的优先级即可(set之前的set和add是没有作用的). 实现: #include <bits/stdc++.h> ...
- hihocoder #1034 : 毁灭者问题 平衡树(set)+线段树
#1034 : 毁灭者问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位. 毁 ...
- hihocoder 1080 线段树(区间更新)
题目链接:http://hihocoder.com/problemset/problem/1080 , 两种操作的线段树(区间更新). 这道题前一段时间一直卡着我,当时也是基础不扎实做不出来,今天又想 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1080 线段树练习
链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...
随机推荐
- Summit Online Judge
题意: 询问将取值在 $[L,R]$ 的若干个整数相加,可以得到 $[x,y]$ 区间内多少个数字. 解法: 只需要考虑求 $[L,R]$ 的数字能凑出 $[1,n]$ 的多少个数字,即可得出答案. ...
- C++ 预处理指令 #pragma
http://www.cnblogs.com/qinfengxiaoyue/archive/2012/06/05/2535524.html
- 8、html的body内标签之fieldset标签和label标签
一.label标签 <label> 标签为 input 元素定义标签(label). label 元素不会向用户呈现任何特殊的样式.不过,它为鼠标用户改善了可用性,因为如果用户点击 lab ...
- 使用git命令将本地项目上传到GIthub
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点“.”,意为添加文 ...
- 坑暗花明:又遇 .NET Core 中 System.Data.SqlClient 查询缓慢的问题
之前发布过一篇博文 下单快发货慢:一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问题,当时遇到的问题是从 SQL Server 2008 R2 中查询获取 100 条记录竟然耗时 ...
- HDU5119【dp背包求方案数】
题意: 有n个数,问有多少方案满足取几个数的异或值>=m; 思路: 背包思想,每次就是取或不取,然后输出>=m的方案就好了. #include <bits/stdc++.h> ...
- spring boot 使用Schedule创建轻量级定时任务
Scheduled SpringBoot配置定时任务可以直接使用自带的Scheduled,这相当于一个轻量级的Quartz,它可以让我们直接使用注解来完成定时任务的配置. Scheduled调度时间设 ...
- Unity5.0 EventSystem事件系统的详细说明
http://www.manew.com/blog-56596-2917.html?_dsign=53b25d5d unity5.0开发了新的UI系统UGUI,附带的事件系统EventSystem不仅 ...
- WPF 设置 Label.MouseDoubleClickEvent
facLabel.AddHandler(Label.MouseDoubleClickEvent, new MouseButtonEventHandler((o, a) => { facLabel ...
- java多线程模拟红绿灯案例
代码Lighter.java: package pack1; /** * 灯线程 * @author Administrator * */ public class Lighter extends T ...