题意



分析

不难发现把增加人数看成减少人数,上限是w 看成总数是w,问题就变成了询问有多少个子区间没有0。

考虑这个问题困难在哪里,就是区间加减法让我们不好判断0 的位置。

因为题目保证每个位置的值非负,所以实际上我们只需要对于每个区间维护不包含其最小值的子区间的个数。

于是用线段树来维护,每个节点维护区间左边开始第一次出现最小值的位置(到左端的长度),右边开始第一次出现最小值的位置(到右端的长度),最小值的值,区间长度,以及有多少个子区间不包含其最小值即可。

合并的话,分类讨论最小值在哪个区间,然后用上述信息就可以完成合并了。

复杂度为\(O(n +m \log n)\)。

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=3e5+7; int n,m,w[MAXN]; struct node
{
ll ans;
ll lmin,rmin,minv,len; inline node operator+(const node&rhs)const
{
node ret;
ret.len=len+rhs.len;
if(minv==rhs.minv)
{
ret.minv=minv;
ret.lmin=lmin,ret.rmin=rhs.rmin;
ret.ans=ans+rhs.ans+(rmin-1)*(rhs.lmin-1);
}
else if(minv<rhs.minv)
{
ret.minv=minv;
ret.lmin=lmin,ret.rmin=rmin+rhs.len;
ret.ans=ans+rhs.len*(rhs.len+1)/2+(rmin-1)*rhs.len;
}
else
{
ret.minv=rhs.minv;
ret.lmin=rhs.lmin+len,ret.rmin=rhs.rmin;
ret.ans=rhs.ans+len*(len+1)/2+(rhs.lmin-1)*len;
}
return ret;
}
}seg[MAXN<<2]; ll tag[MAXN<<2]; #define lson (now<<1)
#define rson (now<<1|1) void build(int now,int l,int r)
{
tag[now]=0;
if(l==r)
{
seg[now].ans=0;
seg[now].lmin=seg[now].rmin=1;
seg[now].minv=w[l];
seg[now].len=1;
return;
}
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
seg[now]=seg[lson]+seg[rson];
} inline void pushdown(int now)
{
if(tag[now])
{
seg[lson].minv+=tag[now],
tag[lson]+=tag[now];
seg[rson].minv+=tag[now],
tag[rson]+=tag[now];
tag[now]=0;
}
} int ql,qr,v; void add(int now,int l,int r)
{
if(ql<=l&&r<=qr)
{
seg[now].minv+=v,
tag[now]+=v;
return;
}
pushdown(now);
int mid=(l+r)>>1;
if(ql<=mid)
add(lson,l,mid);
if(qr>=mid+1)
add(rson,mid+1,r);
seg[now]=seg[lson]+seg[rson];
} node query(int now,int l,int r)
{
if(ql<=l&&r<=qr)
{
return seg[now];
}
pushdown(now);
int mid=(l+r)>>1;
if(qr<=mid)
return query(lson,l,mid);
if(ql>=mid+1)
return query(rson,mid+1,r);
return query(lson,l,mid)+query(rson,mid+1,r);
} int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
read(n);read(m);
for(int i=1;i<=n;++i)
read(w[i]);
build(1,1,n);
while(m--)
{
int opt;
read(opt);
if(opt==1)
{
read(ql);read(qr);read(v);
v=-v;
add(1,1,n);
}
else
{
read(ql);read(qr);
node ans=query(1,1,n);
if(ans.minv)
printf("%lld\n",ans.len*(ans.len+1)/2);
else
printf("%lld\n",ans.ans);
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

test20180919 选择客栈的更多相关文章

  1. NOIP2011选择客栈[递推]

    题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  2. 选择客栈noip2011

    哈,没想到吧.今天居然有两篇(算什么,厕所读物吗 选择客栈 本题的更优解请跳转zt 这题11年,刚改2day. 对于30% 的数据,有 n ≤100: 对于50% 的数据,有 n ≤1,000: 对于 ...

  3. 一本通1546【NOIP2011】选择客栈

    1546:NOIP2011 选择客栈 时间限制: 1000 ms         内存限制: 524288 KB 题目描述 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号. ...

  4. 洛谷 P1311 选择客栈 解题报告

    P1311 选择客栈 题目描述 丽江河边有 \(n\) 家很有特色的客栈,客栈按照其位置顺序从 \(1\) 到 \(n\) 编号.每家客栈都按照某一种色调进行装饰(总共 \(k\) 种,用整数 \(0 ...

  5. 洛谷P1311 选择客栈

    P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...

  6. 【11NOIP提高组】选择客栈(信息学奥赛一本通 1546)(洛谷 1311)

    题目描述 丽江河边有nn家很有特色的客栈,客栈按照其位置顺序从 11到nn编号.每家客栈都按照某一种色调进行装饰(总共 kk 种,用整数 00 ~k-1k−1 表示),且每家客栈都设有一家咖啡店,每家 ...

  7. Noip2011 提高组 选择客栈

    P1311 选择客栈 直通 思路: ①看题,我们可以发现一个显然的性质,即当最左边的客栈向右移动时,最右边的客栈时单调向右的,并且右端点往右的客栈也符合要求.(因为只要左侧有一个满足的,右边的自然可以 ...

  8. 【五一qbxt】day7-2 选择客栈

    停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...

  9. luoguP1311 选择客栈 题解(NOIP2011)

    P1311 选择客栈  题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...

随机推荐

  1. [ORA-28001: the password has expired]的处理

    http://irikintwtr.com/wordpress/?p=420 alter profile default limit password_life_time unlimited; alt ...

  2. 一个Java例子,解释清楚注解的作用

    原文出处:码农登陆 写在前面 今天聊的是注解,但其实单纯说注解,注解本身没有任何的作用.简单说和注释没啥区别,而它有作用的原因是:注解解释类,也就是相关对代码进行解释的特定类.一般这些类使用反射是可以 ...

  3. WPF:改变ListBoxItem和ListViewItem的颜色

    目录 1. 改变ListBoxItem颜色 2. ListViewItem的颜色设置 注意: 本文仅讨论默认ListBoxItem和ListViewItem的鼠标指向和被选择后的前景和背景颜色设置.如 ...

  4. 012 - jstat命令查看jvm的GC情况 | jvm

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量. 命令的格式如下: jstat -<option> [-t] [-h<lines>] <vmid> [ ...

  5. 49 BOM 和DOM

    一.BOM window 对象  1.确认,输入,    window.alert(123) // 弹框    let ret = window.confirm("是否删除") / ...

  6. Mac搭建个人服务器开发微信公众号

    个人电脑搭建小型服务器面临的一个重要问题就是网络问题,我把解决的过程简单记录一下,准备以后参考. 1. 内网穿透 由于个人所在网络是一个局域网,没有公网的IP,因此在公网是不能直接访问个人电脑的服务器 ...

  7. Eclipse SVN修改用户名和密码

    问题描述:     Eclipse的SVN插件Subclipse做得很好,在svn操作方面提供了很强大丰富的功能.但到目前为止,该插件对svn用户的概念极为淡薄,不但不能方便地切换用户,而且一旦用户的 ...

  8. DB2性能调优

    1.更新统计信息 --更新数据库所有表统计信息 --连接到数据库(-v选项,表示要回显命令,以下同) db2 -v connect to DB_NAME --查看是否收集过统计信息,什么时候更新的   ...

  9. .NET 性能优化方法总结==转

    .NET 性能优化方法总结 目录 目录 1. C#语言方面... 4 1.1 垃圾回收... 4 1.1.1 避免不必要的对象创建... 4 1.1.2 不要使用空析构函数 ★... 4 1.1.3 ...

  10. poj 2777线段树应用

    敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.. ...