前言:

真的是不容易啊。这个题在考场上想到了最关键的性质,但是没写出来。

后来写出来,一直调,小错不断。

没想到改的最后一个错误是两个int 乘起来爆了int

其实最后我还是觉得复杂度很假。\(n^2\) 过百万。

此处对拍使用了DeepinC的代码,计算正确答案使用了硕队和张大仙的代码,感谢。

不过我感觉写的太罗嗦了,200行。

解析:

容易发现,每个建筑长高,当且仅当它左右都比它高。于是考场上我扫了一边,拿到了0分的好成绩。

因为如果这样想的话,一个建筑是可以长高多次的。假如有一个序列 \(a_1>a_2>a_3<a_4<a_5\)

那么\(a_3\)可能会长高到和旁边的\(a_2,a_4\)一样高,然后,\(a_2,a_3,a_4\)再同时长到和\(a_1,a_5\)一样高。

所以我们考虑用队列维护一下,队列中维护每个建筑(或高度相同且连续的建筑块)。每次尝试让它长高。

二次函数解析式真的挺恶心,算对称轴的时候还要扫一边这个建筑块统治的区间。(这也是我觉得复杂度很假的原因)

而且因为在左右两边的建筑,函数解析式和在中间的不一样,所以貌似需要分类讨论一下。。。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000000+10,Inf=1e9+7;
int a[maxn],b[maxn];
int n,c,head,tail;
ll ans;
struct node{
int l,r,val;
node(){}
node(int x,int y,int z){
l=x;
r=y;
val=z;
}
};
queue <node> q;
void get_ans(){
for(int i=1;i<=n;++i){
int t=b[i]-a[i];
ans+=1ll*t*t;
}
for(int i=2;i<=n;++i) ans+=1ll*c*abs(b[i]-b[i-1]);
}
void Merge(){
ll d,e,t1,t2,res1,res2,f,g;
while(!q.empty()){
node t=q.front();
q.pop();
if(t.l==0&&t.r==n+1) break;
if(!(t.val<b[t.l]&&t.val<b[t.r])) continue;
if(t.l==0){
e=b[t.r]-t.val;
d=t.r-t.l-1;
t1=c;
for(int i=t.l+1;i<t.r;++i) t1-=2*(b[i]-a[i]);
t1/=(d*2);
t2=t1+1;
t1=max(0ll,min(e,t1));
t2=max(0ll,min(e,t2));
res1=-t1*c+e*c;
for(int i=t.l+1;i<t.r;++i){
ll sss1=t1+b[i]-a[i];
res1+=sss1*sss1;
}
res2=-t2*c+e*c;
for(int i=t.l+1;i<t.r;++i){
ll sss2=t2+b[i]-a[i];
res2+=sss2*sss2;
}
if(res1>res2) swap(t1,t2);
for(int i=t.l+1;i<t.r;++i) b[i]+=t1;
if(t1==e){
tail=t.r;
while(b[tail]==t.val+t1) tail++;
q.push(node(0,tail,t.val+t1));
}
}else if(t.r==n+1){
e=b[t.l]-t.val;
d=t.r-t.l-1;
t1=c;
for(int i=t.l+1;i<t.r;++i) t1-=2*(b[i]-a[i]);
t1/=(d*2);
t2=t1+1;
t1=max(0ll,min(e,t1));
t2=max(0ll,min(e,t2));
res1=-t1*c+e*c;
for(int i=t.l+1;i<t.r;++i){
ll sss1=t1+b[i]-a[i];
res1+=sss1*sss1;
}
res2=-t2*c+e*c;
for(int i=t.l+1;i<t.r;++i){
ll sss2=t2+b[i]-a[i];
res2+=sss2*sss2;
}
if(res1>res2) swap(t1,t2);
for(int i=t.l+1;i<t.r;++i) b[i]+=t1;
if(t1==e){
head=t.l;
while(b[head]==t.val+t1) head--;
q.push(node(head,n+1,t.val+t1));
}
}else{
if(b[t.l]<b[t.r]){
e=b[t.l]-t.val;
f=b[t.l]+b[t.r]-t.val*2;
d=t.r-t.l-1;
t1=c;
for(int i=t.l+1;i<t.r;++i) t1-=b[i]-a[i];
t1/=d;
t2=t1+1;
t1=max(0ll,min(e,t1));
t2=max(0ll,min(e,t2));
res1=-2*t1*c+f*c;
res2=-2*t2*c+f*c;
for(int i=t.l+1;i<t.r;++i){
ll sss1=t1+b[i]-a[i];
res1+=sss1*sss1;
}
for(int i=t.l+1;i<t.r;++i){
ll sss2=t2+b[i]-a[i];
res2+=sss2*sss2;
}
if(res1>res2) swap(t1,t2);
for(int i=t.l+1;i<t.r;++i) b[i]+=t1;
if(t1==e){
head=t.l;
while(b[head]==t.val+t1) head--;
q.push(node(head,t.r,t.val+t1));
}
}else if(b[t.l]==b[t.r]){
e=b[t.l]-t.val;
f=b[t.l]+b[t.r]-t.val*2;
d=t.r-t.l-1;
t1=c;
for(int i=t.l+1;i<t.r;++i) t1-=b[i]-a[i];
t1/=d;
t2=t1+1;
t1=max(0ll,min(e,t1));
t2=max(0ll,min(e,t2));
res1=-2*t1*c+f*c;
res2=-2*t2*c+f*c;
for(int i=t.l+1;i<t.r;++i){
ll sss1=t1+b[i]-a[i];
res1+=sss1*sss1;
}
for(int i=t.l+1;i<t.r;++i){
ll sss2=t2+b[i]-a[i];
res2+=sss2*sss2;
}
if(res1>res2) swap(t1,t2);
for(int i=t.l+1;i<t.r;++i) b[i]+=t1;
if(t1==e){
head=t.l;
tail=t.r;
while(b[head]==t.val+t1) head--;
while(b[tail]==t.val+t1) tail++;
q.push(node(head,tail,t.val+t1));
}
}else{
e=b[t.r]-t.val;
d=t.r-t.l-1;
f=b[t.l]+b[t.r]-t.val*2;
t1=c;
for(int i=t.l+1;i<t.r;++i) t1-=b[i]-a[i];
t1/=d;
t2=t1+1;
t1=max(0ll,min(e,t1));
t2=max(0ll,min(e,t2));
res1=-2*t1*c+f*c;
res2=-2*t2*c+f*c;
for(int i=t.l+1;i<t.r;++i){
ll sss1=t1+b[i]-a[i];
res1+=sss1*sss1;
}
for(int i=t.l+1;i<t.r;++i){
ll sss2=t2+b[i]-a[i];
res2+=sss2*sss2;
}
if(res1>res2) swap(t1,t2);
for(int i=t.l+1;i<t.r;++i) b[i]+=t1;
if(t1==e){
tail=t.r;
while(b[tail]==t.val+t1) tail++;
q.push(node(t.l,tail,t.val+t1));
}
}
}
}
}
void Solve(){
scanf("%d%d",&n,&c);
for(int i=1;i<=n;++i) scanf("%d",&b[i]);
b[0]=Inf;
b[n+1]=Inf;
int i=1;
while(i<=n){
int l=i-1;
int r=i+1;
while(b[r]==b[i]) r++;
q.push(node(l,r,b[i]));
i=r;
}
memcpy(a,b,sizeof(b));
a[0]=Inf;
a[n+1]=Inf;
Merge();
get_ans();
printf("%lld\n",ans);
}
int main(){
//freopen("construct.in","r",stdin);
//freopen("construct.out","w",stdout);
Solve();
return 0;
}

