Codeforces 题目传送门 & 洛谷题目传送门

可能有人会问我为什么为这道 *2500 的 D1C 写题解,我觉得大概是想要在写题解数量上 dd ycx 吧,因为 ycx 到目前为止写了 143 篇题解,而这也是我的第 143 篇题解(((

大概和 CF1149C Tree Generator 比较像?做过那题这题基本可以一眼秒了(

线段树。每个区间维护以下八个值:

  • 区间第一个元素的值 \(fst\)
  • 区间最后一个元素的值 \(lst\)
  • 区间长度 \(len\)
  • 以左端点为开头的最长下降前缀的长度 \(llen\)
  • 以右端点为开头的最长上升后缀的长度 \(rlen\)
  • 以左端点为开头的先上升再下降的最长前缀长度 \(l\_tower\)
  • 以右端点为结尾的先上升再下降的最长前缀长度 \(r\_tower\)
  • 这段区间中最长的先上升后下降子序列的长度 \(mx\)

考虑合并左右两个区间:

  • \(fst\) 就直接继承左儿子的 \(fst\) 即可
  • \(lst\) 就直接继承右儿子的 \(lst\) 即可
  • \(len\) 就直接将左右儿子的 \(len\) 加起来即可
  • \(llen\) 分两种情况,如果左儿子的 \(llen\) 就等于其 \(len\),并且左儿子的 \(lst\) 大于右儿子的 \(fst\),那么该节点的 \(llen\) 等于左右节点的 \(llen\) 之和。否则该节点的 \(llen\) 等于左儿子的 \(llen\)。\(rlen\) 也同理
  • \(l\_tower\) 分三种情况,如果左儿子本身就是上升序列,即左儿子的 \(rlen\) 等于其 \(len\),并且左儿子的 \(lst\) 小于右儿子的 \(fst\),那么 \(l\_tower\) 就等于左儿子的 \(rlen\) 与右儿子的 \(l\_tower\) 的和。如果左儿子的 \(l\_tower\) 等于其 \(len\),并且左儿子的 \(lst\) 大于右儿子的 \(fst\),那么 \(l\_tower\) 就等于左儿子的 \(len\) 与右儿子的 \(llen\) 之和。否则 \(l\_tower\) 等于左儿子的 \(l\_tower\)。\(r\_tower\) 也同理。
  • \(mx\) 分四种情况,首先它可以从左右儿子的 \(mx\) 分别继承来,即它首先等于左右儿子 \(mx\) 的较大者。其次如果左儿子的 \(lst\) 小于右儿子的 \(fst\),那么 \(mx\) 可以用左儿子的 \(rlen\) 与右儿子的 \(l\_tower\) 之和更新;如果左儿子的 \(lst\) 大于右儿子的 \(fst\),那么 \(mx\) 可以用左儿子的 \(r\_tower\) 与右儿子的 \(llen\) 之和更新

写个结构体维护一下即可。区间修改就直接打个标记。

芜湖~做完了,记得开 long long,复杂度线对。

const int MAXN=3e5;
int n,qu,a[MAXN+5];
struct data{
ll fst,lst;int len,llen,rlen,l_tower,r_tower,mx;
data(){fst=lst=len=llen=rlen=l_tower=r_tower=mx=0;}
data(int _fst,int _lst,int _len,int _llen,int _rlen,int _l_tower,int _r_tower,int _mx):
fst(_fst),lst(_lst),len(_len),llen(_llen),rlen(_rlen),l_tower(_l_tower),r_tower(_r_tower),mx(_mx){}
friend data operator +(data a,data b){
data c;
c.fst=a.fst;c.lst=b.lst;c.len=a.len+b.len;
c.llen=(a.llen==a.len&&a.lst>b.fst)?(a.llen+b.llen):a.llen;
c.rlen=(b.rlen==b.len&&a.lst<b.fst)?(b.rlen+a.rlen):b.rlen;
c.l_tower=(a.rlen==a.len&&a.lst<b.fst)?(a.l_tower+b.l_tower):
((a.l_tower==a.len&&a.lst>b.fst)?(a.l_tower+b.llen):(a.l_tower));
c.r_tower=(b.llen==b.len&&a.lst>b.fst)?(b.r_tower+a.r_tower):
((b.r_tower==b.len&&a.lst<b.fst)?(b.r_tower+a.rlen):(b.r_tower));
c.mx=max(a.mx,b.mx);
if(a.lst>b.fst) c.mx=max(c.mx,a.r_tower+b.llen);
if(a.lst<b.fst) c.mx=max(c.mx,a.rlen+b.l_tower);
return c;
}
};
struct node{int l,r;ll lz;data v;} s[MAXN*4+5];
void pushup(int k){s[k].v=s[k<<1].v+s[k<<1|1].v;}
void build(int k,int l,int r){
s[k].l=l;s[k].r=r;if(l==r){s[k].v=data(a[l],a[l],1,1,1,1,1,1);return;}
int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);pushup(k);
}
void pushdown(int k){
if(s[k].lz){
s[k<<1].lz+=s[k].lz;s[k<<1].v.fst+=s[k].lz;s[k<<1].v.lst+=s[k].lz;
s[k<<1|1].lz+=s[k].lz;s[k<<1|1].v.fst+=s[k].lz;s[k<<1|1].v.lst+=s[k].lz;
s[k].lz=0;
}
}
void modify(int k,int l,int r,int x){
if(l<=s[k].l&&s[k].r<=r){
s[k].lz+=x;s[k].v.fst+=x;s[k].v.lst+=x;
return;
} pushdown(k);int mid=s[k].l+s[k].r>>1;
if(r<=mid) modify(k<<1,l,r,x);
else if(l>mid) modify(k<<1|1,l,r,x);
else modify(k<<1,l,mid,x),modify(k<<1|1,mid+1,r,x);
pushup(k);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);scanf("%d",&qu);
while(qu--){
int l,r,v;scanf("%d%d%d",&l,&r,&v);
modify(1,l,r,v);printf("%d\n",s[1].v.mx);
}
return 0;
}

Codeforces 739C - Alyona and towers(线段树)的更多相关文章

  1. Codeforces 739C Alyona and towers 线段树

    Alyona and towers 这个题写起来真的要人命... 我们发现一个区间被加上一个d的时候, 内部的结构是不变的, 改变的只是左端点右端点的值, 这样就能区间合并了. 如果用差分的话会简单一 ...

  2. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  3. codeforces 22E XOR on Segment 线段树

    题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...

  4. Codeforces 588E. A Simple Task (线段树+计数排序思想)

    题目链接:http://codeforces.com/contest/558/problem/E 题意:有一串字符串,有两个操作:1操作是将l到r的字符串升序排序,0操作是降序排序. 题解:建立26棵 ...

  5. Codeforces Gym 100803G Flipping Parentheses 线段树+二分

    Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...

  6. Codeforces GYM 100114 D. Selection 线段树维护DP

    D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...

  7. Codeforces 444C DZY Loves Colors(线段树)

    题目大意:Codeforces 444C DZY Loves Colors 题目大意:两种操作,1是改动区间上l到r上面德值为x,2是询问l到r区间总的改动值. 解题思路:线段树模板题. #inclu ...

  8. Codeforces 85D Sum of Medians(线段树)

    题目链接:Codeforces 85D - Sum of Medians 题目大意:N个操作,add x:向集合中加入x:del x:删除集合中的x:sum:将集合排序后,将集合中全部下标i % 5 ...

  9. [Codeforces]817F. MEX Queries 离散化+线段树维护

    [Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...

随机推荐

  1. OKhttp3的使用教程

    首先在build.gradle下的dependencies下添加引用. implementation "com.squareup.okhttp3:okhttp:4.9.0" 然后编 ...

  2. set prompt = "任意匹配字符" 当前目录详解

    转载:https://blog.csdn.net/alexdream/article/details/6865730 研究了两天的FreeBSD,总是感觉输入提示符那里怪怪的,而且默认的提示符还不带显 ...

  3. X264编码测试验证

    之前在做一个rtsp直播需求,其中一个方案是要用的x264来对摄像头数据进行实时编码推流,摄像头帧率是25fps,为了验证方案的可行性,先对x264的编码速度进行一个测试研究,再确认是否要采用此方案. ...

  4. JAVA笔记4__static关键字/对象数组/foreach/方法的可变参数

    /** * static关键字:修饰属性(实质就是全局变量).方法(无需本类的对象即可调用此方法).类. * 1.static方法只能调用static方法 * 2.static方法只能访问static ...

  5. Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused

    zabbix 监控连接失败 1.查看配置文件端口,server端口10051开启正常,agent端10050开启正常 2.查看/var/log/zabbix/zabbix_server.log./va ...

  6. 使用Charles请求跳转可作为线上和线下环境的切换

    举个例子: 1.后端拿测试环境的客户端调试本地的代码 2.连接后端本地服务测试客户端和后端的交互 这样就可以改变客户端请求的测试环境换成其他的环境 一.配置 tools--Map remot... 这 ...

  7. IDEA 设置Java项目使用的JDK版本 最全篇

    1. File -> Project Setting -> Project : 2. File ->Project Setting -> Modules 3. File -&g ...

  8. 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;

    考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...

  9. 12组-Alpha冲刺-3/6

    一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15546442.html 小组人数:10人 二.冲刺概况汇报 侯钦凯 过去两天完成 ...

  10. Django笔记&教程 6-4 forms进阶操作,重写forms方法

    Django 自学笔记兼学习教程第6章第4节--forms进阶操作,重写forms方法 点击查看教程总目录 1 - 重写clean方法 在本章第三节中,我们举了个注册学生账号的例子,里面我们使用模型来 ...