Good Bye 2018 没打记
场外选手赛时只口胡出了CD感觉非常惨。只看了E并且还没看到题面里的wiki我能咋办
C:f只与gcd(n,k)有关。
D:考虑每种起始位置,对于跨越的两个排列,只有前一个排列的后缀单减时不产生贡献。答案就非常显然了。注意最后+1,因为这样没考虑n~1的排列。
E:根据题面给出的定理,n+1号点度数增大时,以该点在已从大到小排序的序列里的位置为分割点,k较大时不等式更难满足,k较小时不等式更易满足,且分割点位置左移。因此每一个位置存在一个连续的合法区间,区间并即为答案,显然其也是一个连续区间。找到任意一个合法答案后二分即可。这个任意答案也可以二分得到,具体地,根据n+1号点度数所在位置及其右边位置是否合法决定二分方向。不等式显然可以树状数组优化一下检验(甚至可以线性?)。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 500010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N],b[N],tree_size[N],isodd,down,up;
ll tree_sum[N];
void ins(int x){for (int i=x+;i<=n+;i+=i&-i) tree_size[i]++,tree_sum[i]+=x;}
int query_size(int k){int s=;k++;while (k) s+=tree_size[k],k-=k&-k;return s;}
ll query_sum(int k){ll s=;k++;while (k) s+=tree_sum[k],k-=k&-k;return s;}
int findanyans()
{
int l=,r=(n>>)+;
while (l<=r)
{
int mid=l+r>>,k=mid<<|isodd;
if (k>n) r=mid-;
else
{
memset(tree_sum,,sizeof(tree_sum));
memset(tree_size,,sizeof(tree_size));
for (int i=;i<=n;i++) b[i]=a[i];b[n+]=;
int pos=;
for (int i=;i<=n+;i++)
if (b[i]<k)
{
for (int j=n+;j>i;j--) b[j]=b[j-];
b[i]=k;pos=i;break;
}
if (pos==) pos=n+;
ll s=;for (int i=;i<=n+;i++) s+=b[i];
bool flag=;
for (int i=n+;i>=pos;i--)
{
if (s>1ll*i*(i-)+1ll*i*((n+-i)-query_size(i))+query_sum(i)) {flag=;break;}
s-=b[i];ins(b[i]);
}
if (!flag) r=mid-;
else
{
for (int i=pos-;i>=;i--)
{
if (s>1ll*i*(i-)+1ll*i*((n+-i)-query_size(i))+query_sum(i)) {flag=;break;}
s-=b[i];ins(b[i]);
}
if (flag) return mid;else l=mid+;
}
}
}
return -;
}
bool check(int mid)
{
mid<<=,mid+=isodd;
if (mid>n) return ;
memset(tree_sum,,sizeof(tree_sum));
memset(tree_size,,sizeof(tree_size));
for (int i=;i<=n;i++) b[i]=a[i];b[n+]=;
for (int i=;i<=n+;i++)
if (b[i]<mid)
{
for (int j=n+;j>i;j--) b[j]=b[j-];
b[i]=mid;break;
}
ll s=;for (int i=;i<=n+;i++) s+=b[i];
for (int i=n+;i>=;i--)
{
if (s>1ll*i*(i-)+1ll*i*((n+-i)-query_size(i))+query_sum(i)) return ;
s-=b[i];ins(b[i]);
}
return ;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("e.in","r",stdin);
freopen("e.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
sort(a+,a+n+);reverse(a+,a+n+);
for (int i=;i<=n;i++) isodd^=a[i]&;
down=up=findanyans();
if (down==-) {cout<<-;return ;}
int l=,r=down;
while (l<=r)
{
int mid=l+r>>;
if (check(mid)) down=mid,r=mid-;
else l=mid+;
}
l=up,r=(n>>)+;
while (l<=r)
{
int mid=l+r>>;
if (check(mid)) up=mid,l=mid+;
else r=mid-;
}
for (int i=down;i<=up;i++) printf("%d ",i<<|isodd);
return ;
}
F:显然每一段都是前一部分步行/游泳,后一部分飞。同样显然的是最后把精力值用完才是最优的,于是总飞行时间也固定了。现在所要做的就是尽量使用游泳来攒精力。那么当处于游泳路段时,只要精力值不会多余就攒精力,否则直接飞到终点。处于步行路段时,只要能满足之后强制飞行路段的需求就飞,否则步行攒精力。怎么这么简单啊?然后才发现原来还有原地徘徊这种操作。不过事实上只要根据后面的需求延长路径且尽量在游泳路段延长就行了?
Good Bye 2018 没打记的更多相关文章
- Good Bye 2018 (A~F, H)
目录 Codeforces 1091 A.New Year and the Christmas Ornament B.New Year and the Treasure Geolocation C.N ...
- Good Bye 2018
Good Bye 2018 2018年最后一场CF,OVER! 弱弱的我只能做出3道A,B,D~~~~ 最后几分钟,感觉找到了C题的规律,结束的那一刻,提交了一发 "Wrong answer ...
- Codeforces Good Bye 2018
咕bye 2018,因为我这场又咕咕咕了 无谓地感慨一句:时间过得真快啊(有毒 A.New Year and the Christmas Ornament 分类讨论后等差数列求和 又在凑字数了 #in ...
- NOIP 2018 真・退役记
目录 NOIp 2018 真・退役记 7.01 7.05 \(summary\) 7.12 7.18 7.26 - 7.27 8.2 8.3 8.3 8.7 8.9 8.20 8.24 8.27 8. ...
- Codeforces:Good Bye 2018(题解)
Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...
- Good Bye 2018题解
Good Bye 2018题解 题解 CF1091A [New Year and the Christmas Ornament] 打完cf都忘记写题解了qwq 题意就是:给你一些黄,蓝,红的球,满足蓝 ...
- $2019$各种$WC$没去记
\(2019\)各种\(WC\)没去记 太弱了去不了啊. 至少我联赛没退役是吧...(退役感++ 不过这个分数线还是有点让人自闭啊,划线人绝对有毒,有人关照一下空巢老人\(mona\)喵? 这里大概是 ...
- Lyft Level 5 Challenge 2018 - Final Round Div. 1没翻车记
夜晚使人着迷.没有猝死非常感动. A:显然对于水平线段,只有横坐标的左端点为1的时候才可能对答案产生影响:对于竖直直线,如果要删一定是删去一段前缀.枚举竖直直线删到哪一条,记一下需要删几条水平线段就可 ...
- 2018第一发:记一次【Advanced Installer】打包之旅
一.前言 2017年最后几天,你们都高高兴兴的跨年,博主还在加班制作.net安装包.因为年前要出来第一版的安装包,所以博主是加班加点啊.本来想用VS自带的制作工具,不过用过的人都知道,真是非常好(to ...
随机推荐
- Android 截取屏幕图片并保存
Android市场上有很多屏幕截图软件,把当前屏幕截取出来并保存,这一节我们就来看看屏幕截图的具体实现. 操作步骤: 1.创建一片屏幕大小的缓冲区,用于存放屏幕大小的图片 Bitmap bitmap ...
- POJ 2367 Genealogical tree 拓扑排序入门题
Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8003 Accepted: 5184 ...
- navicat 连接Oracle 报错:Cannot load OCI DLL, 126
1.64位win7 安装了oracle11g 使用Navicat for Oracle cannot load OCI DLL,126 解决方法:navicat 菜单中 -工具->选项-> ...
- URL Encode
用VC实现post数据常常会遇到URL编码问题 在此封装一个工具类进行UTF8编码的转换 源码来自php source code 只是简单的封装给C++调用 //URL 编解码类 //来自PHP源 ...
- 一个struts2程序
1.index.jsp 2.struts.xml 3.Loginaction.java package action; import java.io.File; import java.io.File ...
- OO——电梯作业总结
目录 电梯作业总结 程序结构与复杂度的分析 第一次作业 第二次作业 第三次作业 程序BUG的分析 互测 自动评测 有效性 总结 电梯作业总结 程序结构与复杂度的分析 第一次作业 1.设计思路 第一次作 ...
- EZ 2017 12 30 2018noip第二次膜你赛
去年的比赛了,然而今天才改好. 总体难度适中,有大佬AK. 主要是自己SB第二题没想出来,然后又是可怜的100来分. T1 一道二分+数学的题目. 我们可以二分叫的次数,然后用公式(等差数列,公差都是 ...
- Centos7下vim的table键修改为4个空格
1.要有root用户权限 2.已经安装vim 3.编辑/etc/vim/vimrc 文件,添加set ts=4 vim /etc/vimrc #按大写G到最后一行,添加set ts= set ts = ...
- Security7:管理SQL Server Agent的权限
SQL Server Agent对象包括警报(Alert),操作员(Operator),Job,调度(Schedule)和代理(Proxy),SQL Server使用msdb系统数据库管理Agent ...
- post请求参数Json字符串包含数组的校验和处理
传入参数类型 {"aaa":"aaaa","bbb":"bbb","ccc":"ccc&q ...