当垃圾已经成为一种常态233333

A.旋转子段

考场上的$n^2$手残少了20分,555  (主要是因为实在打不出来$n^3$的做法所以写不了对拍?ccc为什么考场上没有想起有reverse()这么毒瘤的操作啊)

很显然要反转的区间两端一定是一对$i,a[i]$(具体谁在左谁在右看大小关系),因为如果不是的话它俩没啥用就完全可以去掉。

所以枚举所有的i和a[i]不断更新最优解就能得到答案,那么只要能够$O(1)$查询答案复杂度就可以保证了。不妨设当前枚举到的i<a[i],那么我们要查询的固定点个数可以分成三部分:$[1,i-1],[i,a[i]],[a[i]+1,n]$。前后两部分的贡献是静态的,直接预处理一个前缀和就行。中间这段需要考虑反转后哪些点成为了固定点,我们可以将所有的${i,a[i]}$二元组按照中轴分类,对于每类按照区间长度排序,这样就能查区间内又包含多少个能作出贡献的区间了。怎么按照中轴分类?第一关键字按$i+a[i]$排序就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define re register
using namespace std;
const int N=;
int a[N],pos[N],sum[N],ans,n,maxx;
int posl,posr;
struct qj
{
int l,r,len,rk,id;
}q[N];
bool cmp(qj x,qj y)
{
return x.l+x.r==y.l+y.r?(x.len<y.len):(x.l+x.r<y.l+y.r);
}
int main()
{
scanf("%d",&n);
for(re int i=;i<=n;i++)
{
scanf("%d",&a[i]);
q[i].l=min(i,a[i]),q[i].r=max(i,a[i]),q[i].len=q[i].r-q[i].l+,q[i].id=i;
if(a[i]==i)sum[i]=sum[i-]+;
else sum[i]=sum[i-];
}
sort(q+,q+n+,cmp);
int last=;
for(re int i=;i<=n;i++)
{
if(q[i].l+q[i].r!=last)
{
last=q[i].l+q[i].r;
q[i].rk=;
continue;
}
q[i].rk=q[i-].rk+;
}
for(re int i=;i<=n;i++)
ans=max(ans,sum[q[i].l-]+q[i].rk+sum[n]-sum[q[i].r]);
cout<<ans<<endl;
return ;
}

话说这题你们为什么要用vector啊?

B.走格子

考场第一眼:可以疯狂连边跑最短路

第二眼:第一眼想的是什么玩意这么复杂的规则显然是暴搜剪枝题

第三眼:那么我们开始搜叭!

然后正解就是建图跑最短路。

没什么可说的,预处理每个格子上下左右的第一面墙,以及离最近的墙的距离,建图dj。很考验码力的英语作文题

