题目大意 一个无限长的序列\(a\), 需要满足 1.数列中的每一个数在\(1\)到\(n\)之间. 2.对于\(i>=n, j>=n\), \(a_i=a_j\). 3.对于\(i<=n\), \(a_j\)相等. 其中\(j\in(i,i+a_i]\) 求这样的序列的个数. \(n<=10^6\) 解题思路 发现其实只有\(2n\)项是可能有用的. 然后发现, 如果在\(<=n\)的数中, 有两个相邻的\(>1\)的数, 之后的序列就固定了. 这是特殊情况. 所以这…
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\) 思路 首先最大值最小,考虑二分答案. 如何check呢. 只有两个坐标,考虑2-sat. 可是边有点多,存不下来,考虑线段树优化建图. 如何建图. 先按照做坐标排序,我们有两个点的范围 [id[x]-mid,id[x]+mid],[id[y]-mid,id[y]+mid]. 这个显然是z选了,区…
题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人在S处,向T移动,若此人现在在\((i,j)\)上,那么下一步他可以移动到​\((i,k)\)或\((k,j)\)上,\(k\)任意 问最少需要将多少个o改成.,可以使这个人无法从S到达T,输出最少需要更改的数目:如果无论如何都不能使这个人无法从S到T,则输出\(-1\) 这个模型就是最小割啊--我…
题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列,将上面所有的颜色取反,问若干次操作后可以得到的最大全黑子矩阵面积 首先我们可以发现,对于一个\(2×2\)的子矩阵,如果其内部的黑点个数不是偶数个,则这个子矩阵不能全部变成黑点,因此我们可以将所有黑点权值设为1,白点设为0,每个\(2×2\)子矩阵的左上角记录其内部的异或值 然后我们就可以随便写了…
题目:http://arc071.contest.atcoder.jp/tasks/arc071_b 题意: 有一个二维的平面,给你xn根竖线和ym根横线,问这些线围成的长方形(正方形)的面积和(要求mod). 例子: 3 3 1 3 4 1 3 6 构成了9个长方体. 可以算出ans = 60: 题解: 很容易就可以想到暴击枚举 i,j,k,l,对应的每个值然后求面积. 但是毫无疑问n4是会TLE的. 同样的答案等价于 但是很不好意思,这样还是会TLE. 所以我们就可以把它化简为 ——————…
C - 怪文書 / Dubious Document 题意:定义一种无序的子序列:在原串中随意地取字符并随意打乱顺序.求多个字符串的最长公共无序子序列. #include<cstdio> #include<algorithm> using namespace std; ],q[]; ]; int main(){ scanf("%d",&n); ;i<;i++) s[i]=; while (n--){ scanf("%s",c);…
题意: 你现在有n个题目可以做,第i个题目需要的时间为t[i],你要选择其中的若干题目去做.不妨令choose[i]表示第i个题目做不做.定义cost=∑(i<=n)∑(i<=j<=n)(∏(i<=k<=j)choose[k])−∑(i<=n)choose[i]×t[i]有q个询问,每个询问给出两个数p,x表示询问假设把t[p]修改成x,当你任意指定choose[]的值时,最大的cost是多少. 首先不考虑询问,dp一遍,f[i]表示前i个题目获得的最大收益,f[i]=…
题意: n个人抢m个凳子,第i个人做的位置必须小于li或大于ri,问最少几个人坐不上. 这是一个二分图最大匹配的问题,hall定理可以用来求二分图最大匹配. 关于hall定理及证明,栋爷博客里有:http://blog.csdn.net/werkeytom_ftd/article/details/65658944 可以推出答案为$max\{|x|-Γ(X)\}$,x为左侧点的一个子集,Γ(X)为这些点能到达的右侧点的集合. 证明: 因为二分图有完美匹配的充要条件是对于所有的x都有Γ(X)>=|x…
题意: 有n个餐厅排成一排,第i个与第i+1个之间距离是Ai. 有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$. 选择每种食物在哪个餐厅里吃,使收益减去走过距离最大(食物可以不按顺序吃). 显然走过距离就是选择的餐厅所在的区间的长度,让f[i][j]表示选择的餐厅所在的区间为i到j的最大收益. 对于每个b[i][j],求出左边和右边第一个比它大的位置l,r. 那么对于左端点在l+1~i,右端点在i~r-1的区间里第j种食物肯定在第i个餐厅吃. 相当于…
Description 题面 Solution 我们发现如果一个位置需要被退掉,那么是 \(0\) 或 \(1\) 都没有关系 于是我们想到把 \(0,1\) 归为一类 问题转化为每一次可以添加和删除一个 \(?\),求 \(n\) 次操作后最后长度变为 \(|S|\) 的方案数 我们最后可以把 \(?\) 对应成 \(S\),只需要把方案数除以一个 \(2^{|S|}\) 就行了 #include<bits/stdc++.h> using namespace std; const int N…