题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 <=0 的方案.很好转移. 令 f[ S ] 表示选了点集 S ,且 S 整体就是最大前缀和的方案. 只会 3n 做出 f[ ] ,就是考虑容斥, \( f[s]=|s|! - \sum f[d]*dp[s^d] (sm[d]>=sm[s]) \) ,其中 sm[ s ] 表示点集 s 的权值和.…
原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这样的. 对于左边和右边分别考虑,我们可以发现: 左边:每一个后缀和都 >=0 右边:每一个前缀和都 <0 然后就只需要用两个 dp 分别求出每一个集合的元素的排列中分别满足上述条件的方案数即可. 注意一下题目要求最大前缀和非空. 代码 #include <bits/stdc++.h>…
这是个什么集合DP啊- 想过枚举断点但是不会处理接下来的问题了- 我好菜啊 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做这个题,于是小 C 决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小 C 是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上 \(n!\) 后对 \(998244353\)…
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i](p+1 \leq x \leq n)<0\) 我们可以以\(p\)分成两个集合 \(n\leq 20\),所以状压一下 \(sum[i]\)表示当前状态表示的和 \(f[i]\)表示用当前状态的数,组成最大前缀和为\(sum[i]\)的方案数 \(g[i]\)表示当前状态的数,组成的序列,每个前缀…
题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_{i=1}^pa_i\),这个位置\(p\)是最大前缀和的右界当且仅当对于\(\forall r>p\)有:\(\sum\limits_{i=p+1}^ra_i\leq0\) 设\(sum_i\)表示二进制状态\(i\)的代数和,方便转移 设\(g_i\)表示选了子集\(i\)后有多少种排列使得所有…
传送门 今天\(PKUWC\)试机的题 看着边上的大佬们一个个\(A\)穿咱还是不会-- 我们考虑枚举最大前缀和,如果一个前缀\(1\)到\(p\)是最大前缀和,那么\(p\)后面的所有前缀和都要小于\(0\) 于是我们设\(sum_S\)为子集\(S\)中所有元素的和,\(f_S\)为满足最大前缀和为\(sum_S\)的\(S\)的排列个数,那么我们可以枚举这个排列中位于第一个的数,只要剩下的数之和\(sum_{S-\{x\}}\)大于\(0\),那么\(f_S\)就可以加上\(f_{S-\{…
题目大意:给你一个$n(n\leqslant20)$项的数列$A$,设重排后的数列为$A'$,令$pre_p=\sum\limits_{i=1}^pA'_i$,求$max\{pre_i\}$的期望,乘$n!$ 题解:令$f_S$为选$S$集合的数,重排后满足$\max\{pre_i\}=\sum\limits_{i=1}^{|S|}S_i$的方案数,$g_S$为选$S$集合数,重排后满足$\max\{pre_i\}\leqslant0$的方案数.发现若数列$B$满足$\sum\limits_{i…
题解 神仙的状压啊QAQ 设一个\(f[S]\)表示数字的集合为\(S\)时\(sum[S]\)为前缀最大值的方案数 \(g[S]\)表示数字集合为\(S\)时所有前缀和都小于等于0的方案数 答案就是\(sum_{S} sum[S] * f[S] * g[2^{N} - 1 - S]\) 求\(f\)每次相当于往前面插入一个数,如果\(sum[S] > 0\)就更新 \(f[S \^ (1 << i - 1)] += f[S] (sum[S] > 0)\) 求\(g\)只要每次看看…
题目链接 loj2540 题解 有一个朴素三进制状压\(dp\),考虑当前点三种状态:没考虑过,被选入集合,被排除 就有了\(O(n3^{n})\)的转移 但这样不优,我们考虑优化状态 设\(f[i][S]\)表示独立集大小为\(i\),不可选集合为\(S\)[要么是已经在独立集中,要么已经被排除了] 那么剩余点都是可选的 就枚举剩余点\(u\),记\(u\)相邻的集合为\(S_u\),那么当\(u\)加入后,集合\(S_u\)的点都不能选,但是由于所有点都会加入排列之中,\(S_u\)中除了\…
问题描述 BZOJ1688 题解 背包,在转移过程中使用状压. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar(); if(ch=='-') ch=getch…
题目链接 在\(N\times N\) 的棋盘里面放 \(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\) 个格子. \(1\le N\le 9,0\le K\le N*N\) \(f(i,j,l)\)来表示前 \(i\) 行,当前状态为\(j\) ,且已经放置 \(l\)个国王时的方案. \(j\) 这一维用二进制来表示 先预处理在一行上的所有合法状态(即排除同一行上两个相邻的情况),然后直接枚举这些来匹配上…
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 这样做 . 把通配符设成 \(0\) 然后 . 别的按 \(\mathrm{ASCII}\) 码 给值 , 最后把他写成式子的形式 ... 后来发现太年轻了 qwq 先要做这题 , 那么先发现性质咯 : 存在一个长度为 \(len\) 的 \(border\) 当且仅当对于 \(\forall i…
题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条件 !! 所以它询问的就是向左走的最短路了 . 不难发现只有两种策略 , 要么一直向左走 ; 要么第一次向右走 , 然后一直向左走 . 并且到一个定点 \(x\) 的最短路长度 肯定是从右向左一段段递增的 . 为什么呢 ? 不难发现 如果向右走两次 , 那么只有一次是一定有效的 , 另外一次的 \(l_i\)…
题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 \(x\) . 不对它进行翻倍操作 : 那么很容易发现 \(\displaystyle [\lceil \frac{x}{2}\rceil, x)\) 的数都不翻倍 . 其余部分任意 . 假设有 \(tot\) 个 . 那么这部分答案就是 \(\displaystyle \binom {n-tot…
前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. 代码实现 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #incl…
分析: 这个题非常的棒,目测如果去了能AC... 我们考虑一个序列是如何构成的——一个后缀>0的序列,和一个前缀<0的序列 问题可以简化为求出当前缀和为状态S的所有数的和的时候,S满足后缀>=0的方案数和((1<<n)-1)^S满足前缀<0的方案数 那么可以写出方程,sum[S]表示状态S的和,f[S]表示由S构成的序列满足所有后缀>=0的方案数,g[S]表示由S构成的序列满足所有前缀<0的方案数 转移:f[S]=(f[S]+f[S^(1<<i-…
题面 题解 可以想到枚举成为最大前缀和的一部分的数 设\(sum_i=\sum\limits_{j\in i}a[j]\) 设\(f_i\)表示满足\(i\)的最大前缀和等于\(sum_i\)的方案数 转移:对于\(\forall k\notin i, sum_i > 0\) 则有 \[ f_{i\cup\{k\}} \gets f_i \] 原理:我们考虑倒着插入数字,如果存在后缀\(sum_{suf} > 0\)就可以直接转移 设\(g_i\)表示满足\(i\)的所有前缀和都\(\leq…
题面 Loj 题解 细节比较多的搜索题. 首先现将牌型暴力枚举出来,大概是\(3^{16}\)吧. 然后再看能打什么,简化后无非就三种决策:单牌,\(3+x\)和\(4+x\). 枚举网友打了几张\(3\)和\(4\),然后再枚举吉老师(\(\mathbf {orz}\))打了几张\(3\)和\(4\). 接着枚举\(3\)搭配了几个\(2\),然后贪心地从大到小去除吉老师手中大小为\(2\)的对子,从小到大去除网友手中大小为\(2\)的对子.之后就是检查单牌是否合法了. #include <c…
题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int poi, id; } a[N]; bool operator < (const Node &a, const Node &b) { return a.poi < b.poi; } bool operator < (const Node &a, const int &am…
题面 传送门 题解 一旦字符串踏上了通配符的不归路,它就永远脱离了温暖的字符串大家庭的怀抱 用人话说就是和通配符扯上关系的字符串就不是个正常的字符串了比如说这个 让我们仔细想想,如果一个长度为\(len\)的前缀是border,那么对于\(\forall i\in[1,len]\),都有\(s[i]=s[i+n-len]\),也就是说在模\(n-len\)意义下所有位置上的\(01\)要相等 如果有一个\(0\)位置\(i\),一个\(1\)位置\(j\),记\(x=|i-j|\),那么所有\(…
题面 Loj 题解 枚举每一个点 分两种情况 翻倍or不翻倍 \(1.\)如果这个点\(i\)翻倍, 要保持排名不变,哪些必须翻倍,哪些可以翻倍? 必须翻倍: \(a[i] \leq a[x] < a[i]*2\) 那么其他的都可以选择性翻倍 \(2.\) 考虑点\(i\)不翻倍, 不能翻倍的: \(a[i]/2 \leq a[x] < a[i]\) 注意有和\(a[i]\)相等的可以翻倍 以上可以排序后,二分+组合数算 细节比较多,具体看代码 Code #include<cstdio&…
题目:https://loj.ac/problem/6435 题解:https://www.cnblogs.com/HocRiser/p/9166459.html 自己要怎样才能想到怎么做呢…… dp[ t ][ i ] 表示从 [ i , n ] 这些点出发,走 2t 步最左能走到哪. sm[ t ][ i ] 表示从 [ i , n ] 出发,走到 [ dp[ t ][ i ] , i-1 ] 的最小步数和:比如一个终点 x 贡献的就是 [ i , n ] 里离 x 最近的那个点到 x 的距…
题目:https://loj.ac/problem/6436 看题解才会. 有长为 i 的 border ,就是有长为 n-i 的循环节. 考虑如果 x 位置上是 0 . y 位置上是 1 ,那么长度是 | x-y | 的约数的循环节都不可行,因为在该循环节中, x 和 y 处在 “应该相等” 的地位. 最后一个部分分是暴力枚举 0 和 1 来预处理出一个 h[ i ] 表示长度是 i 的约数的循环节不可行.然后枚举循环节的长度 i ,再枚举 i 的倍数看看有没有 “不可行” 的.这样是 nlo…
题目:https://loj.ac/problem/6432 如果不选自己,设自己的值是 x ,需要让 “ a<x && 2*a>=x ” 的非 x 的值不被选:如果选自己,需要让 “ a>=x && 2*a<x ” 的非 x 的值被选. 注意是 “非 x ” 的值. #include<cstdio> #include<cstring> #include<algorithm> #define ll long lon…
题意 链接 Sol 生成函数题都好神仙啊qwq 我们考虑枚举一个长度\(len\).有一个结论是如果我们按\(N - len\)的余数分类,若同一组内的全为\(0\)或全为\(1\)(?不算),那么存在一个长度为\(len\)的border. 有了这个结论后我们考虑这样一种做法:把序列看成两个串\(a, b\),若\(a_i = 0, b_j = 1\),那么对于所有的\(k | (|i - j|)\), \(N-k\)都不会成为答案. 考虑怎么快速算不合法的\((i, j)\).对于多项式乘法…
题目分析 通过画图分析,如果存在border长度为len,则原串一定是长度为n-len的循环串. 考虑什么时候无法形成长度为len的循环串. 显然是两个不同的字符的距离为len的整数倍时,不存在这样的循环串. 怎么求出两两不同的字符的距离呢? 翻转一下字符串做卷积即可.…
题面 传送门 题解 计算几何的东西我好像都已经忘光了-- 首先我们可以把原问题转化为另一个等价的问题:对于每一个敌人,我们以原点为圆心,画一个经过该点的圆,把这个圆在多边形内部的圆弧的度数加入答案.求总的度数是多少 因为这是个简单多边形,我们可以把它给三角形剖分.就是说把每条边都和原点构成一个三角形,然后对圆计算这个三角形的贡献,根据这条边的顺逆时针顺序来决定贡献要加上还是减去.易知最后的贡献就是这个多边形的贡献 那么我们对于每一个圆,暴力枚举多边形的一条边和原点构成的三角形,然后判一下圆弧和三…
题目在这里...... 对于这道题,现场我写炸了......谁跟我说组合数O(n)的求是最快的?(~!@#¥¥%……& #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; ; ; ll ksm(ll x, ll n) { ll ans = 1ll; //printf("%lld ", x); while( n) { ) ans = ans *…
题面 传送门 题解 我们先想想,在这个很特殊的图里该怎么走最短路 先设几个量,\(a_i\)表示\([a_i,i-1]\)之间的点都和\(i\)有边(即题中的\(l_i\)),\(l\)表示当前在计算从\(i\)到\([l,i]\)中的所有点的步数总和.那么答案就是\([l,i]-[r+1,i]\) 因为\(a_i\)表示\([a_i,i-1]\)之间的点都和\(i\)有边,那么如果从\(i\)出发,对于所有这个区间中的点,肯定是直接一步跳过去最优.证明显然 记\(mn_i\)表示\(i\)以及…
题面 题意转化为: 判断每个点所在的圆有多长的弧度角位于多边形内部. 然后就很暴力了. 每个点P,直接找到多边形和这个圆的所有交点,按照距离P的角度排序. 找交点,直接联立二元二次方程组.... 需要判断一段弧是否在多边形内部. 向量随机旋转角度,判断点是否在多边形内部即可. 如果该点在多边形边上,返回-1,重新旋转. 由于double,所以不会出现射线在多边形边上情况. 注意: (0,0)要特判是否在多边形内部.+eps判断 #include<bits/stdc++.h> #define r…