08 2015 档案
摘要:用树状数组动态和查询修改排名。树状数组可以很方便地查询前缀和,那么可以利用这一特点,记录一个点在树状数组里最后一次出现的位置,查询出这个位置,就可以知道这个点的排名了。更改这个点的排名的时候只要把原来位置修改成0,然后在新的位置加上1就行了。把询问离线,数据范围比较大,先用快排+去重离散(用map也...
阅读全文
摘要:3e7暴力,800ms+过,单调队列维护区间最小值。#includeusing namespace std;typedef long long ll;const int maxn = 3e7+5;int x[maxn], dq[maxn], pos[maxn];int main(){ freo...
阅读全文
摘要:题意读懂了就好做了,就是求一下点双连通分量。维护一下一颗子树的结点数,对于一个结点当u是割点的时候,统计一下u分割的连通分量v,每得到一个连通分量的结点数cnt(v)和之前连通分量结点数sum相乘一下就好。最后加一下和u的子树上的连通分量总数和其它的结点的乘积。B,C中其中一者可以是A,所有最后还要...
阅读全文
摘要:这道题挺像hdu 5093 Battle ships的,不过那道题是要求最多放置的点数,而这道题是要求最小点覆盖。顶点覆盖的定义是:在G中任意边至少有一个端点属于顶点集合S。一个重要的位置有(x,y)两个坐标,而要守住这个这个位置就是相当于连了一条边x到y的边。选了一个(x,y)就相当于选了所有相同...
阅读全文
摘要:不难发现在一次操作以后,hi=min(hi-1,hi-1,hi+1),迭代这个式子得到k次操作以后hi=min(hi-j-(k-j),hi-k,hi+j-(k-j)),j = 1,2,3...当k == min(hi-j+j,hi+j+j)时hi会变成0,因为min具有传递性,那么可以左右分开来考虑...
阅读全文
摘要:算一下复杂度。发现可以直接暴。对于u枚举a和b,判断一下是否连边,更新答案。#includeusing namespace std;int n,m;const int maxn = 4001;#define PB push_backvector G[maxn];bool g[maxn][maxn];...
阅读全文
摘要:优先队列模拟一下就好。#includeusing namespace std;priority_queueq;int main(){ int n; scanf("%d",&n); int t; scanf("%d",&t); for(int i = 2; i =t){ ...
阅读全文
摘要:简单题,求一下所有数的2和3的幂是任意调整的,把2和3的因子除掉以后必须相等。求lcm,爆了long long。我得好好反省一下,对连乘不敏感#includeusing namespace std;typedef long long ll;const int maxn = 1e5+5;ll a[ma...
阅读全文
摘要:模版集合个数减少是因为匹配串集合中没被匹配过的一对串匹配了。所以就是找一个二分图最大匹配。因为集合X和Y是不好分开的,但是可以直接跑,两个集合都会跑一遍,所以一个匹配会被算两次,返回的时候除以2就行了。也有另外一种写法不用除以2的。#includeusing namespace std;const ...
阅读全文
摘要:最短路问题,不过起点不只是1个,终点也不止1个,因此把不同电梯的楼层分别编号,相邻楼层之间连边,不同电梯的相同楼层之间连边。dij的时候一次性把所有起点压到队列中,如果直接套版可以加一超级源点s和所有起点连一条dist为0的边。需要维护的信息:为了判断之前电梯有没有出现相同楼层,需要维护一个楼层到点...
阅读全文
摘要:题意:给出一个后缀表达式f(x),最多出现一次x,解方程f(x) = 0。读取的时候用一个栈保存之前的结点,可以得到一颗二叉树,标记出现'X'的路径,先把没有出现'X'的子树算完,由于读取建树的时候是由底向上的,这步可以在读取的时候顺带完成。注意'X'或'1/x'在某个结点和'0'相乘,那么'X'等...
阅读全文
摘要:题意:求一个无向图的点连通度。把一个点拆成一个入点和一个出点,之间连一条容量为1的有向边,表示能被用一次。最大流求最小割即可。一些细节的东西:1.源点固定,汇点要枚举一遍,因为最小割割断以后会形成连通分量,在分割以后那个连通分量里的割会更大。2.每次枚举重建一下图。3.从入点进,出点出,才认为是经过...
阅读全文
摘要:求所有点直接的平均最短距离,保存一下出现过的点,题目保证是所有点连通,Floyd求出最短路以后两个for统计一下。#includeusing namespace std;const int maxn = 101;int g[maxn][maxn];bool vis[maxn];vector p;co...
阅读全文
摘要:如果没有洞,那么任意两点的最短距离就是直线距离,洞里是瞬间的,所以看成一个点就行了(其实点也可以当作半径为0的洞来处理),洞到洞的最短距离都是圆心距离减去半径。剩下的就是求单源最短路径,是完全图,用不加堆优化的dijkstra就行了O(n^2)。#includeusing namespace std...
阅读全文
摘要:题意,有n个匀速动点,求最小生成树的改变次数。一句话总结:动态问题的一般做法是先求出一个静态的解,然后求出解发生改变的事件,事件按照时间排序,依次处理。先求出最开始的最小生成树(MST),当MST中的某条线段v长度被不在MST的线段u取代的时候,最小生成树才会发生变化,具体来说,已经知道之前的MST...
阅读全文
摘要:题意:求混合图的欧拉路径。一句话总结:网络流,最主要在于建图,此题是将出度则是和流量联系在了一起,用最大流来调整边的指向。分析:这题的困难之处在于无向边只能用一次,相当于一个方向未定的有向边。首先用并查集判断图的连通性,(直接计数O(1),做1395 Slim Span学到的技巧)。我们知道有向图的...
阅读全文
摘要:如果不允许转化'#'和'.'的话,那么可以直接在'#'和'.'之间连容量为b的边,把所有'#'和一个源点连接,所有'.'和一个汇点连接,流量不限,那么割就是建围栏(分割'#'和'.')的花费。问题是'#'和'.'是可以转化的,由刚才的思路,可以联想到,当'#'可以转化成'.'的时候,那么就不需要在它...
阅读全文
摘要:路径的花费和时间有关,路径的开关是周期性的,那么只要计算出当前时间,路径距离关闭还剩下的时间,如果大于t,那么可以通过,否则,只能等到下一次。如果下一次也不能通过,即t>a,这样的边应该在输入的时候忽略。每次只要考虑,到达某个点的最短时间,因为如果等待,解不会更优。#includeusing nam...
阅读全文
摘要:恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图,把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配。写的费用流。。最大权完美匹配KM算法没看懂#includeusing namespace std;const int maxn = 200+6;s...
阅读全文
摘要:Floyd的变形,本质是动态规划,路径分成的两个部分中取最大值作为该路径的答案,在所有可行路径之中选一个最小值。#includeusing namespace std;const int maxn = 101;int d[maxn][maxn];const int INF = 0x3f3f3f3f;...
阅读全文
摘要:最短路对应费用,路径数量对应流量。为限制点经过次数,拆点为边。跑一次流量为2的最小费用最大流。最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路。#includeusing namespace std;typedef long long ll;const int m...
阅读全文
摘要:互相可以打电话是一个传递关系,所以Floyd求传递封包,dfs找一个尽量大的圈。#includeusing namespace std;const int maxn = 25;map mp;map::iterator it;vector names;bool d[maxn][maxn];int ID...
阅读全文
摘要:很经典的网络流模型,行编号和列编号分别看成一个点,行和列和分别看出容量,一个点(x,y)看出是一条边,边的容量下界是1,所以先减去1,之后在加上就好了。建图的时候注意分配好编号,解从残留网络中的边找。前向星建图的话,打印解会比较麻烦。#includeusing namespace std;const...
阅读全文
摘要:关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点。dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Testcase最后一个不要换行,没有testcase最后一个要加换行,想起那天gold miner PE...
阅读全文
摘要:隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化,二进制pre[i][0]表示可以出现的bug,那么u&pre[i][0] == u就表示u是可以出现的bug集合的子集,pre[i][1]表示必须出现的bug,那么u|pre[i...
阅读全文
摘要:先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点。正确性是基于一个贪心,在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少。边比较多,用prim求最小生成树,效果比Kruskal好,枚举套餐的时候在用Kruskal。prim和...
阅读全文
摘要:Kruskal+并查集。点很少,按边权值排序,枚举枚举L和R,并查集检查连通性。一旦连通,那么更新答案。判断连通可以O(1),之前O(n)判的,第一次写的过了,后来T。。#includeusing namespace std;const int maxn = 101;const int maxe =...
阅读全文
摘要:一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理直接map离散。当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000。需要注意的是有可能只有一个结点。#includeusing namespace std;const in...
阅读全文
摘要:一开始想着球盒模型,数据范围大,递推会GG。用凑的方法来算方案。往n个小球之间插两个隔板,方案是(n-1)*(n-2)/2,不区分盒子,三个盒子小球数各不相同的方案数被算了6次(做排列),两个相同的被算了3次,如果n可以被3整除,那么3个相同的被算了一次。全部都加到6,在一起除以6就得到总的方案数。...
阅读全文
摘要:枚举盒子的个数,先把总数n减去掉box*k保证每个盒子至少有k个小球,剩下的小球放入盒子中可以为空,加入box个小球保证每个盒子至少有一个小球,问题转化成不可区分小球放入不可区分盒子非空的方案数。C[i][j]表示i个小球放入j个盒子非空的方案数,那么C[i][j] = C[i-1][j-1]+C[...
阅读全文
摘要:D. Minimizationtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou've got array A, consisting of...
阅读全文
摘要:CNF 2 'In Boolean logic, a formula is in conjunctive normal form (CNF) or clausal normal form if it is a conjunction of clauses, where a clause is a ...
阅读全文
摘要:一个合法的三角形的充要条件是a=b+c+r,很容易转化为rusing namespace std;typedef long long ll;ll cal(int a,int b,int c,int tl){ int r = (a-b-c+tl)>>1; if(rtl) r = tl; ...
阅读全文
摘要:状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态。但是这样做用数组开不下,用map离散会T。而实际上很多九进制数很多都是用不上的。因此类似uva 1601 Morning after holloween的思想,先dfs预处理出所有状态,用map将状态离散,预处理出算出状...
阅读全文
摘要:状压dp,用s表示已经询问过的特征,a表示W具有的特征。当满足条件的物体只有一个的时候就不用再猜测了。对于满足条件的物体个数可以预处理出来转移的时候应该枚举询问的k,因为实际上要猜的物品是不确定的,要么k是W所具有的,要么k不是W所具有的,要保证能猜到那么就应该取最坏情况下的最小值,所以有转移方程:...
阅读全文
摘要:阅读题,概要:给出垃圾邮件和非垃圾邮件的集合,然后按照题目给出的贝叶斯公式计算概率一封邮件是垃圾邮件的概率。逐个单词判断,将公式化简一下就是在垃圾邮件中出现的次数和在总次数的比值,大于二分之一就算是垃圾邮件的单词。如果一个邮件里的垃圾邮件的单词出现次数超过给定比例就算是垃圾邮件。需要注意的地方是:一...
阅读全文
摘要:递推就好了,用二项式定理算出所有连边的方案数,减去不合法的方案,每次选出一个孤立点,那么对应方案数就是上次的答案。枚举选几个孤立点和选哪些,选到n-1个点的时候相当于都不选,只减1。要用到高精度,直接开100*100的组合数数组会MLE,用滚动数组优化一下就好了。不会java,python太伤了#i...
阅读全文
摘要:题目:http://codeforces.com/gym/100338/attachments贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案。#includeusing namespace std;typedef unsigned long long ull;cons...
阅读全文
摘要:正反两次最短路用于判断边是不是最短路上的边,把最短路径上的边取出来建图。然后求割边。注意重边,和卡spfa。正权,好好的dijkstra不用,用什么spfa?#includeusing namespace std;typedef long long ll;#define fi first#defin...
阅读全文
摘要:赤果果的kdTree。学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html其实就是二叉树的变形#includeusing namespace std;const int maxn = 5e4+6,K = 5;#de...
阅读全文
摘要:题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1758状态压缩的DP,dp[i][st]表示状态为st考虑后面i个人所有人最...
阅读全文
摘要:队友套的可持续化线段树,徘徊在RE和MLE之间多发过的。。。复用结点新的线段树平均要log2N个结点。其实离线就好,按照时间顺序组织操作然后dfs。#include #include #include #include #include #include using namespace std;co...
阅读全文
摘要:先把线按照距离原点的距离排序,然后用叉积把在同一条直线上的点放在一起,把在同一条线上的点中的前i个点当成一个点就转化成了分组背包。写if(kas++) putchar('\n') 居然PE了,PE选手#includeusing namespace std;int N,T;const int maxn...
阅读全文
摘要:概要:有一树形结构的网络,要在一些结点安装服务器使得不是服务器的结点周围恰好有一个服务器,问服务器最小数量。先转成有根树(枚举子节点的时候忽略其父亲),然后dp[u][s]表示u的子树安装服务器的最小数量,影响决策的是u是不是服务器以及其父节点的状态,所以s的取值为u是服务器(0),u不是服务器u的...
阅读全文
摘要:求一棵数的最大独立集结点个数并判断方案是否唯一。dp[i][j]表示以i为根的子树的最大独立集,j的取值为选和不选。决策:当选择i时,就不能选择它的子结点。当不选i时,它的子结点可选可不选。判断唯一性:当选择的某个子节点方案不唯一,父节点的方案就不唯一,或者某个子节点选或不选方案数一样。转移顺序:按...
阅读全文
摘要:区间dp,切割dp[i][j]的花费和切法无关(无后效性)dp[i][j]表示区间i,j的花费,于是只要枚举切割方法就行了,区间就划分成更小的区间了。O(n^3)四边形不等式尚待学习#include //变量不要取成ignore left之类using namespace std;const int...
阅读全文
摘要:dp[i][j]表示前一个序列拿了i个颜色,后一个序列拿了j个颜色的最小花费。转移的时候显然只能向dp[i+1][j],或dp[i][j+1]转移,每增加拿走一个颜色,之前已经出现但没结束的颜色个数的跨度都增加1,为了在转移的时候快速算出这个值,先预处理出每个颜色在各个序列中的起始和终止位置。mem...
阅读全文
摘要:http://codeforces.com/gym/100650概要:给出一个缩写,和一些单词,从单词中按顺序选一些字母作为缩写,问方案数。限制:某些单词要忽略,每个单词至少要选一个字母。dp[i][j]表示到第i个单词的时候已经选了j个字母的方案数。很明显,当前字符ch是第j个字符的时候,第j-1...
阅读全文
摘要:http://codeforces.com/gym/100650阅读题,边界的cell的邻居要当成一个环形的来算,时间有8s,状态最多2^16种,所以直接暴力枚举就行了。另外一种做法是逆推。#includeusing namespace std;int m,n;const int maxn = 17...
阅读全文
摘要:题目链接:http://codeforces.com/gym/100650根据给出的树和d,求出一些结点,这些结点形成子树的第d层结点数应该尽量多,具体要求可以参考题目。dfs一个结点前保存询问深度的答案,访问完以后减去之前的值就得到答案了。#includeusing namespace std;c...
阅读全文
摘要:把'I'拆成容量为1一条边,一个入点一个出点,入点和相邻的'W'连一条容量为1的边,出点和相邻的'N'连一条容量为1,所有的'W'和源点连一条容量为1边,所有的'N'和汇点连一条容量为1的边,表示只能用一次。一发网络流就过了。写了4000B+的贪心,然并卵#includeusing namespac...
阅读全文
摘要:官方题解是离线询问,dfs树形转线性,然后二分找区间。还有一种比较好的做法是直接dfs,将当前访问这个结点u相关的询问之前的状态存起来,然后访问完以后利用异或开关性,得到这颗子树上的答案。代码是学习别人的http://blog.csdn.net/squee_spoon/article/details...
阅读全文
摘要:将源点和每个时间点连一条容量为k的边,表示同一时间最多剃k次胡子,将一个人和对应时间连一条容量为1的边,表示一个人在某个时间只能剃1次,再将每个人和汇点连一条容量为2的边表示一个人要剃两次。先是想贪心,结果不对,后来想到网络流,不会写好伤,下来写了好几发才过,写得依然丑。对最大流的理解加深了,图论有...
阅读全文
摘要:先扫描一遍得到每个位置向后连续的'.'的长度,包含自身,然后在扫一遍求出初始的合并次数。对于询问,只要对应位置判断一下是不是'.',以及周围的情况。#includeusing namespace std;const int maxn = 3e5+5;char s[maxn];int post[max...
阅读全文
摘要:贪心,如果m分成的两个区间长度不相等,那么选长的那个区间最接近m的位置,否则选m-1位置,特判一下n等于1的情况#includeusing namespace std;int main(){ int n,m; scanf("%d%d",&n,&m); if(n == 1){ ...
阅读全文
摘要:坑,一开始以为,分成两半的时候去最大那个就行了,实际上这样是不对的,因为有可能出现小的一半的时间比大的要长,因为还和等待次数有关,且转移的时候需要用到次数更小的状态,所以状态定义为二维,dp[i][j]表示长度为i的区间,放小于等于j次的概率。要求确切的某次的概率,比如k,就只要用dp[i][k]-...
阅读全文
摘要:首先是一个贪心,一种灯泡要么全都换,要么全都不换。先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],jusing namespace std;const int maxn = 1e3+3;int V[maxn], K[maxn], C[maxn], L[maxn];int d...
阅读全文
摘要:d[i]表示前面i个字符划分成的最小回文串个数,转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1。要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处理出来。(其实O(n^2)判断回文串的也可以,时间复杂度不会变,只是为了学习ManacherManach...
阅读全文
摘要:每首只能唱一次,而且中间不能不唱歌,所以先把状态赋值为-1,以区别合法状态和非法状态,在唱歌曲目最多的条件下,离开时间应该尽量晚。状态定义f[i][j]考虑前i首歌唱歌时间为j的最大唱歌曲目#includeusing namespace std;const int maxn = 55;const i...
阅读全文
摘要:分阶段的DAG,注意字典序的处理和路径的保存。定义状态d[i][j]为从i,j 出发到最后一列的最小花费,转移的时候只有三种,向上,向下,或平移。#includeusing namespace std;const int maxm = 11;const int maxn = 101;int G[ma...
阅读全文
摘要:TSP是NP难,但是把问题简化,到最右点之前的巡游路线只能严格向右,到最右边的点以后,返回的时候严格向左,这个问题就可以在多项式时间内求出来了。定义状态d[i][j]表示一个人在i号点,令一个人在j号点,之前的点全走过到终点还要走的最小长度,为了区别d[i][j]和d[j][i]规定i>j,然后考虑...
阅读全文
摘要:据说是DAG的dp,可用spfa来做,松弛操作改成变长。注意状态的表示。影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了。#includeusing namespace std;#define MP make_pair#define fi f...
阅读全文
摘要:因为年历是400年一个循环节的,所以递推出一年的情况,然后递推处理出一个循环节的情况。对于询问,求一个类似前缀和的东西就好了。跑出来和比样例小一,把A和B加一以后交后AC...写得时候注意变量的定义。。。不然WA到哭。。。我是以6代表星期5的,1900年是第一年,所以B,A减去1900之前要加一。#...
阅读全文
摘要:对于一个数来说,它的除数是确定的,那么它的前驱也是确定的,而起点只能是1或2,所以只要类似筛法先预处理出每个数的除数个数,然后递推出每个数往前的延伸的链长,更新最大长度,记录对应数字。找到maxn以后,根据最后一个数找到前驱,并记录到ans数组中。代码来自队友#include#include#inc...
阅读全文
摘要:贪心,每次遇到一个满水的湖要下暴雨的时候,就往前找之前最后一次满水之后的第一个没有下雨的且没有被用掉天day1。因为如果不选这day1,那么之后的湖不一定能选上这一天。如果这一天后面还有没有下雨的天day2的话,选后面的,会使得day1到day2之间满水的湖选择减少。#include#define ...
阅读全文
摘要:Feel GoodTime Limit: 3000MSMemory Limit: Unknown64bit IO Format: %lld & %lluBill is developing a new mathematical theory for human emotions. His recen...
阅读全文
摘要:x越大越难满足条件,二分,每次贪心的选区间判断是否合法。此题精度要求很高需要用long double,结果要输出分数,那么就枚举一下分母,然后求出分子,在判断一下和原来的数的误差。#includeusing namespace std;typedef long double ld;const int...
阅读全文
摘要:题意:给你一个排列,每次可以交换两个整数(不一定要相邻),求最少交换次数把排列变成一个1~n的环形排列。(正反都算)其实就是找环了,对于一个链状序列,最小交换次数等于不在对应位置的数字个数减去环的个数。至于证明这里讲的比较详细:http://www.dewen.io/q/7967#ans16319所...
阅读全文
摘要:有一个环形跑道,上面有n个加油站,到i号加油站可以加pi的油,跑到下一站要花费qi的油,起点任意选,问是否有一个起点可跑完整个跑道。从i开始跑,如果遇到某个站j不能跑了,那么从i到j之间的站开始跑,到j的油不会增加,所以下次直接从j+1开始跑。复杂度是O(n)#includeusing namesp...
阅读全文
摘要:不难发现,每过一个小时,除了右下方的气球全都是蓝色以外,其他都和上一个小时的气球是一样的,所以是可以递推的。然后定义一类似个前缀和的东西f(k,i)表示k小时之后上面i行的红气球数。预处理出k小时的红气球总数c(k),递归时候注意终止条件。#includeusing namespace std;ty...
阅读全文
摘要:题意:给你n个数的集合,每次选两个删除,把它们的和放回集合,直到集合的数只剩下一个,每次操作的开销是那两个数的和,求最小开销。Huffman编码。Huffman编码对于着一颗二叉树,这里的数对应着单词出现的频度,每次合并深度最大的结点,选频度最小的两个。用两个队列类似归并排序,合并一下。#inclu...
阅读全文
摘要:题意:把一个包含m个正整数的序列划分成k个非空的连续子序列。使得所有连续子序列的序列和Si的最大值尽量小。二分,每次判断一下当前的值是否满足条件,然后修改区间。注意初始区间的范围,L应该为所有正整数中的最大值,否则应该判断时注意。输出解的时候要使字典序最小,所以从后面贪心。#includeusing...
阅读全文
摘要:由于互相憎恨的骑士不能相邻,把可以相邻的骑士连上无向边,会议要求是奇数,问题就是求不在任意一个简单奇圈上的结点个数。如果不是二分图,一定存在一个奇圈,同一个双连通分量中其它点一定可以加入奇圈。很明显,其它点和已知的奇圈相连总是有两条点数一奇一偶的路径,因此一定可以找到一条回路使得新的这个点加入一个奇...
阅读全文
摘要:交互式程序,要用到一个函数fflush,它的作用是对标准输出流的清理,对stdout来说是及时地打印数据到屏幕上,一个事实:标准输出是以『行』为单位进行的,也即碰到\n才打印数据到屏幕。这就可能造成延时。在Windows平台上是看不出来的,它被改成及时生效了。而fflush对stdin的作用是清除冗...
阅读全文
摘要:紫书上面的题,队友做的,WA了freopen。。爆了int。。。UVA 1614 - Hell on the Markets 奇怪的股市(贪心,结论)
阅读全文
摘要:每一单词相邻两个字母,不能同时为元音或者辅音。。。各种姿势都可以过:7个for,dp,黑白染色,dfs,并查集。。。。最主要的思路就是相邻字母连边,把元音和辅音看成两个集合,那么有连边的两个字母一定不能出现在同一个集合中,于是想到了二分图判断的二染色。比较坑的是,必须要出现5个元音字母见识到了str...
阅读全文
摘要:图给得很良心,一个s到t的有向图,权值至少为1,求出最短路,如果是一定经过的边,输出"YES",如果可以通过修改权值,保证一定经过这条边,输出"CAN",并且输出最小修改值,否则输出"NO"。保证有s到t的路径,可能有重边。建正反两个图,分别求出s和t的最短路径,用来判断一条边是不是在最短路径上,然...
阅读全文
摘要:题意:麦田的故事,n张牌,取x张牌,记住前x张牌最大的值m,继续往后取,遇到第一张比m大的牌就停下来。求一个x使得最后的牌在整副牌里是最大的期望最大。假设最大的牌是A,A在各种位置出现的概率就是相等的,因为题目不要求输出概率,所以当成1。在A固定的情况下,在它前面的牌中最大的牌B,出现在各个位置的概...
阅读全文
摘要:题意:构造让Dijkstra单源最短路算法有效松弛次数最多的数据。。。题解:构造,题意换种说法就是更新晚的路径要比更新早的路径短。因为所有点都会更新一次,那么按照更新时间形成一条链,即到最后一个点的最短路径,注意:越在这条链的后面的边越晚更新,然后添加边,在前面的点所连的边一定是先更新的,所以反过来...
阅读全文
摘要:傻逼题,但是为什么别人的O(n^3)不会T?只是因为用了bitset优化。。。附上一张bitset基本操作的表#includeusing namespace std;const int maxn = 1500+2;char g[maxn][maxn];bitset b1[maxn],b2[maxn]...
阅读全文
摘要:题意:在一条线段上选出尽量少的点,使得和所有给出的n个点距离不超过D。分别计算出每个点在线段的满足条件的区间,然后就转化成了区间选点的问题了,按照右端点排序,相同时按照左端点排序,按照之前的排序一定保证了包含这个点的区间是连续的。贪心,每次选右边的端点,维护一个当前选择点的位置,每遇到区间就判断一下...
阅读全文
摘要:因为每增加一个订单,时间是会增加的,所以先按截止时间d排序,这样的话无论是删除一个订单,或者增加订单,都不会影响已经选好的订单。然后维护一个已经选好的订单的大根堆(优先队列),如果当前无法选择的话,那么尝试和之前花费时间最长的交换。如果qiusing namespace std;const int ...
阅读全文
摘要:如果直接模拟水向周围流会TLE,因为某些个结点被重复扩展了多次,科学做法是topo排序,每次只把入度为0的点放入队列,这样就严格保证了每个结点只被扩展一次。#includeusing namespace std;#define eps 1e-9#define bug(x) cout son[maxn...
阅读全文
摘要:题意:给出一堆元素,求一个子集,使子集的乘积最大,如有多个,应该使子集元素个数尽量小。题解:贪心,如果有大于1的正数,那么是一定要选的,注意负数也可能凑出大于1的正数,那么将绝对值大于1的负数两两配对,如果还剩下一个绝对值大于1的负数,那么在判断一下,那个负数和比它大的最小负数的乘积是否大于1,如果...
阅读全文
摘要:先证明一个结论吧,对于1≤ai≤i+1,前面ai个数一定可以凑出1~sum[i]中的任意一个数.对于i=1显然成立,假设对于i=k结论成立,那么对于i=k+1来说,只要证明sum[k]+i,1≤i≤ak+1可以凑出来就行了。因为sum[k]+i≥k+1,且1≤ak+1≤k+1,所以可以先选一个ak+...
阅读全文
摘要:题意:在一个n个点的无向连通图中,n是奇数,k是使得所有点的度数不超过k的最小奇数,询问一种染色方案,使得相邻点的颜色不同。题解:一个点和周围的点的颜色数加起来最大为它的度数+1;如果最大度数是偶数,那么k种颜色一定够了。如果最大度数是奇数,而且n是奇数,那么k种颜色也一定是足够的。 可以反证,最大...
阅读全文
摘要:题意:要用一个有序的序列生成给定序列,操作有两种,一是交换前两个元素,二是把第一个元素移动到最后去。思路有两种:1.映射,把给定序列映射成有序的序列,然后按照同样的替换规则把有序的序列映射掉,然后就可以排序啦。具体解释可以看SRM 664的C题2.逆向思考,把给定序列变成有序,操作相应变化一下,最后...
阅读全文
摘要:题意:给一个1~n排列,1using namespace std;const int maxn = 1e4+5;int a[maxn],pos[maxn];inline void exchange(int s1,int s2){ int len = s2 -s1; for(int i =...
阅读全文
摘要:用set,保存当前区间出现过的数字,如果下一个数字没有出现过,加入,否则删掉左端点,直到没有重复为止#includeusing namespace std;const int maxn = 1e6+2;int A[maxn];int main(){ int T; scanf("%d",&T);...
阅读全文
摘要:著名的折纸问题:给你一张很大的纸,对折以后再对折,再对折……每次对折都是从右往左折,因此在折了很多次以后,原先的大纸会变成一个窄窄的纸条。现在把这个纸条沿着折纸的痕迹打开,每次都只打开“一半”,即把每个痕迹做成一个直角,那么从纸的一端沿着和纸面平行的方向看过去,会看到一条美妙的曲线。就是一个分形,规...
阅读全文
摘要:题意:给你一个n位整数,让你删掉d个数字,剩下的数字要尽量大。题解:因为最后数字位数是确定的,而且低位数字对答案的贡献是一定不及高位数字的,所以优先选择选最大且最靠左边的数字,但是有一个限制,选完这个数字以后右边剩下的数字要保证足够接下来的选择,所以想到了优先队列,记录一个信息,选的数字所在的位置,...
阅读全文
摘要:给出一组字符串D,要找一个字符串S使得D中一半小于等于S,另外一半大于S。输入保证一定有解。长度要尽量短,在此基础上字典序尽量小。分类谈论,细节挺多的,比如'Z'。其实直接暴就过了,没分类辣么麻烦。#includeusing namespace std;vector vec;int main(){ ...
阅读全文
摘要:每次选最大的物品和最小的物品放一起,如果放不下,大物体孤独终生,否则相伴而行。。。答案变得更优是因为两个物品一起放了,最大的物品是最难匹配的,如果和最小的都放不下的话,和其它匹配也一定放不下了。#includeusing namespace std;const int maxn = 1e5+42;i...
阅读全文
摘要:A题,熊孩子测视力,水题,题意就是判断一下两个数对应位不相同的数字有多少个。#includeusing namespace std;class BearCheats{ public: string eyesight(int A, int B){ int d...
阅读全文
摘要:题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近。题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延伸不会碰到顶的最大高度。设当前最大高度为level,起始位置为顶高,移动到下一格的时如果碰到顶,那么降...
阅读全文
摘要:题意:有n支队伍(n是2的整数幂,2using namespace std;const int maxn = 1025;char G[maxn][maxn];int vec[5][maxn];int main(){ // freopen("in.txt","r",stdin); int n...
阅读全文
摘要:题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的。先预处理出每个元素之前和之后相同元素出现的位置,就可以在O(1)的时间判断出一个元素在一个区间内是否唯一。每次从大的序列中找一个唯一元素,包含这个元素的就不用判断了,那...
阅读全文
摘要:题意:给你一个按发生时间的序列,表示与非门电路的输入,一开始全部输入是x,现在要改成尽量少的x,实现相同的功能。题解:电路功能只有4中0,1,x,非x。那么如果一开始x改变了,输出结果不变,那么说明是常量电路。否则一定可以只用一个x来实现相同的功能,因为从全为0到全为1的过程中一定会有某个时刻,改变...
阅读全文
摘要:摘要:数形结合,斜率优化,单调队列。题意:求一个长度为n的01串的子串,子串长度至少为L,平均值应该尽量大,多个满足条件取长度最短,还有多个的话,取起点最靠左。求出前缀和S[i],令点Pi表示(i,S[i]),那么这个问题就转化成了求斜率最大的两点。画图分析可知,如果有上凸点,那么上凸点,一定不会是...
阅读全文
摘要:给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列。最简单的想法是枚举起点j和终点i,然后数一数,分别向前或向后能延伸的最长长度,记为g(i)和f(i)。可以先预处理出每一个点能往前和往后延伸的长度(g(i)和f(i))。然后枚举终点i,快速找一个g(j)最大的...
阅读全文