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< ...
随机推荐
- 【原】Oracle 11.2.0.1 64bit for RHEL6.0 Server x86_64 静默安装
作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/4182469.html 本文适用Or ...
- 2.1-2.2 Hive 中数据库(Table、Database)基本操作
官网文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL 一.create table 1.官方字段 # # C ...
- linux之打包压缩命令
tar:主选项:[一条命令以下5个参数只能有一个]-c: --create 新建一个压缩文档,即打包-x: --extract,--get解压文件-t: --list,查看压缩文档里的文件目录-r:- ...
- 5 pyspark学习---Broadcast&Accumulator&sparkConf
1 对于并行处理,Apache Spark使用共享变量.当驱动程序将任务发送给集群上的执行者时,集群中的每个节点上都有一个共享变量的副本,这样就可以用于执行任务了. 2 两种支持得类型 (1)Broa ...
- TypeScript完全解读(26课时)_18.Mixins混入
本节的代码在mixin.ts文件内 同时在index.ts内引入 混入就是把两个对象或者类的内容混合到一起,从而实现一些功能复用. 对象混入 js中对象的混入 先来看一个js中对象的混入的例子 首先定 ...
- Whitelabel Error Page异常
做了个简单的springboot项目,一开始所有运行正常,之后写了一天的代码,再运行相同的代码,就一直报以下异常: Whitelabel Error Page This application has ...
- Eclipse如何查看接口实现类快捷键
1.找到要打开的接口类 2.双击接口名选中 3.按Ctrl+T打开接口实现类 以List接口为例,如下所示
- Codeforces Round #269 (Div. 2) A,B,C,D
CodeForces - 471A 首先要有四个数相等,然后剩下两个数不同就是Bear,否则就是Elephant. #include <bits/stdc++.h> using names ...
- Codeforces712C【贪心】
看了这篇.. http://blog.csdn.net/queuelovestack/article/details/52503162 直接就是从小到大,那么每次按最大的递增顺序上去,就是了. 因为每 ...
- 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration
现在大部分的Spring项目都采用了基于注解的配置,采用了@Configuration 替换标签的做法.一行简单的注解就可以解决很多事情.但是,其实每一个注解背后都有很多值得学习和思考的内容.这些思考 ...