BZOJ4432 : [Cerc2015]Greenhouse Growth
对于高度相同的一段可以合并,用链表从左往右维护这些连续段,每段维护以下信息:
$l,r$:表示区间的左右端点。
$t,a$:表示在第$t$天结束时它的高度是$a$。
$b$:当阳光在左边时它是否会长高。
$c$:当阳光在右边时它是否会长高。
令$sa[i],sb[i]$分别表示前$i$天中阳光在左/右边的天数,那么显然第$i$天这一段的高度为$a+b(sa[i]-sa[t])+c(sb[i]-sb[t])$。
对于相邻的两段,根据其$b$和$c$,可以得出它们合并的时间。
一天一天进行模拟,每天只处理那一天可能发生的合并事件,然后重新计算新的合并发生的时间即可。
时间复杂度$O(n+m)$。
#include<cstdio>
const int N=300010,M=N*3;
int n,m,ca,cb,i,j,k,T,h[N],tot;char b[N];
int sa[N],sb[N],ga[N],gb[N],gab[N],v[M],nxt[M],ed;
struct P{int l,r,pre,nxt,t,a;bool b,c,del;}e[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;}
inline int ask(const P&p){return p.a+p.b*(ca-sa[p.t])+p.c*(cb-sb[p.t]);}
inline void cal(P&p){
p.b=ask(p)<ask(e[p.pre]);
p.c=ask(p)<ask(e[p.nxt]);
}
inline void merge(int o);
inline void check(int o){
P&p=e[o],&q=e[p.nxt];
int x=ask(p),y=ask(q),z=x<y?y-x:x-y;
if(!z)merge(o);
bool fa=(x>y)^p.b,fb=(x<y)^q.c;
if(fa&&fb){
if(ca+cb+z<=m)add(gab[ca+cb+z],o);
return;
}
if(fa){
if(ca+z<=m)add(ga[ca+z],o);
return;
}
if(fb){
if(cb+z<=m)add(gb[cb+z],o);
return;
}
}
inline void merge(int o){
P&p=e[o];
if(p.del||!p.nxt)return;
P&q=e[p.nxt];
int x=ask(p),y=ask(q);
if(x!=y)return;
q.del=1;
p.r=q.r;
p.nxt=q.nxt;
if(q.nxt)e[q.nxt].pre=o;
p.t=T,p.a=x;
cal(p);
if(p.pre)check(p.pre);
if(p.nxt)check(o);
}
int main(){
read(n),read(m);
for(i=1;i<=n;i++)read(h[i]);
for(i=1;i<=n;i=j){
for(j=i;j<=n&&h[i]==h[j];j++);
tot++;
e[tot].l=i,e[tot].r=j-1;
e[tot].a=h[i];
}
for(i=1;i<tot;i++)e[i].nxt=i+1;
for(i=2;i<=tot;i++)e[i].pre=i-1;
for(i=1;i<=tot;i++)cal(e[i]);
for(i=1;i<tot;i++)check(i);
scanf("%s",b+1);
for(T=1;T<=m;T++){
b[T]=='A'?ca++:cb++;
sa[T]=sa[T-1]+(b[T]=='A');
sb[T]=sb[T-1]+(b[T]=='B');
for(j=ga[ca];j;j=nxt[j])merge(v[j]);
for(j=gb[cb];j;j=nxt[j])merge(v[j]);
for(j=gab[T];j;j=nxt[j])merge(v[j]);
ga[ca]=gb[cb]=0;
}
for(i=1;i<=tot;i++)if(!e[i].del)for(k=ask(e[i]),j=e[i].l;j<=e[i].r;j++)h[j]=k;
for(i=1;i<=n;i++)printf("%d%c",h[i],i<n?' ':'\n');
return 0;
}
BZOJ4432 : [Cerc2015]Greenhouse Growth的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 表空间统计报告 Tablespace growth Report
SQL> select TS# from v$tablespace where name='ABC' ; TS# ---------- 6 set serverout on set verify ...
- FP - growth 发现频繁项集
FP - growth是一种比Apriori更高效的发现频繁项集的方法.FP是frequent pattern的简称,即常在一块儿出现的元素项的集合的模型.通过将数据集存储在一个特定的FP树上,然后发 ...
- [BZOJ 4436][Cerc2015]Kernel Knights
[Cerc2015]Kernel Knights Time Limit: 2 Sec Memory Limit: 512 MBSubmit: 5 Solved: 4[Submit][Status][D ...
- How to control PrincipalObjectAccess table growth in Microsoft Dynamics CRM 2011
https://support.microsoft.com/en-us/kb/2664150 How to control PrincipalObjectAccess table growth in ...
- Frequent Pattern 挖掘之二(FP Growth算法)(转)
FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...
- Error Domain=com.google.greenhouse Code=-102
*** Terminating app due to uncaught exception 'com.google.greenhouse', reason: 'Error Domain=com.goo ...
- FP—Growth算法
FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Apriori算法最大的不同有两点: 第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率,用31646条测试记录, ...
- 关联规则算法之FP growth算法
FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...
随机推荐
- lsattr chattr 文件安全设置
[root@test_android_client_download xianlaigames]# lsattr -------------e- ./jilinmj.apk[root@test_and ...
- python requests 正则爬虫
代码: import requests from multiprocessing import Pool from requests.exceptions import RequestExceptio ...
- WebApi服务以及跨域设置
WCF 它利用TCP.HTTP.MSMQ等传输协议构建“契约先行”的服务.WCF最初为基于SOAP的服务而设计[xml],繁琐.冗余.慢.沉重 WebApi 基于http协议,轻量级的,支持URL路由 ...
- 'mysql' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
1.C:\Users\Aiyufei>mysql -h 127.0.0.1 -u root'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件.解决方法: 配置环境变量即可,我的问 ...
- 使用Github Pages和Hexo构建个人博客
Github Pages可以创建免费的静态站点,支持自带主题.支持自制页面等,并且可以使用Jekyll或者Hexo等静态博客框架进行管理. 独立博客是博客园等博客平台之外的一个良好补充,相比使用虚拟主 ...
- ASP.NET Web Api 2 接口API文档美化之Swagger
使用第三方提供的swgger ui 可有效提高 web api 接口列表的阅读性,并且可以在页面中测试服务接口. 但本人在查阅大量资料并进行编码测试后,发现大部分的swagger实例并不能有效运行.例 ...
- OpenGL的gl.h出现一堆错误,如重定义什么的
问题:生成时提示 gl.h中出现一堆错误,如 error C2144: 语法错误 : "void"的前面应有";" error C2182: "API ...
- python manage.py runserver指定端口和ip
python manage.py runserver 0.0.0.0:8000 在本地运行程序,python manager.py runserver打开http://127.0.0.1:5000端口 ...
- sparkStreaming消费kafka-1.0.1方式:direct方式(存储offset到Hbase)
话不多说,可以看上篇博文,关于offset存储到zookeeper https://www.cnblogs.com/niutao/p/10547718.html 本篇博文主要告诉你如何将offset写 ...
- TensorFlow图像预处理-函数
更多的基本的API请参看TensorFlow中文社区:http://www.tensorfly.cn/tfdoc/api_docs/python/array_ops.html 下面是实验的代码,可以参 ...