当垃圾已经成为一种常态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. hdu 6085 Rikka with Candies (set计数)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  2. 函数————swap

    swap(vec[i],vec[j]); 交换两个元素.

  3. toleft时设置TabSequence属性为tsReversetoright时设置TabSequence属性为tsStandard

    使用这2人控件时,属性taborientation设为toleft时有个问题,具体如下设为toleft时tab会跑到左侧,这时的tab上的文字是反的.当设置为toright时,tab在右侧,这时的ta ...

  4. LOJ 2720 「NOI2018」你的名字——后缀自动机

    题目:https://loj.ac/problem/2720 自己总是分不清 “SAM上一个点的 len[ ] ” 和 “一个串的前缀在 SAM 上匹配的 len ”. 于是原本想的 68 分做法是, ...

  5. 【Shiro】三、Apache Shiro认证

    配置好并获取到SecurityManager,代表Shiro正常运行起来了,可以使用Shiro的其它功能. 1.认证流程(API的使用流程) 认证的数据: Principals:标识 ·识别Subje ...

  6. python 的装饰器,

    昨天去面试,发现了装饰器还是不太熟悉, 笔试题目是: 随意编写两个对输入参数做加减乘除运算的函数(需要有除法),写完后,用装饰器实现对函数出现除数为0的异常捕获,如果有异常,使用print打印日志. ...

  7. vue入门例子

    vue入门例子 1.声明示渲染        {{message}} 2.绑定事件 v-bind 3.控制切换一个程序是否显示        v-if 4.渲染循环                  ...

  8. java 并发——synchronized

    java 并发--synchronized 介绍 在平常我们开发的过程中可能会遇到线程安全性的问题,为了保证线程之间操作数据的正确性,我们第一想到的可能就是使用 synchronized 并且 syn ...

  9. Java.math.BigDecimal.abs()方法

    java.math.BigDecimal.abs()返回一个BigDecimal,其值是此BigDecimal的绝对值,其标度是this.scale(). 声明 以下是java.math.BigDec ...

  10. jmeter 响应超时时间设置 压力增大,不能正常退出全部线程

    当压力增大会出现connect timeout error 压力增大,不能正常退出全部线程: 解决办法:http request default--advance--timeouts 如填写1,表示大 ...