这道题真的超级...毒瘤 + 卡常 + 耗 RP 啊...

传送门

noteskey

题解看 shadowice 大仙

code

如果发现自己 T 掉了,别心急,洗把脸再交一遍试试...

//by Judge
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const ll minf=-(1ll<<47);
const int M=1e5+3;
const int BL=110;
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
template<class T>inline T Max(T a,T b){return a>b?a:b;}
template<class T>inline T Min(T a,T b){return a<b?a:b;}
inline ll read(){ ll x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(ll x,char chr='\n'){
if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,m;
struct poi{ ll x,y;
poi operator +(const poi& b){
return (poi){x+b.x,y+b.y};
}
}st[BL+3];
inline bool cmp(const poi& a,const poi& b,const ll& k){return k*(b.x-a.x)>=b.y-a.y;}
inline bool cmp(const poi& a,const poi& b,const poi& c){return (a.y-c.y)*(a.x-b.x)>=(a.y-b.y)*(a.x-c.x);}
inline bool cmp(const poi& a,const poi& b,const poi& c,const poi& d){return (c.y-d.y)*(a.x-b.x)>=(a.y-b.y)*(c.x-d.x);}
inline void chull(poi* st,int& tp){ int r=tp; tp=1;
fp(i,2,r){ while(tp>1&&cmp(st[tp-1],st[tp],st[i])) --tp; st[++tp]=st[i]; }
}
struct data{ ll sum,l,r,ans;
data operator +(data b){return (data){sum+b.sum,Max(sum+b.l,l),Max(r+b.sum,b.r),Max(r+b.l,Max(ans,b.ans))};}
}; ll asum[BL+3]; int pos[M],bj[M];
inline void insert(const poi& a){st[a.x].y=Max(st[a.x].y,a.y);}
#define ins insert
#define B BL
#define N M
struct block{ bool FLG; int siz; int p1,p2,p3,s1,s2,s3,cut;
data val; ll add,a[BL+3]; poi pre[BL+3],suf[BL+3],ans[BL+3];
inline int brusolv(int l,int r){ Rg ll sum=0;
fp(i,l+1,r) sum+=a[i],ans[i]=(poi){i-l,sum};
fp(i,l+2,r){ sum=0; poi* nw=ans+l+1;
fp(j,i,r) sum+=a[j],nw->y=Max(nw->y,sum),++nw;
}
return s3=r-l,chull(ans+l,s3),s3;
}
inline int solv(int l,int r){
if(r-l<cut) return 0; if(r-l<=16) return brusolv(l,r);
int mid=(l+r)>>1,t1=solv(l,mid),t2=solv(mid,r);
fp(i,1,r-l) st[i]=(poi){i,minf};
fp(i,l+1,l+t1) insert(ans[i]);
fp(i,mid+1,mid+t2) insert(ans[i]);
ll sum=s1=0; fp(i,mid+1,r) ++s1,sum+=a[i],pre[s1]=(poi){s1,sum};chull(pre,s1);
sum=s2=0; fd(i,mid,l+1) ++s2,sum+=a[i],suf[s2]=(poi){s2,sum};chull(suf,s2);
int i=1,j=1; insert(pre[i]+suf[j]);
for(;i^s1&&j^s2;insert(pre[i]+suf[j]))
cmp(pre[i],pre[i+1],suf[j],suf[j+1])?++j:++i;
if(i^s1) for(++i;i<=s1;++i) insert(pre[i]+suf[j]);
if(j^s2) for(++j;j<=s2;++j) insert(pre[i]+suf[j]);
chull(st,s3=r-l); fp(i,1,s3) ans[l+i]=st[i]; return s3;
}
inline void aju(poi* a,int& p,const int& t){
for(;p^t;++p) if(cmp(a[p],a[p+1],-add)) break;
}
inline void rebuild(){ fp(i,1,siz) a[i]+=add; add=0;
if(!FLG){ FLG=1;fp(i,1,siz)FLG=FLG&&a[i]>=0;}
cut=ans[p3].x,solv(0,siz);
ll sum=s1=0; fp(i,1,siz) ++s1,sum+=a[i],pre[s1]=(poi){s1,sum};chull(pre,s1);
sum=s2=0; fd(i,siz,1) ++s2,sum+=a[i],suf[s2]=(poi){s2,sum};chull(suf,s2);
aju(pre,p1=1,s1),aju(suf,p2=1,s2),aju(ans,p3=1,s3),FLG&=(p1==s1)&&(p2==s2)&&(p3==s3);
val=(data){sum,Max(pre[p1].y,0ll),Max(suf[p2].y,0ll),Max(ans[p3].y,0ll)};
}
inline ll calc(const poi& a){return Max(a.x*add+a.y,0ll);}
inline void lb_add(ll x){
if(FLG) return add+=x,val.sum+=siz*x,val.l=val.r=val.ans=val.sum,void();
add+=x,aju(pre,p1,s1),aju(suf,p2,s2),aju(ans,p3,s3),FLG&=(p1==s1)&&(p2==s2)&&(p3==s3);
val=(data){val.sum+siz*x,calc(pre[p1]),calc(suf[p2]),calc(ans[p3])};
}
inline data calc(int l,int r){ data res=(data){0,0,0,0};
int tp=0; fp(i,l,r) asum[++tp]=a[i]+add;
fp(i,1,tp) res.sum+=asum[i],res.l=Max(res.l,res.sum); res.sum=0;
fd(i,tp,1) res.sum+=asum[i],res.r=Max(res.r,res.sum); ll mi=0;
fp(i,1,tp) asum[i]+=asum[i-1];
fp(i,1,tp) res.ans=Max(res.ans,asum[i]-mi),mi=Min(mi,asum[i]); return res;
}
inline ll fstcalc(int l,int r){ int tp=0; fp(i,l,r) asum[++tp]=a[i]+add;
fp(i,1,tp) asum[i]+=asum[i-1]; ll mi=0,ans=0;
fp(i,1,tp) ans=Max(ans,asum[i]-mi),mi=Min(mi,asum[i]); return ans;
}
}bl[(M/BL)+3];
int main(){ n=read(),m=read();
for(Rg int i=0,t=1;i<n;i+=BL,++t){
for(Rg int j=1;j<=BL&&i+j<=n;++j)
bl[t].a[j]=read(),pos[i+j]=t,bj[i+j]=j;
bl[t].siz=Min(n-i,BL),bl[t].rebuild();
} Rg int t,l,r; Rg ll x;
fp(i,1,m){ t=read(),l=read(),r=read();
if(t&1){ x=read();
if(pos[l]==pos[r]){
fp(i,bj[l],bj[r])
bl[pos[l]].a[i]+=x;
bl[pos[l]].rebuild();
} else{
fp(i,bj[l],BL) bl[pos[l]].a[i]+=x;
bl[pos[l]].rebuild();
fp(i,pos[l]+1,pos[r]-1) bl[i].lb_add(x);
fp(i,1,bj[r]) bl[pos[r]].a[i]+=x;
bl[pos[r]].rebuild();
}
} else{
if(pos[l]==pos[r]) print(bl[pos[l]].fstcalc(bj[l],bj[r]));
else{ data res=bl[pos[l]].calc(bj[l],BL);
fp(i,pos[l]+1,pos[r]-1) res=res+bl[i].val;
res=res+bl[pos[r]].calc(1,bj[r]),print(res.ans);
}
}
} return Ot(),0;
}

[Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?的更多相关文章

  1. openerp模块收藏 auto_setup 自动帮你完成建新库时必做几个操作(转载)

    auto_setup 自动帮你完成建新库时必做几个操作 原文:http://shine-it.net/index.php/topic,6777.0.html 模块地址: https://github. ...

  2. 遇到问题或bug时要做的事。

    1,做事细心,只有细心才能减少bug量,做总结. 2,开发中遇到bug和错误,第一要想到是程序代码的问题.而首先想到的不是其他问题(比如版本,框架或兼容问题等). 3,程序不能按照自己的意愿执行,时先 ...

  3. ARIMA模型——本质上是error和t-?时刻数据差分的线性模型!!!如果数据序列是非平稳的,并存在一定的增长或下降趋势,则需要对数据进行差分处理!ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数

    https://www.cnblogs.com/bradleon/p/6827109.html 文章里写得非常好,需详细看.尤其是arima的举例! 可以看到:ARIMA本质上是error和t-?时刻 ...

  4. 【扯淡篇】CTSC/APIO/SDOI R2时在干什么?有没有空?可以来做分母吗?

    注意: 我比较弱, 并没有办法把外链bgm搞成https, 所以大家可以选择"加载不安全的脚本"或者把https改成http以获得更好的阅读体验! 据说, 退役了要写写回忆录. 但 ...

  5. 2019年华南理工大学程序设计竞赛(春季赛) B 修仙时在做什么?有没有空?可以来炼丹吗?(思维建图搜索)

    https://ac.nowcoder.com/acm/contest/625/B 分析: 全部的状态只有1<<18 个 , 所以我们可以预处理 f[u][j] , 然后建立出全部的u可以 ...

  6. 2019华工校赛 B - 修仙时在做什么?有没有空?可以来炼丹吗?

    题目链接:https://ac.nowcoder.com/acm/contest/625/B 解法:这题其实就是求2^18个点内最近的两个点的距离.我们可以容易想到朴素解法:把每个点作为源点跑最短路取 ...

  7. iOS端临近封包时要做哪些事情?

    iOS封包前的注意事项: 0.功能测试,打点测试都已OK 1.创建case,使用master执行此轮case,修改版本号 2.建议使用各个系统的机型,如8,9,10,11,12, iPad等 3.ma ...

  8. javascript 使用 load 和 unload 事件,解决浏览器打开和关闭时需要做的操作。

    最近有一个业务,就是修改一个业务需要加上锁.也就是打开浏览器时,加锁.等用户操作完毕,关掉浏览器之后在把锁打开.一开始想问题很局限.只是想着,关闭浏览器解锁,刷新页面不做操作.然后就一直在找在调用un ...

  9. Mybatis与Spring集成时都做了什么?

    Mybatis是java开发者非常熟悉的ORM框架,Spring集成Mybatis更是我们的日常开发姿势. 本篇主要讲Mybatis与Spring集成所做的事情,让读过本文的开发者对Mybatis和S ...

随机推荐

  1. Golang 入门系列(一)Go环境搭建

    安装 Go Go语言的优劣,这里就不介绍了,下面直接讲Go 的安装: Go 的官方网站:http://golang.org/(需要FQ软件) 国内下载地址:http://www.golangtc.co ...

  2. 类别不平衡问题和Softmax回归

    目录 类别不平衡(class-imbalance) Softmax回归模型 类别不平衡(class-imbalance) 当不同类别的训练样本数目差别很大,则会对学习过程造成困扰.如有998个反例,但 ...

  3. 08-JavaScript中的函数

    JavaScript中的函数 1.函数简介 函数:就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 函数的作用: 将大量重复的语句写在函数里,以后需要这些语句的时候,可以直接调用函数,避免重 ...

  4. 基本环境安装: Centos7+Java+Hadoop+Spark+HBase+ES+Azkaban

    1.  安装VM14的方法在 人工智能标签中的<跨平台踩的大坑有提到> 2. CentOS分区设置: /boot:1024M,标准分区格式创建. swap:4096M,标准分区格式创建. ...

  5. 图论专题1考试Problem1

    Problem 1. bricksInput file: bricks.inOutput file: bricks.outTime limit: 1 secondjyb 在BUAA 天天被大神虐,所以 ...

  6. 合并K个有序数组(链表)【字节跳动面试算法题】

    本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...

  7. js身份证正则

    身份证正则 var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; if (!reg.test(IDCard)) {return false;}

  8. [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增

    题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...

  9. dl,dt,dd标签的使用

    dl就是定义一个列表 dt说明白了就是这个列表的标题dd就是内容,能缩进和UL,OL性质差不多 <dl> <dt>标题标题</dt> <dd>内容内容& ...

  10. 【CQOI2017】【BZOJ4813】小Q的棋盘 DFS

    题目描述 有一棵树,你要从\(0\)号点开始走,你可以走\(m\)步,问你最多能经过多少个不同的点. \(n\leq 100\) 题解 出题人的做法是DP(一个简单的树形DP),但是可以直接通过一次D ...