你&我处于这里……在一起?

$$\text{%%%Wearry}$$

ZJ:

一遇到Wearry的思维题就得×得够呛。

考试心态炸裂,码上三个暴力然后就不知道该干啥了。

现在就想敲自己。

不要放弃一点点分!

37
Miemeng 20

00:00:22
0

00:00:23
0

00:00:23
20

00:00:23

摁 end 键就能找到我啦!

UPD:

××晚上梦见自己省三是不是要死了???

TJ:

先改了下T2,觉得再不写博客就AFO了非常妙然后先写个。

T2:

考试根本没想法,($12$的数据范围意思就是$O(N!) \sim O(1)$都……)

一点提示都没有(主要是自己太菜啥都没想出来)

首先应该转换题意。

如果你真的想把中间的变成最大的,为什么不把小的放在左右两边呢?

因为并没有规定最大值的位置。

这样的转换(感性理解)是正确的。

所以……

$10\%$算法

每次找区间最小值,然后比较它距离左右的距离,然后暴力向短的方向左右移。

不要问我为什么$10\%$,此算法并没有考虑同等大小的数的优先级。

$30\%$算法

考虑区间里如果有两个最小值怎么办?

从贪心的角度看,应该将距离左/右侧最小的进行移动。

我们证明这种操作的正确性。

现在有左右两个相同小的值,它们之间的值全部比它们大所以就不具体画出了。

那么我们就又有许多情况。

  右向左($B>A+k'$) 右向右($B<A+k'$)

左向左

$(A<B+k)$

先让左向左会更优

没有顺序的影响。

两种操作顺序不影响答案

左向右

$(A>B+k)$

有可能??

先让右向右答案更优

那么我们解简单不等式:

当$A<B$时我们先将左向左移动更优。

当$A>B$时我们先将右向右移动更优。

得到$30$分

#include <iostream>
#include <cstring>
#include <climits>
#include <cstdio>
// #include "debug.h"
#define N 111111 using namespace std; int len;
int arr[N],ans=0; void dfs(int l,int r){
if(l==r) return ;
int minn=INT_MAX,id;
for(int i=l;i<=r;i++){
if( minn > arr[i]){
minn = arr[i];
id = i;
}
else if( minn == arr[i] && min(r-id,id-l) > min(r-i,i-l)){
id = i;
}
}
if(r-id > id-l){
ans+=id-l;
for(int i=id;i>=l+1;i--)
arr[i]=arr[i-1];
arr[l]=minn;
dfs(l+1,r);
}
else{
ans+=r-id;
for(int i=id;i<=r-1;i++)
arr[i]=arr[i+1];
arr[r]=minn;
dfs(l,r-1);
}
}
int main(){
#ifndef LOCAL
freopen("time.in" ,"r",stdin);
freopen("time.out","w",stdout);
#endif
ios_base::sync_with_stdio(false);
cin>>len;
for(int i=1;i<=len;i++)
cin>>arr[i];
dfs(1,len);
cout<<ans<<endl;
}

$100\%$算法

我们已经在上面解决了许多的前趋问题,于是我们发现每次移动的答案贡献只有它向前/后比它大的块数,比它小的和等于它的全都会提前换到指定位置导致它没办法和它换(人家先占好坑了)。

那么用个全职权值树状数组。

#include <iostream>
#include <cstring>
#include <cstdio>
#define N 111111 using namespace std; int len;
int arr[N];
int pre[N],aft[N];
int ans;
namespace szsz{
int arr[N];
const int size=100010;
inline int lowbit(int x){
return x&(-x);
}
void add(int pos,int v){
while(pos<=size){
arr[pos]+=v;
pos+=lowbit(pos);
}
}
int query(int pos){
int res=0;
while(pos){
res+=arr[pos];
pos-=lowbit(pos);
}
return res;
}
void clear(){
memset(arr,0,sizeof arr);
}
}
int main(){
#ifndef LOCAL
freopen("time.in" ,"r",stdin);
freopen("time.out","w",stdout);
#endif
ios_base::sync_with_stdio(false);
cin>>len;
for(int i=1;i<=len;i++)
cin>>arr[i];
for(int i=1;i<=len;i++){
pre[i]=szsz::query(100000) - szsz::query(arr[i]);
szsz::add(arr[i],1);
}
szsz::clear();
for(int i=len;i>=1;i--){
aft[i]=szsz::query(100000) - szsz::query(arr[i]);
szsz::add(arr[i],1);
}
for(int i=1; i<=len; i++)
ans+=min(pre[i],aft[i]);
cout<<ans<<endl;
}

