hiho一下 更为复杂的买卖房屋姿势(线段树)
来源:互联网 发布:java没有jre 编辑:程序博客网 时间:2024/06/02 07:30
- 样例输入
10 63195 2202 4613 3744 2892 4858 619 5079 9478 7366 8942 0 1 6 8861 0 2 97101 0 10 79800 4 9 -75940 2 8 15810 4 4 -1010
- 样例输出
583047565287780422165328352273
描述
小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们可以化身上帝模式,买卖房产。
在这个游戏里,会不断的发生如下两种事件:一种是房屋自发的涨价或者降价,而另一种是政府有关部门针对房价的硬性调控。房价的变化自然影响到小Hi和小Ho的决策,所以他们希望能够知道任意时刻某个街道中所有房屋的房价总和是多少——但是很不幸的,游戏本身并不提供这样的计算。不过这难不倒小Hi和小Ho,他们将这个问题抽象了一下,成为了这样的问题:
小Hi和小Ho所关注的街道的长度为N米,从一端开始每隔1米就有一栋房屋,依次编号为0..N,在游戏的最开始,每栋房屋都有一个初始价格,其中编号为i的房屋的初始价格为p_i,之后共计发生了M次事件,所有的事件都是对于编号连续的一些房屋发生的,其中第i次事件如果是房屋自发的涨价或者降价,则被描述为三元组(L_i, R_i, D_i),表示编号在[L_i, R_i]范围内的房屋的价格的增量(即正数为涨价,负数为降价)为D_i;如果是政府有关部门针对房价的硬性调控,则被描述为三元组(L_i, R_i, V_i),表示编号在[L_i, R_i]范围内的房屋的价格全部变为V_i。而小Hi和小Ho希望知道的是——每次事件发生之后,这个街道中所有房屋的房价总和是多少。
输入
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第1行为两个整数N、M,分别表示街道的长度和总共发生的事件数。
每组测试数据的第2行为N+1个整数,其中第i个整数位p_i,表示编号为i的房屋的初始价格。
每组测试数据的第3-M+2行,按照发生的时间顺序,每行描述一个事件,如果该行描述的事件为,“房屋自发的涨价或者降价”,则该行为4个整数0, L_i, R_i, D_i,意义如前文所述;如果该行描述的事件为“政府有关部门针对房价的硬性调控”,则该行为4个整数1, L_i, R_i, V_i,意义如前文所述。
对于100%的数据,满足N<=10^5,1<=p_i, |D_i|, V_i<=10^4,0<=l_i<r_i<=n。<>
对于100%的数据,满足在任意时刻,任何房屋的价格都处于[1, 10^4]内。
输出
对于每组测试数据,输出M行,其中第i行为一个整数Ans_i,表示第i次事件发生之后,这个街道中所有房屋的房价总和。
提示:
小Hi道:“小Ho,最近你也学了很多线段树的知识了,而现在我们遇到的这个问题其实也就是之前问题略微复杂化的版本,你有什么想法么?”
小Ho道:“唔……查询仍然是很简单,很明显我们可以知道维护的值是区间和,但是问题在于有两种修改操作——并且都是区间修改,也就是说如果我使用懒惰标记来维护修改的话,我就只需要处理好这两种操作之间的冲突咯?简单!”
“既然你说简单,那你就去试试好咯?~”小Hi笑道。
于是半天后,小Ho晕头转向的回来了:“不行啊,分支情况太多,整理不清楚。”
“那我就跟你讲个法子,首先你要弄清楚每个节点维护的值是标记时立即更新还是标记释放之后再更新。”小Hi道。
“这……一般标记打上之后都会马上用它的值更新父亲节点,所以应该是立即更新的吧!”小Ho想了想道。
“所以你可以把下放标记作为一个单独的方法拎出来,然后每次访问到一个节点的时候,不管三七二十一先执行了这个方法先。”小Hi写了写,递给了小Ho。
“这样的话,我每次进行新的修改操作的时候,都可以确保当前节点上没有任何的懒惰标记……那不就很简单了!”小Ho点了点头。
“先等你通过了再说简单吧!”小Ho嘿嘿笑道。
#include <iostream>
#include <stdio.h>
using namespace std;
#define maxn 100005
struct Tree
{
int add; //房价涨跌
int sum; //区间和
int set; //重新设置房价
};
Tree tree[maxn<<2];
void PushUp(int root)
{
tree[root].sum=tree[root<<1].sum+tree[(root<<1)+1].sum;
}
void PushDown(int l,int r,int root)
{
if(l==r)
return;
int m=(l+r)>>1;
int lson=root<<1;
int rson=lson+1;
if(tree[root].set!=-1)
{
tree[lson].set=tree[rson].set=tree[root].set;
tree[lson].sum=tree[root].set*(m-l+1);
tree[rson].sum=tree[root].set*(r-m);
tree[root].set=-1;//清除标记
tree[lson].add=tree[rson].add=0;
}
if(tree[root].add!=0)
{
tree[lson].add+=tree[root].add;
tree[rson].add+=tree[root].add;
tree[lson].sum+=(m-l+1)*tree[root].add;
tree[rson].sum+=(r-m)*tree[root].add;
tree[root].add=0;//清除标记
}
}
void Build(int L,int R,int root)
{
tree[root].add=0;
tree[root].set=-1;
if(L==R)
{
scanf("%d",&tree[root].sum);
return;
}
int m=(L+R)>>1;
Build(L, m, root<<1);
Build(m+1, R, (root<<1)+1);
PushUp(root);
}
void Update(bool is_set,int val,int L,int R,int l,int r,int root)
{
if(R>=r && L<=l)
{
if(is_set)
{
tree[root].set=val;
tree[root].sum=val*(r-l+1);
tree[root].add=0;
}
else
{
tree[root].add+=val;
tree[root].sum+=val*(r-l+1);
}
return;
}
if(tree[root].add ||tree[root].set!=-1)
PushDown(l, r, root);
int m=(l+r)>>1;
if(L<=m)
Update(is_set, val, L, R, l, m, root<<1);
if(R>m)
Update(is_set, val, L,R, m+1, r, (root<<1)+1);
PushUp(root);
}
int main()
{
int n,m;
int type,l,r,val;
scanf("%d%d",&n,&m);
n++;
Build(1, n,1);
for (int i=0; i<m; i++)
{
scanf("%d%d%d%d",&type,&l,&r,&val);
Update(type, val, l+1, r+1,1, n, 1);
printf("%d\n",tree[1].sum);
}
return 0;
}
- hiho一下 更为复杂的买卖房屋姿势(线段树)
- HIHO #1080 : 更为复杂的买卖房屋姿势(线段树双标记)
- hiho #1080 : 更为复杂的买卖房屋姿势 线段树区间更新
- hihocoder 1080 更为复杂的买卖房屋姿势 线段树
- hihocoder 1080 : 更为复杂的买卖房屋姿势 (线段树)
- hiho1080 更为复杂的买卖房屋姿势
- hihoCoder1080-更为复杂的买卖房屋姿势
- hiho刷题日记——第二十二天更为复杂的买卖房屋姿势
- hihocoder 1080 更为复杂的买卖房屋姿势(线段树经典操作,区间修改,add+set标记)
- hihoCoder 1080: 更为复杂的买卖房屋姿势
- hihocoder 1080更为复杂的买卖房屋姿势 java实现
- hihoCoder 1080 更为复杂的买卖房屋姿势(区间更新)
- hihocoder 1080 : 更为复杂的买卖房屋姿势- 结构体版本
- hiho一下 第二十周 线段树的区间修改
- hiho一下第二十周 #1078 : 线段树的区间修改 【线段树】
- 更为复杂的REST请求
- hiho一下 第二十二周 (线段树上存在冲突的区间修改操作)
- Elasticsearch(9)实践五-更为复杂的查询
- 在Linux Bash通过上下键快速查找历史命令
- 数据库设计三大范式
- Spark问题笔记2
- 将SAMPLE database的数据移到MYDB1 database上
- Checking API: checkapi-last make update-api
- hiho一下 更为复杂的买卖房屋姿势(线段树)
- 欢迎来到“渣渣写博客"
- Tomcat配置HTTPS
- SpringMVC -- @RequestMapping用法
- 华谊兄弟上半年净利增417%
- iOS开发—手动解析CrashLog(一)
- 得到正确的颜色IOS7半透明导航栏
- 获取View的width,height的正确方式
- syscomments