首页 > 其他分享 >Atcoder Grand Contest 062 D - Walk Around Neighborhood

Atcoder Grand Contest 062 D - Walk Around Neighborhood

时间:2023-05-26 23:47:43浏览次数:50  
标签:Atcoder 062 Neighborhood int dfrac 元素 ge le 步数

csy/bx wjz/bx

首先将 \(a\) 排序,如果 \(\sum\limits_{i=1}^{n-1}a_i<a_n\) 显然就是 \(-1\),否则必然有解。

先发现一个 trivial 的事情,就是答案一定位于 \([\dfrac{a_n}{2},a_n]\) 中,这是因为我们判掉无解的条件之后,我们必然可以用前面的步数走到以 \((a_n,0),(0,a_n),(-a_n,0),(0,-a_n)\) 为顶点的正方形上然后在边界上来回徘徊用掉剩下的步数,最后用掉 \(a_n\) 回到原点。而如果边长小于 \(\dfrac{a_n}{2}\),那那个 \(a_n\) 一用就横跨整个正方形了,肯定没法完成任务。

现在考虑枚举这个半径 \(d\),考虑 meet-in-the-middle,等价于我们要将所有步数分成两个集合 \(S,T\),使得它们都能走到以 \((d,0),(0,d),(-d,0),(0,-d)\) 为顶点的正方形上——显然只要能走上去,由于 \(\dfrac{a_n}{2}\le d\le a_n\),剩下的步数肯定都可以在边界上来回徘徊,而且根据对称性,两部分肯定可以汇合。因此我们现在只要 check 什么样的集合能够走到边界上即可,考虑 \(\le d\) 的那些元素,如果它们的和超过 \(d\) 那显然可以,否则,如果存在一个 \(>d\) 的元素 \(x\),满足 \(\le d\) 的元素之和 \(\ge x-d\),那我们肯定可以先走到 \((x-d,0)\) 然后一步走到 \((-d,0)\),否则可以证明是不行的。

从全局的角度考虑,因为 \(d\) 是超过最大元素的一半的,所以如果存在元素 \(>d\) 那肯定限制更松,显然是更有利的,并且这个元素肯定是越小越好,因此考虑找到 \(>d\) 的最小和次小元素 \(x,y\),显然 \(x\) 必然存在,因为 \(a_n\ge d\),但 \(y\) 有可能不存在,因此分情况讨论:

  • 如果 \(y\) 不存在,那么相当于我们要将 \(\le d\) 的元素分成两部分,大小分别 \(\ge x-d,\ge d\),直接 bitset 优化背包找到可能组合出来的和然后在里面 _Find_next 即可。
  • 如果 \(y\) 存在,那么要求分成的两部分大小分别 \(\ge x-d,\ge y-d\),同理 bitset 做。

时间复杂度 \(\dfrac{n^2}{\omega}\)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=2e5;
int n,a[MAXN+5];bitset<MAXN+5>f;
int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	sort(a+1,a+n+1);ll sum=0;for(int i=1;i<n;i++)sum+=a[i];
	if(sum<a[n])return puts("-1"),0;
	f[0]=1;
	for(int i=a[n]/2,j=0,s=0;i<=a[n];i++){
		while(j<n&&a[j+1]<i)f|=(f<<a[++j]),s+=a[j];
		int x=a[j+1]-i,y=(j==n-1)?i:(a[j+2]-i),pos=f._Find_next(x-1);
		if(s-pos>=y)return printf("%d\n",i),0;
	}
	return 0;
}

标签:Atcoder,062,Neighborhood,int,dfrac,元素,ge,le,步数
From: https://www.cnblogs.com/tzcwk/p/agc062D.html

