题意



分析

不难发现把增加人数看成减少人数,上限是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. Silverlight自定义控件系列 – TreeView (2) 基本布局和States

    TreeView的树形结构都以缩进方式显示,现在来完成这部分. 首先,要定义出每个节点上都包含什么东西.先看看Win7资源管理器的TreeView: 图2.1 资源管理器 一个通用的TreeView至 ...

  2. LeetCode--083--删除排序链表中的重复元素

    问题描述: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2-&g ...

  3. 『Kaggle』分类任务_决策树&集成模型&DataFrame向量化操作

    决策树这节中涉及到了很多pandas中的新的函数用法等,所以我单拿出来详细的理解一下这些pandas处理过程,进一步理解pandas背后的数据处理的手段原理. 决策树程序 数据载入 pd.read_c ...

  4. python-day65-django基础

    一.MTV模型 1.官方说明: Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务 ...

  5. OAF中多语言的实现(转)

    正好前两天研究过这个问题,分享一下啊. 标题:        OAF中多语言的实现概述:        OAF的多语言的实现有两种方式,其一是直接通过页面上面的“个性化”连接,连接到指定的页面后,进行 ...

  6. maven分别打包开发、生产配置文件

    项目工程针对开发和生产有两套配置,开发配置文件目录:src/main/resources/    applicationContext.xml (开发和生产共用)    dubbo.propertie ...

  7. en笔记音标

      清辅音和浊辅音区别 开音节和闭音节区别 1 2 3 4 5 6 7 a o e i u w y 开音节 /eɪ/ /əu/ /i:/ /aɪ/ Ju: /aɪ/ 闭音节 /æ/ /ɒ/ /ə/ / ...

  8. css display&&hidden

    display:none与visible:hidden的区别 display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被 ...

  9. 1strcat/strcpy应用

    分析下列程序输出 #include<iostream> #include<string.h> using namespace std; int main() { ]=]=&qu ...

  10. 在 Ubuntu 14.04 Chrome中安装Flash Player(转)

    在 Ubuntu 14.04 中安装 Pepper Flash Player For Chromium  一个 Pepper Flash Player For Chromium 的安装器已经被 Ubu ...