模拟赛18 T1 施工 题解的更多相关文章

  1. 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]

    T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...

  2. 模拟赛DAY1 T1大美江湖

    这就是一个模拟题,注意1234分别对应左右上下横坐标和纵坐标的判断就好了 题解: 需要注意的是,向上取整ceil函数是对于一个double值返回一个double值,也就是说在ceil里面的类型一定要是 ...

  3. [noi.ac省选模拟赛]第12场题解集合

    题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...

  4. [noi.ac省选模拟赛]第10场题解集合

    题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...

  5. 蓝桥杯大学B组省赛2020模拟赛(一)题解与总结

    题目链接:https://www.jisuanke.com/contest/6516 A:题目: 我们称一个数是质数,而且数位中出现了 5 的数字是有趣的. 例如 5, 59, 457.求1到1000 ...

  6. DYOJ 【20220303模拟赛】最少分组 题解

    最少分组 题意 \(n\) 个点 \(m\) 条边的无向图,可以删掉 0 条或多条边,求满足条件的最小连通块数量: 对每个顶点对 \((a,b)\) ,若 \(a\) 和 \(b\) 同属于一个连通块 ...

  7. 2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1

    回形遍历( calc .cpp/c/pas) 时间限制:1s内存 限制: 256MB [问题 描 述] 给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子. [输入] ...

  8. [noi.ac省选模拟赛]第11场题解集合

    题目   比赛界面. T1   比较简单.容易想到是求鱼竿的最大独立集.由于题目的鱼竿可以被分割为二分图,就可以想到最大匹配.   尝试建边之后会发现边的数量不小,但联系题目性质会发现对于一条鱼竿,它 ...

  9. 6.29模拟赛 (T1:李时珍的皮肤衣 T2:马大嘴的废话 T3:SSY的队列 T4:清理牛棚);

    啊,又是考炸的一天,成功的退步了三名,啊,成共的看错了T1  的题意 ,水了80分. 第十五名就是我,额,已经有点倒数的感觉了,并且一道题都没AC  我太难了. 好了,废话不多说了,下面正式提接: 这 ...