(只要你别像博主一样打错最短路其实没那么难调)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define pa pair<int,int>
using namespace std;
int n,m,mp[][],sx,sy,ex,ey;
int dx[]={,,,-},
dy[]={,,-,};
int len[][],U[][],D[][],L[][],R[][];
int id(int i,int j)
{
return (i-)*m+j;
}
int S,T;
queue<pa> q;
void ins(int x,int y,int ds)
{
if(mp[x][y]==&&!len[x][y])
len[x][y]=ds,q.push(make_pair(x,y));
}
int to[],nxt[],head[],tot,d[];
void add(int x,int y,int z,int op)
{
to[++tot]=y;
nxt[tot]=head[x];
d[tot]=z;
head[x]=tot;
if(op)add(y,x,z,);
}
void bfs()
{
while(!q.empty())
{
int x=q.front().first,y=q.front().second;
q.pop();
for(int i=;i<;i++)
ins(x+dx[i],y+dy[i],len[x][y]+);
}
}
void graph()
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]==)
{
if(mp[i][j-]==)L[i][j]=id(i,j);
else L[i][j]=L[i][j-];
if(mp[i-][j]==)U[i][j]=id(i,j);
else U[i][j]=U[i-][j];
}
for(int i=n;i;i--)
for(int j=m;j;j--)
if(mp[i][j]==)
{
if(mp[i][j+]==)R[i][j]=id(i,j);
else R[i][j]=R[i][j+];
if(mp[i+][j]==)D[i][j]=id(i,j);
else D[i][j]=D[i+][j];
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]==)
{
if(mp[i][j+]==)add(id(i,j),id(i,j+),,);
if(mp[i+][j]==)add(id(i,j),id(i+,j),,);
if(L[i][j]!=id(i,j))add(id(i,j),L[i][j],len[i][j],);
if(R[i][j]!=id(i,j))add(id(i,j),R[i][j],len[i][j],);
if(U[i][j]!=id(i,j))add(id(i,j),U[i][j],len[i][j],);
if(D[i][j]!=id(i,j))add(id(i,j),D[i][j],len[i][j],);
}
}
int vis[],dis[];
void dj()
{
priority_queue<pa> Q;
memset(dis,0x3f,sizeof(dis));
Q.push(make_pair(,S));
dis[S]=;
while(!Q.empty())
{
int x=Q.top().second;
Q.pop();
if(vis[x])continue;
vis[x]=;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(dis[y]>dis[x]+d[i])
{
dis[y]=dis[x]+d[i];
Q.push(make_pair(-dis[y],y));
}
}
}
} int main()
{
scanf("%d%d",&n,&m);
char str[];
for(int i=;i<=n;i++)
{
scanf("%s",str+);
for(int j=;j<=m;j++)
{
if(str[j]=='#')mp[i][j]=,q.push(make_pair(i,j));
else mp[i][j]=;
if(str[j]=='C')sx=i,sy=j;
else if(str[j]=='F')ex=i,ey=j;
}
}
S=id(sx,sy);T=id(ex,ey);
bfs();graph();dj();
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<mp[i][j]<<' ';
puts(" ");
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<R[i][j]<<' ';
puts(" ");
}*/
if(dis[T]==0x3f3f3f3f)puts("no");
else cout<<dis[T]<<endl;
return ;
}

玄学数组大小

C.柱状图

完全被题解按在地上摩擦

感觉看出屋顶高度与总代价的关系是一个单峰函数这点确实是瓶颈,只要得到这个性质直接上三分+暴力统计答案就能拿到60分。

剩下的还是戳上方题解吧,树状数组维护$h_i-i$和$h_i+i$确实想不到啊……绝对值不好处理可以排个序按照与屋顶的关键值($h_x-x||h_x+x$)的大小关系分成两类处理,屋顶左侧和右侧的点都是这样,所以要分四类。

随着屋顶的右移,右侧点的信息要拿出来放到左侧,一个小细节。复杂度$O(nlog^nlog^{maxh})$

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
#define pa pair<ll,ll>
const int N=;
int n;
ll h[N],ans=2e15;
struct info
{
ll val;int id;
friend bool operator < (info x,info y)
{
return x.val<y.val;
}
}L[N],R[N];
int lrk[N],rrk[N];
#define lb(x) ( (x) & (-x) )
struct bit
{
ll sum[N],cnt[N];
ll add(int x,ll sumv,ll cntv)
{
for( ;x<=n;x+=lb(x))
sum[x]+=sumv,cnt[x]+=cntv;
}
pa query(int x)
{
pa res=make_pair(,);
for( ;x;x-=lb(x))
res.first+=sum[x],res.second+=cnt[x];
return res;
}
pa qjquery(int x,int y)
{
if(x>y)return make_pair(,);
pa tmp1=query(y),tmp2=query(x-);
return make_pair(tmp1.first-tmp2.first,tmp1.second-tmp2.second);
}
}lbit,rbit;
int sch(info *x,ll val)
{
int l=,r=n;
while(l+<r)
{
int mid=l+r>>;
if(x[mid].val>val)r=mid;
else l=mid;
}
if(x[r].val<=val)return r;
else if(x[l].val<=val)return l;
else return ;
}
ll cacl(int x,ll he)
{
ll res=abs(h[x]-he);
int pos=sch(L,he-x);
pa cost=lbit.query(pos);
res+=(he-1LL*x)*cost.second-cost.first;
cost=lbit.qjquery(pos+,n);
res+=cost.first-(he-1LL*x)*cost.second; pos=sch(R,he+x);
cost=rbit.query(pos);
res+=(he+1LL*x)*cost.second-cost.first;
cost=rbit.qjquery(pos+,n);
res+=cost.first-(he+1LL*x)*cost.second;
return res;
} int main()
{
//freopen("dt.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld",&h[i]);
for(int i=;i<=n;i++)
{
L[i].val=h[i]-i,R[i].val=h[i]+i;
L[i].id=R[i].id=i;
}
sort(L+,L+n+);sort(R+,R+n+);
for(int i=;i<=n;i++)
lrk[L[i].id]=i,rrk[R[i].id]=i;
for(int i=;i<=n;i++)
rbit.add(rrk[i],R[rrk[i]].val,); for(int i=;i<=n;i++)
{
rbit.add(rrk[i],-R[rrk[i]].val,-);
ll lside=max((ll)i,(n-i+)*1LL),rside=2e9;
while(lside+<rside)
{
ll mid=lside+rside>>,lmid=mid-,rmid=mid;
ll lc=cacl(i,lmid),rc=cacl(i,rmid);
if(lc>=rc)lside=mid;
else rside=mid;
}
ans=min(ans,cacl(i,lside));
ans=min(ans,cacl(i,rside));
lbit.add(lrk[i],L[lrk[i]].val,);
}
cout<<ans<<endl;
return ;
}

