健美猫
来源:互联网 发布:计算机仿真 知乎 编辑:程序博客网 时间:2024/04/28 04:02
题目大意
旋转序列s使得
做法
大致思路是可以拆绝对值记录个数即贡献,顺着扫,对于一个位置有两个位置很关键。
(我都不知道我在说什么
#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int maxn=2000000+10;int s[maxn],h[maxn],go[maxn],nxt[maxn];bool bz[maxn];//0 + 1 -int i,j,k,l,t,n,m,tot,cnt;ll num,sum,ans;int read(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x*f;}void add(int x,int y){ go[++tot]=y; nxt[tot]=h[x]; h[x]=tot;}int main(){ n=read(); fo(i,1,n){ s[i]=read(); if (s[i]>1){ if (s[i]<=i) add(i-s[i]+1,i); else add(n-s[i]+i+1,i); } if (i+1>s[i]) num-=(ll)s[i],num+=(ll)(i+1),cnt--,bz[i]=1; else num+=(ll)s[i],num-=(ll)(i+1),cnt++,bz[i]=0; } ans=100000000000000; fo(i,1,n){ num+=(ll)cnt; ans=min(ans,num); num-=(ll)abs(s[i]-1); num+=(ll)abs(s[i]-(n+1)); if (bz[i]) cnt++;else cnt--; cnt--; bz[i]=1; t=h[i]; while (t){ k=go[t]; cnt++; cnt++; bz[k]=0; t=nxt[t]; } } printf("%lld\n",ans);}
阅读全文
0 0
- 健美猫
- 【JZOJ5343】【NOIP模拟】健美猫(模拟)
- 【jzoj5343】【NOIP2017模拟9.3A组】【健美猫】
- 健美动作讲解
- 北京健美健身场馆
- 健美动作讲解
- 儿子练健美
- 健美裤或喇叭裤
- 健美型男营养金字塔
- 三餐中的健美之计
- 健身健美补剂之蛋白粉
- 泡浴追求瘦身健美疗效
- 十大流行健美营养补剂
- 健美计步器-开启超智能健康生活
- 关于健美比赛后出现水肿状况
- 减掉腰间赘肉,做个健美男人(转载)
- 健身健美增大肌肉块的14大秘诀
- 舞蹈健美又健身 安定情绪改善睡眠质量
- 快速幂
- 深度学习网络调参技巧
- 自动人脸识别基本原理 --基于静态图像的识别算法(一)特征脸
- ado增删改查的几种方式
- C++全局变量值被修改
- 健美猫
- Android 登录demo
- IOS知识碎片
- Eclipse创建maven的maven-archetype-webapp项目时,进度一直卡在99%的解决办法
- ElasticSearch评分机制
- 数组与双重循环
- iOS UIView的圆角加阴影效果的实现
- 详细教程:将本地项目上传到github
- 笔试1之问题