上海快速网站建设,上海app开发,免费h5模板,wordpress多页面统一头部CF1119G. Get Ready for the Battle
题目描述
Solution
妙妙构造题。 考虑这样一个过程#xff1a;所有人一起打第一个怪#xff0c;每次打nnn#xff0c;最后剩下k1nk_1nk1n#xff0c;就找一些加起来正好为k1k_1k1的组打掉k1k_1k1#xff0c;剩下的…CF1119G. Get Ready for the Battle
题目描述
Solution
妙妙构造题。 考虑这样一个过程所有人一起打第一个怪每次打nnn最后剩下k1nk_1nk1n就找一些加起来正好为k1k_1k1的组打掉k1k_1k1剩下的n−k1n-k_1n−k1打第二个怪然后重复打nnn余数k2k_2k2找一些组正好打掉这样一个过程直到剩下最后一个怪打玩n−km−1n-k_{m-1}n−km−1再一直打nnn到非正。
若能够构造s1..ms_{1..m}s1..m满足可以配成k1...km−1k_1...k_{m-1}k1...km−1中的任意数。 即可求出答案为⌈∑ain⌉\lceil \frac{\sum a_i}{n} \rceil⌈n∑ai⌉。
于是我们将kkk排序令siki1−kis_ik_{i1}-k_{i}siki1−kismn−km−1s_mn-k_{m-1}smn−km−1可以满足任意kik_iki为sss前缀和中的一个。
构造完sis_isi之后事实上只需要用a1a_1a1依次减s[1...m]s[1...m]s[1...m]减完s[m]s[m]s[m]之后再从s[1]s[1]s[1]开始减。若减的过程中a1≤0a_1\leq 0a1≤0则用a2a_2a2继续减直到am≤0a_m\leq 0am≤0。
事实上这样做a1..(m−1)a_{1..(m-1)}a1..(m−1)都会减为0达到最优解。 原因参照下例 a1−n−n−...−n−k10a_1-n-n-...-n-k_10a1−n−n−...−n−k10 a2−(n−k1)%n−n−n−...−n−k20a_2-(n-k1)\%n-n-n-...-n-k_20a2−(n−k1)%n−n−n−...−n−k20 a3−(n−k2)%n−n−n−...−n−k30a_3-(n-k2)\%n-n-n-...-n-k_30a3−(n−k2)%n−n−n−...−n−k30 .................. am−(n−km−1)%n−n−n−...−n≤0a_m-(n-k_{m-1})\%n-n-n-...-n\leq0am−(n−km−1)%n−n−n−...−n≤0 kik_iki与(n−ki)(n-k_i)(n−ki)配成一段连续的s[1..m]s[1..m]s[1..m]。
且不可能出现如下情况 a1−n−n−...−n−k10a_1-n-n-...-n-k_10a1−n−n−...−n−k10 a2−k20(a2(n−k1)%n)a_2-k_20\;\;(a_2(n-k1)\%n)a2−k20(a2(n−k1)%n) ..................
因为k2(a1a2)%nk_2(a_1a_2)\%nk2(a1a2)%n因此k2(k1k2)%nk_2(k_1k_2)\%nk2(k1k2)%n则k1%n0k_1\%n0k1%n0则k10k_10k10。
因此按此过程一定是按s[1..m]s[1..m]s[1..m]连续减下去减完s[m]s[m]s[m]从s[1]s[1]s[1]继续减下去。
Code讲述凌乱理解代码体验极佳
#include vector
#include list
#include map
#include set
#include deque
#include queue
#include stack
#include bitset
#include algorithm
#include functional
#include numeric
#include utility
#include sstream
#include iostream
#include iomanip
#include cstdio
#include cmath
#include cstdlib
#include cctype
#include string
#include cstring
#include ctime
#include cassert
#include string.h
//#include unordered_set
//#include unordered_map
//#include bits/stdc.h#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i(a);i(b);i)
#define fi first
#define se secondusing namespace std;templatetypename Tinline bool upmin(T x,T y) { return yx?xy,1:0; }
templatetypename Tinline bool upmax(T x,T y) { return xy?xy,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pairint,int PR;
typedef vectorint VI;const lod eps1e-11;
const lod piacos(-1);
const int oo130;
const ll loo1ll62;
const int MAXN1000005;
const ll INF1ll60;
/*--------------------------------------------------------------------*/
inline int read()
{int f1,x0; char cgetchar();while (c0||c9) { if (c-) f-1; cgetchar(); }while (c0c9) { x(x3)(x1)(c^48); cgetchar(); }return x*f;
}
VI Ans;
int a[MAXN],b[MAXN],s[MAXN];
int main()
{int nread(),mread(),sum0; b[1]n;for (int i1;im;i) sum(a[i]read()),b[i1]sum%n;sort(b1,bm1);for (int i1;im;i) s[i]b[i]-b[i-1];for (int i1,id0;im;i){int ta[i];while (t0) Ans.PB(i),t-s[id%m1],id;}printf(%d\n,(sum-1)/n1);while (Ans.size()%m) Ans.PB(1);for (int i1;im;i) printf(%d%c,s[i], \n[i%m0]);for (int i0;iAns.size();i) printf(%d%c,Ans[i], \n[(i1)%m0]);return 0;
}