随机推荐

  1. 修改Typora的代码以支持文件夹和文件混合排序

    用Markdown文件写笔记,用文件夹做分类,整个笔记文档项目构成了一个树形结构.笔记文章之间.文章与分类之间经常有特定的先后顺序,于是就在文件名前面加上数字前缀来控制排序.但是,Windows的文件 ...

  2. centos7修改服务器时区

    查看时区设置 timedatectl 列出所有时区,通过键盘上下键进行浏览 timedatectl list-timezones 修改服务器时区为Africa/Lagos # 拉各斯的时区,UTC+1 ...

  3. 【第三篇】- Git 工作流程之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git 工作流程 本章节我们将为大家介绍 Git 的工作流程. 一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修 ...

  4. linux下分卷压缩,合并解压的3种方法

    我们上传东西的时候,由于文件过大而不能上传,或者不给上传,最明显的就是发邮件了,附件最大5M,有的10M.如果超过了就郁闷了.这个时候,如果能把压缩的东西,分割开来就比较爽了,windows下面我想大 ...

  5. reeswitch http https ws wss nginx domain default port config

    现代H5浏览器产业链越来越丰富,http+websocket+webrtc+sip组合已经是一种非常成熟的web原生音视频通讯解决方案 FreeSWITCH是一个开源的电话软交换平台,早在SIP年代就 ...

  6. Xamarin UIProgressView自定义

    Progress.ProgressImage = UIImage.FromFile ("progress.png"); Progress.TrackImage = UIImage. ...

  7. go语言游戏服务端开发(三)——服务机制

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例.   P2P网络为服务进程间.服务进程与客户端间通信提供了便利,在这个基础上可以搭建服务. 在服务层,通信包可以通过定义协议号来确定该包怎 ...

  8. 异步servlet的原理探究

    异步servlet是servlet3.0开始支持的,对于单次访问来讲,同步的servlet相比异步的servlet在响应时长上并不会带来变化(这也是常见的误区之一),但对于高并发的服务而言异步serv ...

  9. ecshop后台设置模板的地方显示自己新建模板的操作界面

    我建立了一个叫test.dwt文件怎样在后台设置模板里面出现呢.1首先找到ecshop目录下的languages\zh_cn\admin/template.php 这个php文件 当然如果这只是简体中 ...

  10. SpringBoot 如何进行对象复制,老鸟们都这么玩的!

    大家好,我是飘渺. 今天带来SpringBoot老鸟系列的第四篇,来聊聊在日常开发中如何优雅的实现对象复制. 首先我们看看为什么需要对象复制? 为什么需要对象复制 如上,是我们平时开发中最常见的三层M ...