题意:

  有编号为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)的更多相关文章

  1. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  2. hiho#1080 更为复杂的买卖房屋姿势 线段树+区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  3. HihoCoder1080 更为复杂的买卖房屋姿势(线段树+多重lazy)

    描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们可以化身上帝模式,买卖房产. 在这个游戏里,会不断的发生如下两种事件:一种是房屋自发的涨价或者降价,而另一种是政 ...

  4. hiho1080 更为复杂的买卖房屋姿势

    题目链接: hihocoder1080 题解思路: 题目中对区间改动有两个操作: 0   区间全部点添加v 1   区间全部点改为v easy想到应该使用到两个懒惰标记  一个记录替换  一个记录增减 ...

  5. hihocoder1080 更为复杂的买卖房屋姿势

    思路: 线段树区间修改,需要使用两个懒标记set和add.处理好两个标记的优先级即可(set之前的set和add是没有作用的). 实现: #include <bits/stdc++.h> ...

  6. hihocoder #1034 : 毁灭者问题 平衡树(set)+线段树

    #1034 : 毁灭者问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位. 毁 ...

  7. hihocoder 1080 线段树(区间更新)

    题目链接:http://hihocoder.com/problemset/problem/1080 , 两种操作的线段树(区间更新). 这道题前一段时间一直卡着我,当时也是基础不扎实做不出来,今天又想 ...

  8. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  9. codevs 1080 线段树练习

    链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...

随机推荐

  1. windows安装PHP5.4+Apache2.4+Mysql5.5

    windows安装PHP5.4+Apache2.4+Mysql5.5 作者:星之宇 ┊ 时间:2012-10-18 14:27 ┊ 分类: 网站技术 ┊ 阅读:1232 ┊ 评论:16 最近听说PHP ...

  2. html中调用本地exe应用程序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Flutter实战视频-移动电商-33.列表页_子类和商品列表交互效果

    33.列表页_子类和商品列表交互效果 主要实现点击小类下面的列表跟着切换 获取右侧下面的列表信息,即要传递大类的id也要传递小类的,所以需要把左侧的大类的id也要Provide化 可以看下网站上的接口 ...

  4. Channel的使用

    Channel必须要通过buffer来读写 1. Channel需要通过IO流的getChannel()方法获取 2. buffer需要通过Channel的map()方法获取 package com. ...

  5. E20190308-hm

    sweep vt. 扫除; 打扫,清理; 彻底搜索; 掠过; vi. 打扫; 扫过; 蜿蜒; 大范围伸展; n. 打扫; 延伸; 挥动; 全胜;

  6. E20190214-mt

    roughly  adv. 粗略地; 大致上; 大体上; 粗暴地; equivalent adj. 相等的,相当的,等效的; 等价的,等积的; [化学] 当量的; consult  vi. 咨询; 商 ...

  7. 洛谷P1291 百事世界杯之旅

    P1291 百事世界杯之旅 题目描述 “……在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听, ...

  8. hoj2662 Pieces Assignment

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  9. 洛谷P4301 [CQOI2013]新Nim游戏(线性基)

    传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 后手在什么时候能够获胜呢?只有在他能构造出一个子集的异或和为0时(这个应该是nim博弈的结论了吧) 那么为了必胜,我们就要取到没有子集异或和为0为止 ...

  10. [Xcode 实际操作]九、实用进阶-(22)Storyboard故事板的常用布局结构

    目录:[Swift]Xcode实际操作 本文将演示如在使用故事板搭建项目时,常用的一种故事板布局结构. 在项目导航区,打开故事板文件[Main.storyboard] 当前故事板中只有一个视图控制器控 ...