摘要:本来准备回去了,想想看了一晚上,还是过一个模板题吧==这题比赛时候其实就有思路了,就是将强连通分量缩点成一个DAG,然后判断是否成一条链,会个tarjan就是裸题啊==不说了图论实在太弱,tarjan竟然刚学,放个模板明天继续学图论= 1 #include 2 #include 3 #include...
阅读全文
摘要:比赛时总感觉很混乱,其实昨天晚上仔细一想就很简单了==首先,我是知道我要拿最大id点且入度小于等于k的,那就拿,继而,需要将他相连边全部入度-1,如果入度小于等于k加入优先队列一直到队列为空,类似bfs那样找,代码实现也比线段树好多了==心塞,本来手速过A分挺高,手贱hack又是一夜回到解放前,又掉...
阅读全文
摘要:算法继续(图+树): 数论:莫比乌斯反演 图论:强联通tarjan,最小费用流,2-SAT,DLX (再不学图论真要弱到爆炸了) 数据结构:树相关(划分树,伸展树spaly,动态树lct,平衡树treap,树的重心和直径)近期比赛又有好多呀==
阅读全文
摘要:dp好题啊!首先如何暴力的去做?dp[now][i][j][k][l]表示当前爬到now层,四个方向分别距离当前层为i j k l的方案,原来大于等于h的直接赋为h这样就能直接递推,复杂度1000*30*30*30*30,妥妥的T 1 #include 2 #include 3 #include 4...
阅读全文
摘要:我写的dp方程比较繁琐了,是很自然的想到的,应该有更优的转移方案==dp[i][j][k1][k2] 表示若有i个白鼠j个黑球: dp[i][j][0][1]:公主先走赢得概率 dp[i][j][0][0]:公主先走输的概率 dp[i][j][1][1]:龙先走赢得概率 dp[i][j][1...
阅读全文
摘要:对于2-n每个点记录向左向右走完接下来要走的路长为什么可以搜?因为只变化第一个而每次又从第一个走,那我们显然只需要记录每个点向左向右两种值要记得每次搜索都要初始1节点向右为没走过== 1 #include 2 #include 3 #include 4 using namespace std; 5 ...
阅读全文
摘要:将1设为树根节点,接下来就好想了,因为更新一个点对应到1的路全部都要更新对于一个节点u,dfs他的所有儿子节点,返回最大需要+1的操作和最大需要-1的操作再接合自身返回给父亲节点+1 -1的最大操作最后结果就是1节点+1和-1的最大操作和 1 #include 2 #include 3 #inclu...
阅读全文
摘要:题目中规定要换来的物品必须要是目前没有的=其实如果有重复的就可以把重复的去掉。。所以是等价的所以可以在输入的时候预处理取与不取当前值能拿到的值放入dp中然后在0的基础上一直寻找最大可交换的物品,一直到找不到结束== 1 #include 2 #include 3 #include 4 using n...
阅读全文
摘要:dp[i][j] 表示前i个位置中正好有j个位置满足good对于第i个位置 第i个位置不是good dp[i][j]= dp[i-1][j] 。 第i个位置是goodi取i+1转移没问题,但i取i-1可能被前面用过,所以记录后面三个数根据dp结果可以算出sum[i],然后sum[i] *=fac...
阅读全文
摘要:题意和范围:http://codeforces.com/problemset/problem/385/C好题呀==在筛质数的过程中顺带累加筛他的质数vis值最后统计就是前缀和相减== 1 #include 2 #include 3 #include 4 using namespace std; 5 ...
阅读全文
摘要:本题关键地方在于:只要确定前n列的点阵,后面每列放多少就全部确定了==这样就可用dp和组合数预处理递推前面的n列放法,同时利用快速幂将所有列放法计算出来 1 #include 2 #include 3 #include 4 using namespace std; 5 #define LL long...
阅读全文
摘要:树状数组数组里面记录的值是当前以a[i]结尾的乘积和=比如当前到i的a[i],查询1-a[i]的所有值和,乘以(a[i]+1)就是当前以a[i]为结尾的乘积和=这样出现了重复计算的情况,只要减去上一次a[i]结尾的乘积和即可 1 #include 2 #include 3 #include 4 us...
阅读全文
摘要:首先n为偶数必然没有n为奇数优==而n为奇数最多能放(n^n+1)/2个1特别注意特判x=3的时候需要5个,因为3个那样放就相邻了== 1 #include 2 #include 3 #include 4 using namespace std; 5 int main() 6 { 7 int n...
阅读全文
摘要:比较裸的dp了,多做dp有益身心健康==dp[i][j][kind]表示到i时,是以kind的种类结束,且他连续了j个这种dp一般想到状态,转移方程也就好想了,注意1才需要大规模累加 1 #include 2 #include 3 #include 4 using namespace std; 5 ...
阅读全文
摘要:像我这种一遇到这种类型题目必然先打个表==然后发现其实就是找到L和R二进制由高到底第一位不同的数,低位全部变成1,想想也好明白== 1 #include 2 #include 3 #include 4 using namespace std; 5 int main() 6 { 7 long lo...
阅读全文
摘要:n,LL>mp迭代是(it->first).first== 又学了一点stl 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define LL long long 7 pairtmp; 8 map,LL>m...
阅读全文
摘要:关键点在于,什么时候需要改变?注意到只有一个2*2的矩形里面只有一个星才需要改变这个星为点只要想到这个这题就能各种姿势搜索了===可以dfs,从可变矩形向四周拓展== 1 #include 2 #include 3 #include 4 using namespace std; 5 int xx[]...
阅读全文
摘要:其实本题还有一个可以沿y=x对称的操作,但仔细思考会发现其并不影响对于一个点,比如A当前先走,只要找到一个他可以跳的地方且B从这儿必跪的A就必胜=否则A跪所以可以用记忆化dfs来写,复杂度大概200*200*20 1 #include 2 #include 3 #include 4 using na...
阅读全文
摘要:3 ≤ n ≤ 20,1 ≤ t ≤ 10如此小的数据接下来就能各种暴力了===dp[i][j][k][t1][t2]表示前i个字符的最后两个是j和k已有t1个峰t2个谷枚举当前放的数,转移方程容易思考了=复杂度是20*4*4*10*10*4==轻松过啊 1 #include 2 #include ...
阅读全文
摘要:注意到一个重要的信息,每个x对应的sell最多只有一个=2^x>2^(x-1)+2^(x-2)+...+1因此可以按照x的sell从高到低排序,继而扫每个sell,对于每个sell从原数组结尾到开头扫到第一个win,再更新这个区间不可卖即可发现函数返回vector写些简单的大数还挺好的== 1 #i...
阅读全文
摘要:好像去了再回来很难记住原来走了哪些?可以从左上角同时走两个路径到右下角,那如何记录两个点的状态?注意到两个点的行+列是相同的,因此可以记录一个时间维+两个坐标维dp[time][x1][x2] time时间一点的横坐标x1和另一点的横坐标x2转移很好想啦== 1 #include 2 #includ...
阅读全文
摘要:转化成1-m里面多少个首尾数字相同数字对于个位数本身满足而其他的,注意到对于每一个x,x/10再加上末尾固定的数即满足,所以答案为m/10+9?最后注意到如果m的个位数 2 long long fun(long long m) 3 { 4 if(m=10) m/=10; 7 if(m...
阅读全文
摘要:dp[i][j]表示前面i个步兵j个马兵排列种数,再枚举一下本次放的步兵和马兵的个数就可以dp了技巧在于:不是一个一个放兵,而是轮流种类放兵== 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MOD 1000000...
阅读全文
摘要:预处理dp[i][j]表示i层取j本书最大价值,利用前缀和来处理,枚举不拿的中间一段,这样预处理O(n^3)随后进行dp,dp[i][j]表示前i层取j本书最大价值,再枚举i层拿k本书,这样也是O(n^3),甚至接近100*10000*100,不过codeforce的速度还是承受住了== 1 #in...
阅读全文
摘要:将每个点与x正半轴夹角利用atan求出来,都在[0,360)之间然后排序,枚举夹角相邻的两个点,ans=min(360-(the[i+1]-the[i])) 1 2 #include 3 #include 4 #include 5 #define eps 1e-10 6 using namespac...
阅读全文
摘要:对比代码量,好大的思维量==其实对于第二个拿相同的木块分的人,他当前放与上一个木块相同最优对于第一个想拿不同木块分的人,他放与上一块木块不同颜色最优第一个人放多的颜色木块更优=至于为什么?>>当前对自己有利就放,否则到后面就无利了 2 #include 3 #include 4 using name...
阅读全文
摘要:这道题目自己能想到还是挺开心的=我的做法是先用筛法将每个数的质数因子放到这个数对应的vector里面然后从首至尾扫这个数组,对每个数查看他的所有质因子最大的长度,最后更新每个质因子的长度,复杂度大概是O(n*数的质因子平均个数),挺快的 1 #include 2 #include 3 #includ...
阅读全文
摘要:图见:http://codeforces.com/problemset/problem/343/B巧妙!将红上蓝下记为1,红下蓝上记为-1,压栈,相同相消,最后栈中无元素即可以分开= 1 #include 2 #include 3 #include 4 #include 5 using namesp...
阅读全文
摘要:串联1Ω电阻:R+1并联1Ω电阻:R/(R+1)这样就从目标电阻倒推回去需要多少个 1 #include 2 #include 3 #include 4 using namespace std; 5 int main() 6 { 7 long long a,b,x,tmp; 8 scanf(...
阅读全文
摘要:范围比较小,直接记忆化搜索=dp[go][pos][i][cnt]表示朝向,位置,字符串行进位置,剩余操作数转移方程思考=注意cnt先可以-2 1 #include 2 #include 3 #include 4 using namespace std; 5 int dp[2][205][105][...
阅读全文
摘要:预处理sum数组,sum[i]表示1-m中有i个4或7的数有多少个,这个数位dp很好写然后就是枚举第七个数含有的4,7数目,dfs剩下的六个数= 1 #include 2 #include 3 #include 4 using namespace std; 5 #define LL long lon...
阅读全文
摘要:如果一个放不下第二个人赢,否则第一个人放在中间,由于对称性,第二个人必败=1 #include2 #include3 int main()4 {5 int n,m,r;6 scanf("%d%d%d",&n,&m,&r);7 if (n>=r*2&&m>=r*2) printf("Fir...
阅读全文
摘要:比较明显的dp了=dp[i][j][flag]前i个栅栏中,红/绿颜料用了j的最小接触值具体转移见程序: 1 #include 2 #include 3 #include 4 using namespace std; 5 int dp[225][45005][2],a[225]; 6 int mai...
阅读全文
摘要:其实就两个方向,不符合就改嘛所以从任意一个点开始,两个方向更改的最小值就是答案== 1 #include 2 #include 3 #include 4 using namespace std; 5 int n,vis[1005]; 6 struct dian{ 7 int num1,num2,...
阅读全文
摘要:转化成a/rev(a)==rev(b)/b这样就容易做了先判断大区间有没有到w个,然后开两个map进行尺取x=n1 y=1如果当前对数>=w x--,否则y++,中间有涉及到两个map的删减以及在满足情况下更新答案 1 #include 2 #include 3 #include 4 #includ...
阅读全文
摘要:设i行j列=a行b列列出表达式进行化简,会发现就是个gcd 1 #include 2 #include 3 #include 4 using namespace std; 5 int gcd(int x,int y) 6 { 7 if (y==0) return x; 8 return gc...
阅读全文
摘要:最高就是第一名=最低的话贪心,一轮从大到小,另一轮从小到大,尺取最多即最多能有多少个>=k 1 #include 2 #include 3 #include 4 using namespace std; 5 int a[100005],b[100005]; 6 int main() 7 { 8 ...
阅读全文
摘要:不去实际上交换行和列=用两个数组表示当前行/列是原数组哪一行/列,这样只用交换变量 1 #include 2 #include 3 #include 4 using namespace std; 5 int a[1005][1005],idx[1005],idy[1005]; 6 int main(...
阅读全文
摘要:codeforces好多这样的想到很简单,想不到感觉难到爆的题目,思维!很简单:只要原序列第k个元素后面有和第k个不一样的就变不了,思考=可以就看第k个前面连续多少个和第k个相同即可= 1 #include 2 #include 3 #include 4 using namespace std; 5...
阅读全文
摘要:n 2 #include 3 #include 4 #include 5 using namespace std; 6 #define LL long long 7 #define MOD 1000000007 8 struct dian{ 9 LL x1,x2,flag;10 };11 que...
阅读全文
摘要:首先所有数最后所变成的数一定是原序列中有的数然后可以将开辟一个新的数组为原数组,并排个序=这样转移方程就比较好想了:dp[i][j]表示原序列中第i个数对应排序后的数组第j个数1 if (i==1&&j==1) dp[i][j]=labs(a[i]-b[j]);2 else if (i==1) dp...
阅读全文
摘要:前前后后花了将近半个月,终于将吴神的十场cf的50+题目补完了,看到了各种技巧和DP的好题,为了方便以后查阅,新增一个分类便于查找,当然本分类的题目其他分类一般都有,先去吃个饭,回来刷题解==
阅读全文
摘要:题解说的很好呀==就是拿50和100的买票多少种方案== 1 #include 2 #include 3 #include 4 using namespace std; 5 #define LL long long 6 #define MOD 1000000007 7 LL fac[1000005]...
阅读全文
摘要:其实是很裸的dp,竟然放在第四题==dp[i][j]表示当前放j和为i的方案数dp[0][0]=1;dp[i][j]=dp[i-j][j-1]+dp[i-j][j]; 1 #include 2 #include 3 #include 4 #include 5 using namespace std;...
阅读全文
摘要:其实就是放了1000007个桶,将已有值放入对应桶中然后判存在就是寻找该桶内元素,如果数据刁钻会退化成n2呀===这题还有一个技巧,就是可以利用一个hash就可以先预处理出a[1]-a[2]+a[3]-a[4]....将sum[n]放入桶中,然后从i-1循环到0,如果i为偶寻找sum[i]+k,否则...
阅读全文
摘要:比如a*bif b%2==1 res=(res+a)%pelse a=(a+a)%pb/=2;==不错好思想,学习了 1 #include 2 #include 3 #include 4 using namespace std; 5 #define LL long long 6 LL mul(LL ...
阅读全文
摘要:特判n==1 1 import java.io.*; 2 import java.math.*; 3 import java.util.*; 4 import java.text.*; 5 6 public class mydo { 7 public static void main(St...
阅读全文
摘要:n个人排队,T在第m个位置,对于队列第一个人有以下四种情况:1、激活失败,留在队列中等待下一次激活(概率为p1)2、失去连接,出队列,然后排在队列的最后(概率为p2)3、激活成功,离开队列(概率为p3)4、服务器瘫痪,服务器停止激活,所有人都无法激活了。求服务器瘫痪时T在队列中的位置 2 #incl...
阅读全文
摘要:目前高斯消元最后一题吧==bug了一晚上,心好累这题是鞍山网赛的,那时弱弱的都不知高斯消元这东西==本题其实就是把电阻为0的点用并查集缩点在一起,想到这儿应该很容易错了,却因为两个问题错到现在一个问题是高斯消元里面不能return 0这个比较奇怪,怎么修改精度都过不了,因为肯定有解,也就是说会导致方...
阅读全文
摘要:额很裸的现在才看到==就是把原矩阵设N×M个未知量直接代入高斯消元==目前手打基本上无压力了,下面把5009做了高斯消元可以放一下了==(突然发现两个问题,整数的高消还没怎么写过?小数精度大的还没看到过?额这周末前弄好 1 #include 2 #include 3 #include 4 #incl...
阅读全文
摘要:每50分为1分,减少状态。首先dp[i][j]=p*(dp[i+1][j]或dp[j][i+1])+(1-p)*dp[i-2][j]+1 这是入门的期望公式了利用id(i,j)=(i-i*i)/2+20*i+j来标序形成环了,高斯消元解出方程,x[0]即为dp[0][0]的期望了== 1 #incl...
阅读全文
摘要:尼玛物理渣连带着acm都不会了,KCL竟然想了半天!设n个节点的电势未知数,设入点电流为1,出点电流为1,然后可以利用KCL列出n个表达式求解,最后入点电势-出点电势即为等效电阻==又打了一遍我这个小数精度低的高斯消元模板,感觉已经可以手打啦==接下来再做几天的经典高消模型 1 #include 2...
阅读全文
摘要:其实读懂题意之后,题目总体还是比较好做的,除了个别地方==什么叫保证稳定呢,就是取完这个木块之后,木块的上面,左上,右上不因为他被拿了而没有支点首先要能想到用包含pair的map来判断某个坐标有没有木块(stl真方便set里面放的都是当前可以取的木块,用set来实现取最大值,取最小值,加木块,删木块...
阅读全文
摘要:很末尾到首开始看每一位对总和的贡献=倒数第一位:贡献了C(n-1,k)次个位数倒数第二位:贡献了C(n-2,k-1)次个位数,C(n-2,k)次十位数倒数第三位:贡献了C(n-2,k-1)次个位数,C(n-3,k-1)次十位数,C(n-3,k)次倒数第四位:贡献了C(n-2,k-1)次个位数,C(n...
阅读全文
摘要:首先要知道,如果第一行可以确定那么下面的n-1行都可以确定。如何确定第一行,假设第一行m个数,然后迭代算到n+1行,根据都为0可以得到m个方程,然后高斯异或解方程,自由元地方全部放1即可,就可以把第一行求出来继而balabaka可以都算出来==似乎我的guass放自由元部分略繁琐,不急马上搞一个漂亮...
阅读全文
摘要:很显然的lca树上倍增问题1.两个点是相同点ans=n2.两个点深度相同ans=n-size 包含x子树-size 包含y子树3.两个点深度不同:则ans=深的那个向上走step/2步的size-向上走step/2-1的size然后用倍增写啦==额我的solve函数好丑 1 #include 2 #...
阅读全文
摘要:记录前缀价值和,开26个map保存某字符的某价值出现的次数,再次出现加上即可= 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 mapmp[28]; 7 char s[100005]; 8 int main()...
阅读全文
摘要:额现在才补==这题当时是cp各种姿势打表发现的==然后我大胆用了类似筛法写了一下,竟然给过了==规律:如果gcd(a, b) = xor(a, b) = c, 则 c = a - b然后就能利用c来筛了 1 #include 2 #include 3 int vis[30000005],sum[30...
阅读全文
摘要:这是民大学长之前出的一次题目,感觉题目不错现在才写题解=化简不难得到:sig(maxval[i]−minval[i])=sig(maxval)−sigma(minval)如何求所有最大值和最小值呢,分别从大到小和从小到大排序利用并查集就行了,比较巧妙。额==题目设了一些坑,一个是一个方向的并查集会爆...
阅读全文
摘要:其实归根到底还是3853那样的分两种情况看后继点,只是递推公式和化简公式较为繁琐我是参考别人的化简:http://blog.csdn.net/auto_ac/article/details/9919851化出来的公式倒是很简单== 1 #include 2 #include 3 #include 4...
阅读全文
摘要:套一个状态压缩就是和3853一样的期望了:http://www.cnblogs.com/xiao-xin/articles/4307653.html仔细分析一下后继点在已买和未买可以很容易写出方程 1 #include 2 #include 3 #include 4 using namespace ...
阅读全文
摘要:同3853:http://www.cnblogs.com/xiao-xin/articles/4307653.htmldp[i]=sum(dp[j])+1,从后向前递推,注意’滑翔‘的点 1 #include 2 #include 3 #include 4 using namespace std; ...
阅读全文
摘要:首先学习概率dp,讲的很好的网站:http://kicd.blog.163.com/blog/static/126961911200910168335852/然后也有引自http://blog.csdn.net/auto_ac/article/details/9907881博文的一段话:很多概率题总...
阅读全文
摘要:因为过年,好久没更博客了,最近要狂补题解了==1.做了几天的概率dp,稍后还要写一篇概率dp和期望的总结,当然,下面几天的专题还是概率dp2.接着还要整理一个漂亮的高斯消元模板=3.最近打了几场cf还有其他bc、cc和gym的比赛,个别好题补一下题解然后就是开下一个专题和继续打比赛==-------...
阅读全文