传送门

线段树基本操作。

给出一个排列b,有一个初始值都为0的数组a,维护区间加1,区间统计区间∑(ai/bi)" role="presentation" style="position: relative;">(ai/bi)(ai/bi)。

我们维护当前所有的ai" role="presentation" style="position: relative;">aiai%bi" role="presentation" style="position: relative;">bibi与bi" role="presentation" style="position: relative;">bibi差量的最小值,这样就把第一个操作变成了区间减法。

如果当前区间的差量最小值是大于1" role="presentation" style="position: relative;">11的,说明在这次减法过后整个区间对答案不会有新的贡献,直接打上标记。

否则我们递归到叶子结点,重新赋值差量并统计对答案的贡献,整个东西开个树状数组记录就好。

代码:

#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define N 100005
using namespace std;
int n,m,b[N],bit[N],ll,rr;
struct Node{int l,r,mn,add;}T[N<<2];
inline int min(int a,int b){return a<b?a:b;}
inline void pushup(int p){T[p].mn=min(T[lc].mn,T[rc].mn);}
inline void pushnow(int p,int v){T[p].mn-=v,T[p].add+=v;}
inline void pushdown(int p){pushnow(lc,T[p].add),pushnow(rc,T[p].add),T[p].add=0;}
inline int lowbit(int x){return x&-x;}
inline void modify(int p){for(int i=p;i<=n;i+=lowbit(i))++bit[i];}
inline void build(int p,int l,int r){
    T[p].l=l,T[p].r=r,T[p].add=0;
    if(l==r){scanf("%d",&b[l]),T[p].mn=b[l];return;}
    build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int ql,int qr){
    if(ql>T[p].r||qr<T[p].l)return;
    if(ql<=T[p].l&&T[p].r<=qr&&T[p].mn>1)return pushnow(p,1);
    if(T[p].l==T[p].r){T[p].mn=b[T[p].l];return modify(T[p].l);}
    pushdown(p);
    if(qr<=mid)update(lc,ql,qr);
    else if(ql>mid)update(rc,ql,qr);
    else update(lc,ql,mid),update(rc,mid+1,qr);
    pushup(p);
}
inline int query(int p){int ans=0;for(int i=p;i;i-=lowbit(i))ans+=bit[i];return ans;}
int main(){
    freopen("eta.in","r",stdin),freopen("eta.out","w",stdout),scanf("%d%d",&n,&m),build(1,1,n);
    while(m--){
        char s[10];
        scanf("%s%d%d",s,&ll,&rr);
        if(s[0]=='a')update(1,ll,rr);
        else printf("%d\n",query(rr)-query(ll-1));
    }
    return 0;
}

2018.07.31cogs2964. 数列操作η(线段树)的更多相关文章

  1. COGS 2638. 数列操作ψ 线段树

    传送门 : COGS 2638. 数列操作ψ 线段树 这道题让我们维护区间最大值,以及维护区间and,or一个数 我们考虑用线段树进行维护,这时候我们就要用到吉司机线段树啦 QAQ 由于发现若干次an ...

  2. 2018.07.22 codeforces750E(线段树维护状态转移)

    传送门 给出一个数字字串,给出若干个询问,询问在字串的一段区间保证出现2017" role="presentation" style="position: re ...

  3. 【COGS-2638】数列操作ψ 线段树

    题目链接: http://cogs.pro/cogs/problem/problem.php?pid=2638 Solution 用jry推荐的写法即可做到单次$O(log^{2}N)$,不过随机数据 ...

  4. BZOJ_4636_蒟蒻的数列_线段树+动态开点

    BZOJ_4636_蒟蒻的数列_线段树+动态开点 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将 ...

  5. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  6. 2018.07.28 uoj#169. 【UR #11】元旦老人与数列(线段树)

    传送门 线段树好题. 维护区间加,区间取最大值,维护区间最小值,历史区间最小值. 同样先考虑不用维护历史区间最小值的情况,这个可以参考这道题的解法,维护区间最小和次小值可以解决前两个操作,然后使用历史 ...

  7. 洛谷P1438 无聊的数列 [zkw线段树]

    题目传送门 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]} ...

  8. 【bzoj4636】蒟蒻的数列 离散化+线段树

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...

  9. [bzoj4636]蒟蒻的数列_线段树

    蒟蒻的数列 bzoj-4636 题目大意:给定一个序列,初始均为0.n次操作:每次讲一段区间中小于k的数都变成k.操作的最后询问全局和. 注释:$1\le n\le 4\cdot 10^4$. 想法: ...

随机推荐

  1. jdk免安装对应配置

    通常我们不用配置jdk,tomcat和eclipse会选取系统的环境变量获取jdk,但有时一个系统中部署不同的项目,各版本又不一样,不能完全兼容. 因此就需要采用自己的jdk.将jdk安装后,将安装后 ...

  2. mydumper使用

    一.下载安装,打开https://launchpad.net/mydumper #wget https://launchpadlibrarian.net/185032423/mydumper-0.6. ...

  3. DataFrame 取值

    通过 DataFrame[ ]方式,取得得都是行, [ ] 中,添加过滤条件 data = pd.DataFrame( np.arange(16).reshape(4,4), index=['OP', ...

  4. jquery clone 获取文本框值得问题

    1 clone 出来的文本框 默认不会把原来的事件也带过去 如果使用 $("#").clone(true);   true  可以将原来的事件带过去 获取文本框的值 可以使用事件 ...

  5. New Document (2)

    #Markdown 语法说明 (简体中文版) / (点击查看快速入门) ##概述 ###宗旨 兼容 HTML 特殊字符自动转换 区块元素 段落和换行 标题 区块引用 列表 代码区块 分隔线 区段元素 ...

  6. spring JPA分页排序条件查询

    @RequestMapping("/listByPage") public Page<Production> listByPage(int page, int size ...

  7. oracle以逗号分隔查询结果列表

    select wmsys.wm_concat(id) from table_name where id >= 5000 and id < 6000

  8. LIS问题(DP解法)---poj1631

    题目链接:http://poj.org/problem?id=1631 这个题题目有些难看懂hhh,但实质就是求LIS--longest increasing sequence. 以下介绍LIS的解法 ...

  9. SVN的基本操作

    右键SVN Commit 提交成功了,我们把SVN的服务器端刷新一下 所有的操作如果只是删除本地的文件都不会影响服务器端的文件,除非右键SVN Commit删除文件或者是新增文件才会对服务器端的仓库里 ...

  10. Django搭建数据库

    ---恢复内容开始--- 一.form表单提交数据的三个要素 1.form标签必须要有action个和method属性 2.所有获取用户输入的标签必须放在form表单中,必须要有name属性 3.必须 ...