19-11-06-&的更多相关文章

  1. Update 19.11 for Azure Sphere

    今天,微软发布了面向Azure Sphere的19.11更新,其主要亮点就是加入了对开发工具Visual Studio Code和Linux开发环境的支持.具体来讲,本次更新包含3个部分: 1. Az ...

  2. 11.06水题Test

    11.06水题比赛 题目 描述 做法 \(BSOJ5150\) 求\(n\)个数两两之差的中位数 二分中位数,双指针判定\(\le x\)差值对数 \(BSOJ5151\) 求树的最大匹配和其个数 来 ...

  3. 软件工程项目组Z.XML会议记录 2013/11/06

    软件工程项目组Z.XML会议记录 [例会时间]2013年11月06日星期二21:00-22:00 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]薛亚杰 会议整体流程 ...

  4. HDU6029 Happy Necklace 2017-05-07 19:11 45人阅读 评论(0) 收藏

    Happy Necklace                                                                           Time Limit: ...

  5. 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分

    ;;; 开机时自动启动的AutoHotkey脚本;; 此脚本修改时间 2019年06月18日20时48分;; 计时器创建代码段 ------------------------------------ ...

  6. 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏

    触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...

  7. hdu 1053 (huffman coding, greedy algorithm, std::partition, std::priority_queue ) 分类: hdoj 2015-06-18 19:11 22人阅读 评论(0) 收藏

    huffman coding, greedy algorithm. std::priority_queue, std::partition, when i use the three commente ...

  8. Let the Balloon Rise 分类: HDU 2015-06-19 19:11 7人阅读 评论(0) 收藏

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  9. 2015/11/06 社保查询系统持续 挂机ing

  10. 善用VS中的Code Snippet来提高开发效率 分类: C# 2015-01-22 11:06 69人阅读 评论(0) 收藏

    前言  在谈谈VS中的模板中,我介绍了如何创建项目/项模板,这种方式可以在创建项目时省却不少重复性的工作,从而提高开发效率.在创建好了项目和文件后,就得开始具体的编码了,这时又有了新的重复性工作,就是 ...

随机推荐

  1. FlyMcu下载时的问题

    引用:http://www.openedv.com/forum.php?mod=viewthread&tid=69398&page=1#pid396135 和楼下李智鹏用普中科技的ST ...

  2. 今天真的很SB

    在公司Review系统网页上,写了一篇几百字的作文, 然后突然手一抖,竟然没有保存就切换页面了, 赶快退回来...没了,啥都没了... 怎么办... 还好洒家N久之前看了一本什么什么杂七杂八的书, 里 ...

  3. vue 父子组件、兄弟组件传值

    参考文章:Vue2.0子同级组件之间数据交互 1.父组件可以使用 props 把数据传给子组件.2.子组件可以使用 $emit 触发父组件的自定义事件. (一)父组件给子组件传值,关键字:props ...

  4. DOM基础及事件基础

    DOM:功能:控制html文档的内容代码:获取页面标签(元素)对象 Element document.getElementById("id值"):通过元素id获取元素对象操作Ele ...

  5. abstract类中method

    一.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 都不可以,因为abstract申明的方法是要求子类去实现的,abstrac ...

  6. Django ORM 之基于对象、双下划线查询

    返回ORM目录 Django ORM 内容目录: 一. 基于对象的表查询 二. 基于双下划线的查询 三. 聚合查询 aggregate 四. 分组查询 annotate 一. 基于对象的表查询 1.正 ...

  7. JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值

    随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...

  8. codeforces 1180E Serge and Dining Room 线段树

    题目传送门 题目大意: 给出a序列和b序列,a序列为各种食物的价格,b序列为一列排着队的小朋友拥有的钱,小朋友依次购买食物,每个人都买自己能买的起的最贵的食物,买不起就离开队伍.给出q次操作,操作1是 ...

  9. 基于vue,通过父组件触发子组件的请求,等请求完毕以后,显示子组件,同时隐藏父组件

    正常情况下,子组件应该尽量减少业务逻辑,而应该将业务逻辑放到父组件里面,从而减少耦合,但是当 我们不得不用到这种情况时,可以采用下面的思路 解决方案 尽量将请求单独作为一个函数(不要将请求放到show ...

  10. 最大流Dinic算法的一些优化 [网络流][最大流]

    明天省夏要讲网络流啦!晚上翻出自己的模板发现是蓝书模板QwQ..拿出以前的提交代码(AC过的?) 曾经的提交记录 在luogu上重新提交一遍,结果gg...OVO 没有去除多余的inline 去除了多 ...