场外选手赛时只口胡出了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 没打记的更多相关文章

  1. Good Bye 2018 (A~F, H)

    目录 Codeforces 1091 A.New Year and the Christmas Ornament B.New Year and the Treasure Geolocation C.N ...

  2. Good Bye 2018

    Good Bye 2018 2018年最后一场CF,OVER! 弱弱的我只能做出3道A,B,D~~~~ 最后几分钟,感觉找到了C题的规律,结束的那一刻,提交了一发 "Wrong answer ...

  3. Codeforces Good Bye 2018

    咕bye 2018,因为我这场又咕咕咕了 无谓地感慨一句:时间过得真快啊(有毒 A.New Year and the Christmas Ornament 分类讨论后等差数列求和 又在凑字数了 #in ...

  4. 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. ...

  5. Codeforces:Good Bye 2018(题解)

    Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...

  6. Good Bye 2018题解

    Good Bye 2018题解 题解 CF1091A [New Year and the Christmas Ornament] 打完cf都忘记写题解了qwq 题意就是:给你一些黄,蓝,红的球,满足蓝 ...

  7. $2019$各种$WC$没去记

    \(2019\)各种\(WC\)没去记 太弱了去不了啊. 至少我联赛没退役是吧...(退役感++ 不过这个分数线还是有点让人自闭啊,划线人绝对有毒,有人关照一下空巢老人\(mona\)喵? 这里大概是 ...

  8. Lyft Level 5 Challenge 2018 - Final Round Div. 1没翻车记

    夜晚使人着迷.没有猝死非常感动. A:显然对于水平线段,只有横坐标的左端点为1的时候才可能对答案产生影响:对于竖直直线,如果要删一定是删去一段前缀.枚举竖直直线删到哪一条,记一下需要删几条水平线段就可 ...

  9. 2018第一发:记一次【Advanced Installer】打包之旅

    一.前言 2017年最后几天,你们都高高兴兴的跨年,博主还在加班制作.net安装包.因为年前要出来第一版的安装包,所以博主是加班加点啊.本来想用VS自带的制作工具,不过用过的人都知道,真是非常好(to ...

随机推荐

  1. SQL 字符串分割表函数

    --字符串分割表函数 ) ) declare @i int; declare @count int; ); ); declare @Index int; )) declare @rowID int; ...

  2. 前后台分离式开发(swagger)

    一.前后台分离开发(swagger) 1.安装maven 配置的maven环境变量 M2_HOME/MAVEN_HOME Path %M2_HOME%/bin 打开运行窗口:输入mvn -v,查看是否 ...

  3. 20155339 Exp5 MSF基础应用

    20155339 Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode. 答: exploit是通过自己选择的漏洞和载荷进行攻击的一个过程. pay ...

  4. Ueditor使用笔记

            富文本编辑器在javaweb项目中还是比较常见的,如:ckeditor.kindeditor.ueditor等.今天主要叙述的对象为ueditor,它属于百度的.闲话不多说,下面开始介 ...

  5. EZ 2018 1 21 2018noip第五次膜你赛

    这次分数普遍偏高,而且yu'ben'ao又AK了! 但是最后一题莫名爆0让我很感伤啊(搓了1个多小时的20分暴力)! 难度偏低,主要是T2没剪枝,炸了3个点. T1 这种SB题恐怕是千年难遇了,PJ- ...

  6. MFC 用ShellExecute打开外部文件

    知识点: 获取CListCtrl选中文本 用ShellExecute打开外部文件 一.CListCtrl::GetFirstSelectedItemPosition CListCtrl::GetFir ...

  7. mfc 类型间的强制转换

    一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行 ...

  8. 【HNOI2017】礼物

    题面 题解 显然两个手环只需要一个的亮度增加\(c \in [-m, m]\)和原题是等价的. 于是可以写成这样一个公式: \[ \sum_{i = 1} ^ n(x_i - y_{i+k} + c) ...

  9. [CF1010E]Store[kd-tree]

    题意 有一个长方体,不知道它的位置,给出 \(n\) 个一定在长方体内的点和 \(m\) 个一定不在的点,有 \(k\) 次询问,每次询问一个点是否 在.不在.不确定 在长方体内. \(n\leq 1 ...

  10. 设计模式 笔记 代理模式 Proxy

    //---------------------------15/04/21---------------------------- //Proxy 代理模式-----对象结构型模式 /* 1:意图: ...