相关文章

  • AtCoder Regular Contest 139 E Wazir
    洛谷传送门AtCoder传送门好题。这种题一般可以考虑,观察最优解的性质,对于性质计数。发现如果\(n,m\)均为偶数,可以放满。就是类似这样:#.#.#..#.#.##.#.#..#.#.#因此答案就是\(2\)。如果\(n,m\)有一个为偶数,不妨假设\(n\)为偶数。那么最优解形似:#.#...#..##..#......
  • 【atcoder begin 302】【e题 Isolation 】JAVA的快速输入输出
    importjava.io.*;importjava.util.HashSet;importjava.util.Set;/***@authorfishcanfly*/publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{//BufferedReaderbr=newBufferedReader(newInputStreamReader(......
  • AtCoder Beginner Contest 300(E,F)
    AtCoderBeginnerContest300(E,F)E(概率dp)E这个题意大致就是一开始有一个初始数\(x\)为\(1\),然后我们有一个骰子,最后得到的点数概率一样,为\(\frac{1}{6}\),如果这一次得到的点数为\(i\),那么\(x\)会变成\(i\timesx\),问最后得到数\(n\)的概率为多少先感性的分析一波,对于......
  • AtCoder Regular Contest 146 D >=<
    洛谷传送门AtCoder传送门考虑直接增量构造。把条件拆成形如\(a_u\gex\)时\(a_v\gets\max(a_v,y)\),连边,跑类似一个spfa的东西,就行了。这样一定能构造出一组和最小的解。code//Problem:D->=<//Contest:AtCoder-AtCoderRegularContest146//URL:http......
  • 【题解】CF1062E Company
    传送门先考虑如何求解区间LCA假设要我们求\(8\sim11\)的LCA。那么显然它们的LCA等效于8和11的LCA。发现8和11刚好是“最左”和“最右”的两个顶点,感性理解一下,就可以得出一个结论:区间LCA和dfs序最小的和最大的的LCA是等效的。(这个结论应该还......
  • AtCoder Beginner Contest 193 F Zebraness
    洛谷传送门AtCoder传送门复习一下最小割。考虑翻转横纵坐标和为奇数的颜色,那么就变成了,相邻两个格子,相同颜色产生\(1\)的贡献。一眼P4313文理分科。每个格子被分到\(S\)表示染黑,分到\(T\)表示染白。对于每两个相邻格子,建两个虚点,分别表示它们都染黑或者都染白的情况......
  • AtCoder Beginner Contest 302 H. Ball Collector 题解
    AtCoderBeginnerContest302H.BallCollector题意跳过。可以视作将\(a_i,b_i\)之间连了一条边,然后\(a_i,b_i\)之间只能选一个等价于对于一条边只能选择其一个端点。那么对于只包含树的联通块而言,如果都选择儿子节点,那么会有一个根节点无法被选择上;而对于包含至少一个......
  • AtCoder Beginner Contest 302(E,F,G)
    AtCoderBeginnerContest302(E,F,G)E(图,set)E这个题意大致为一开始给出\(n\)个点,没有一条边,后面陆续会有\(q\)次操作,以下两种方式\(1\),输入两个点,代表连接这两个点\(2\),输入一个点,意在把所有和这个点相连的边都删除每一次操作后我的都需要知道操作后还有多少个孤立无援的点(没......
  • AtCoder Regular Contest 132 E Paw
    洛谷传送门AtCoder传送门感觉挺educational的。观察最终形态,发现根据洞分段,有且只有一段没被覆盖,并且左端是向左的脚印,右端是向右的脚印。最终状态就这几种了,直接枚举,概率乘贡献即可。发现左端和右端不影响到对方是对称的,直接求出一边的概率。设\(f_i\)为\(i\)个洞,填......
  • AtCoder Regular Contest 132 F Takahashi The Strongest
    洛谷传送门AtCoder传送门没见过这种在新运算下做卷积的题,感觉挺新奇的。考虑Takahashi成为绝对赢家的必要条件,发现前提是Aoki和Snuke出的要相同。不妨将每种策略映射到一个四进制数(\(P\to1,R\to2,S\to3\)),定义运算\(x\otimesy=\begin{cases}x&x=y\\0......