19-11-06-&
你&我处于这里……在一起?
$$\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-&的更多相关文章
- Update 19.11 for Azure Sphere
今天,微软发布了面向Azure Sphere的19.11更新,其主要亮点就是加入了对开发工具Visual Studio Code和Linux开发环境的支持.具体来讲,本次更新包含3个部分: 1. Az ...
- 11.06水题Test
11.06水题比赛 题目 描述 做法 \(BSOJ5150\) 求\(n\)个数两两之差的中位数 二分中位数,双指针判定\(\le x\)差值对数 \(BSOJ5151\) 求树的最大匹配和其个数 来 ...
- 软件工程项目组Z.XML会议记录 2013/11/06
软件工程项目组Z.XML会议记录 [例会时间]2013年11月06日星期二21:00-22:00 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]薛亚杰 会议整体流程 ...
- HDU6029 Happy Necklace 2017-05-07 19:11 45人阅读 评论(0) 收藏
Happy Necklace Time Limit: ...
- 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分
;;; 开机时自动启动的AutoHotkey脚本;; 此脚本修改时间 2019年06月18日20时48分;; 计时器创建代码段 ------------------------------------ ...
- 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏
触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...
- 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 ...
- 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 ...
- 2015/11/06 社保查询系统持续 挂机ing
- 善用VS中的Code Snippet来提高开发效率 分类: C# 2015-01-22 11:06 69人阅读 评论(0) 收藏
前言 在谈谈VS中的模板中,我介绍了如何创建项目/项模板,这种方式可以在创建项目时省却不少重复性的工作,从而提高开发效率.在创建好了项目和文件后,就得开始具体的编码了,这时又有了新的重复性工作,就是 ...
随机推荐
- HTTPS客户端的java实现
目录 https客户端 指定ssl算法套 浏览器可以作为客户端向服务器发送Http请求,当需要访问后台或第三方Restful接口时,也可以用java实现客户端直接发get/post请求,获取数据. h ...
- Reverses CodeForces - 906E (最小回文分解)
题意: 给你两个串s和t,其中t是由s中选择若干个不相交的区间翻转得到的,现在要求求出最少的翻转次数以及给出方案. 1≤|s|=|t|≤500000 题解: 我们将两个字符串合成成T=s1t1s2t2 ...
- 【POJ】1251 Jungle Roads
题目链接:http://poj.org/problem?id=1251 题意:n个村庄字母标号,每个字母后跟m个字母,表示该字母到mi的距离.求构建所有村庄道路的最短距离. 题解:最小生成树裸题.注意 ...
- 9款很棒的网页绘制图表JavaScript框架脚本
推荐9款很棒的可在网页中绘制图表的JavaScript脚本,这些有趣的JS脚本可以帮助你快速方便的绘制图表(线.面.饼.条…),其中包括jQuery.MooTools.Prototype和一些其它的J ...
- C++ vector操作--往列表中添加或更新内容
有个列表,往里面添加内容,如果对象已存在,只更新其属性,否则添加新一项. #include <iostream> #include <string> #include < ...
- iOS开发系列-Shell脚本生成IPA
概述 在公司开发到了测试阶段需要频繁打包交付给测试,看似简单的工作,重复的流程总是感觉不是那么好,我们可以借助苹果提供的编译指令编译项目. 自动化脚本编译打包IPA 常见的iOS项目就是基于xcode ...
- iOS音频开发系列-概述篇
概述 iOS中对于音频的处理,苹果提供了两个库. AVFoundation AudioToolbox 在iOS系统中apple对上述的流程进行了封装并提供了不同层次的接口
- PHP算法之Z 字形变换
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I RE T ...
- 关于soapui如何做安全测试
1.首先安装soapui5.1.2 第一步:运行SoapUI-Pro-x32-5.1.2_576024.exe文件,按照步骤安装成功: 第二步:拷贝Protection-4.6.jar到soapui安 ...
- bzoj 1196: [HNOI2006]公路修建问题(二分+贪心)
传送门 解题思路 看到最大,肯定要先想二分答案.二分之后首先从小到大枚举\(k\)个小于\(lim\)的所有一级公路,然后用并查集连到一起,然后就在剩下的里面从小到大找n-1-k个二级公路,模仿最小生 ...