疯狂make_pair

[NOIP模拟14]题解的更多相关文章

  1. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  2. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  3. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

  4. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  5. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  6. NOIP模拟 14

    垃圾成绩,一点都不稳定. 如果把数组开小的分得到的话..总分还挺不错.. 那又能怪谁,都快NOIP了还犯这种傻逼错误 nc哥是要阿卡的节奏..真是太强了 某kyh也不知道偷了谁的rp,分高的一批 wd ...

  7. [NOIP模拟13]题解

    A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...

  8. 8.3 NOIP 模拟12题解

    话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...

  9. 『7.3 NOIP模拟赛题解』

    T1 gift Description ​ 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物. ​ 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜 ...

随机推荐

  1. <Jmeter入门不放弃>之<2.常用功能>

    大家这里参考学习的时候,我就不在这里配截图了,因为需要你打开工具根据文档自己去找,才有印象,大家一定要启动JMeter!跟着理解操作 一.测试计划 用来描述一个性能测试,所有内容都是基于这个计划,这谁 ...

  2. NOIWC2019 懵逼记

    弱省蒟蒻,第一次也是最后一次来冬令营.. Day [-inf,-1] \(woc\)咋啥都听不懂,没错在下划水王. Day 0 白天上课继续划水..晚上跑去试机,骗了半天交互的分就滚了..半夜里竟然睡 ...

  3. 【Java架构:基础技术】一篇文章搞掂:Maven

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文基于<Maven 实战>一书进行总结和扩展,大家也可以自行研读此书. 一.Maven简介 1.1.什么是Maven ...

  4. 如何理解c和c++的复杂类型声明

    曾经碰到过让你迷惑不解.类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明. 我们将从每天都能碰到的较简单 ...

  5. Mac-VScode

    1) 安装 xcode. 打开App Store,搜索xcode,进行下载安装. 2)执行命令: xcode-select --install 3)安装VS Code https://code.vis ...

  6. C#cs编译成dll命令提示符

    csc /t:library  /out:F:\Provider.dll /r:F:\BPM.dll /r:F:\BPM.Server.dll F:\Provider.cs

  7. 服务发现和注册和Eureka

    一 Spring Cloud特点 # 约定优于配置 # 开箱即用,快速启动 # 适用于各种环境,可以部署在PC server或者 云环境 # 轻量级的组件 # 组件的支持很丰富,功能齐全 # 选型中立 ...

  8. 专业解决 MySQL 查询速度慢与性能差!

    Java技术栈 ,一般把连接数设置得大一些). 并发量:同一时刻数据库服务器处理的请求数量 3.超高的 CPU使用率:CPU资源耗尽出现宕机. 4.磁盘 IO:磁盘 IO性能突然下降.大量消耗磁盘性能 ...

  9. 微信公众号开发笔记-验证token

    开发 话不多说我们直接进入主题 我们先去微信公众号申请一个公众号: 申请完成之后我们找到开发下的基本配置 然后找到进行基本配置,我们需要一个url地址来验证,这里的地址必需要是外网,Token是我们任 ...

  10. springCloud的使用01-----服务的注册和发现

    1 搭建eureka注册服务器 1.1 创建springboot项目,导入相应的jar包依赖 <project xmlns="http://maven.apache.org/POM/4 ...