题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列,将上面所有的颜色取反,问若干次操作后可以得到的最大全黑子矩阵面积 首先我们可以发现,对于一个\(2×2\)的子矩阵,如果其内部的黑点个数不是偶数个,则这个子矩阵不能全部变成黑点,因此我们可以将所有黑点权值设为1,白点设为0,每个\(2×2\)子矩阵的左上角记录其内部的异或值 然后我们就可以随便写了…
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选了,区…
C - Make a Rectangle 从大到小贪心即可. # include <bits/stdc++.h> using namespace std; map<int,int>m; int main() { int n, a; scanf("%d",&n); while(n--) scanf("%d",&a), m[a]++; int r=0, c=0; for(auto i:m) if(i.second>3) r=…
题目传送门: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\) 这个模型就是最小割啊--我…
题意: 你现在有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…
引用自:onion_cyc 字符串DP一直不是强项...以后没思路的题就想DP和网络流23333333 f[i]表示从i开始的后缀非子序列的最短长度  pos[i][j]表示从i开始的j字符最早出现位置 则有 f[i]=f[pos[i][j]+1]+1   因为1~pos[i][j]这一段只可能出现一次j,后面接一个不是pos[i][j]+1开始的后缀的子序列的字符串,一定也不是i开始的后缀的子序列 初始状态f[n+1]=1 f[n+2]=0 pos[n+1][0..26]=n+1 因为最后一位…
题意:有个沙漏,一开始bulb A在上,bulb B在下,A内有a数量的沙子,每一秒会向下掉落1.然后在K个时间点ri,会将沙漏倒置.然后又有m个询问,每次给a一个赋值ai,然后询问你在ti时刻,bulb A的沙子数.保证A和B的总沙子数为X. 函数ft(x)表示t时刻,初始bulb A中的沙子数为x时,当前的bulb A中的沙子数是多少. 最开始时函数恰好为f(x)=x. 然后在第一次翻转之前,函数会逐渐向下移动变为<2>的样子,然后在翻转之后,函数又会逐渐向上移动,直至变成<3>…