- 博客(89)
- 资源 (8)
- 收藏
- 关注
原创 CSU 1216 异或最大值(01Trie)
字典树,碰到了一个同类型但比这个难点的题,不会做,先找个简单的来练练,铺垫下。01Trie就是每层只有0和1的字典树。把一个数字的二进制看成字符串,从高位到低位放进字典树。 http://blog.csdn.net/fuyukai/article/details/50366133 这里讲的很详细。#include <stdio.h>#include <string.h>const int MA
2017-08-31 20:15:01 358
原创 hdu 6156 Palindrome Function(数位dp)
之前做网络赛的时候,看出来这是数位dp了,奈何自己不会数位dp,网上找了个数位dp计算回文数的模板也套错了 因为不会数位dp,也找不出是哪里的毛病。 现在学了数位dp,再来切这题。 这题和LightOJ 1205 Palindromic Numbers基本一样,就是多了个不同的进制。在lightoj 1205的基础上,再加一维表示不同的进制,然后数位dp即可。做的时候数组开小了,wa了好几发。。
2017-08-31 16:08:42 319
原创 LightOJ 1205 Palindromic Numbers(数位dp)
做的时候毫无思路。 思路参考的:http://blog.csdn.net/harlow_cheng/article/details/77466732 代码参考的:http://blog.csdn.net/u010660276/article/details/46554067 他们是用的三维数组,dp[start][pos][state],表示从第start位开始搜索,即这个回文数的长度为sta
2017-08-31 16:02:26 263
原创 hdu 3252 Round Numbers(数位dp)
给你一个区间,求区间内的round number的个数,如果一个数字的二进制表示中,0的个数大于等于1的个数,则这个数字叫做round number。 把数字用二进制表示出来,然后数位dp一发就好。这个题前导0会影响到结果,所以要考虑前导0。我做的时候就没想前导0,看了题解才想到还有前导0呢。 参考:http://blog.csdn.net/wust_zzwh/article/details/5
2017-08-30 22:53:41 321
原创 hdu 3652 B-number(数位dp)
求1-n内,包含13且能够被13整除的数字的个数。 和 hdu 3555 Bomb相差不大,就是多了一个要整除的条件,那就在再添加一个状态来标记是否能被13整除。然后数位dp即可。 不过在转移状态的时候,我搞错了 参考:http://blog.csdn.net/libin56842/article/details/10026063#include <bits/stdc++.h>using n
2017-08-30 22:37:03 190
原创 hdu 4734 F(x)(数位dp)
一个十进制数字x,有n位数字,表示为AnAn-1….A1,定义F(x)=An∗2n−1+An−1∗2n−2+...+A2∗2+A1∗1F(x) = A_n*{2}^{n-1}+A_{n-1}*{2}^{n-2}+...+A_2*2+A_1*1 现在给你A和B,计算在[0,B]之间有多少数字的F(num) <= F(A) 参考:http://blog.csdn.net/wust_zzwh/arti
2017-08-30 22:07:42 250
原创 hdu 3555 Bomb(数位dp)
和不要62一样,算出来不要49,n减掉就好。#include <stdio.h>#include <string.h>typedef __int64 LL;int digit[25];int len;LL f[25][2];void calc(LL num){ len = 0; while(num) { digit[len++] = num%10;
2017-08-29 21:41:02 205
原创 hdu 2089 不要62(数位dp)
这个题之前学数位dp的时候做过,但是水过两个水题之后就不再学数位dp了,知难而退了。不过题不刷始终还是不会,专练练数位dp。 以前看的是《初探数位dp》,现在看的http://blog.csdn.net/u013008291/article/details/46463449 先套一下大神的模板,体会下模板的作用。模板自己一步步看看就看懂了。 http://www.cnblogs.com/jff
2017-08-29 20:50:17 242
原创 poj 1741 Tree(树分治)
点分治。 如果不了解树分治的话,可以先看看09年国家集训队的论文 https://wenku.baidu.com/view/1bc2e4ea172ded630b1cb602.html https://wenku.baidu.com/view/60c6aa1ffc4ffe473368aba8.html 这两个一个pdf的,一个ppt。 参考:http://blog.csdn.net/qq_3
2017-08-29 17:55:56 339
原创 poj 3107 Godfather(树形dp)
树的重心。#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int MAXN = 50010;const int MAXM = 100010;struct Edge{ int to,next;}edge[MAXM];int head[MAXN];int son
2017-08-28 19:58:26 283
原创 poj 1655 Balancing Act(树形dp)
求树的重心,如果有多个,输出编号最小的。 在树形dp题单看到了poj 1741 Tree,只会暴力搜索,不会别的办法。就搜题解,发现这是个树分治啊,怎么会在树形dp里?求解过程中涉及到了求树的重心,不会求,百度,才发现原来树形dp在求树的重心这里 树的直径、树的重心与树的点分治:http://www.cnblogs.com/zinthos/p/3899075.html#include <stdi
2017-08-28 19:28:48 305
原创 hdu 2196 Computer(树形dp)
给出一个计算机组成的树,这棵树是无向的。要求计算出每个节点到其他节点的最大距离。对于一个节点u来说,距离他最远的点,要么来自以他为根节点的子树,要么来自他的父节点,即整个图去掉以u为根节点的子树,距离u的父节点的最远距离再加上u与其父节点的距离。 先dfs一次,求出每个节点子树中距离他最远的距离。同时还要记录次远距离。然后再dfs一次,再更新从父节点过来的那个距离。记录次远距离就是因为在更新父节点
2017-08-27 08:02:35 261
原创 hdu 1520 Anniversary party(树形dp)
树形dp入门题,我要入门了。 参考:http://www.cnblogs.com/kuangbin/archive/2012/08/28/2659716.html http://blog.csdn.net/shuangde800/article/details/9731725 dp[u][0]表示以u为节点的子树,不选u节点的最大值 dp[u][1]表示以u为节点的子树,选u节点的最大值dp
2017-08-26 18:15:09 208
原创 hdu 4407 Sum(容斥原理)
先给n个数,1-n,排成一行,进行m次操作。操作1是计算第x个数和第y个数(闭区间)之间和p互质的数字的和。操作2是把第x个数字改成c。如果没有第二个操作,这个题还是很简单的,看到第二个操作,就有点懵了,一旦修改了数字那就不是连续的了,不好求了。好在修改次数很少,顶多1000次操作,只有一部分是操作2.这样就可以把操作2用一个map记录下来,然后按照连续区间求和,然后再遍历map修改那些改变过的值。
2017-08-26 11:50:01 298
原创 hdu 4059 The Boss on Mars(容斥原理)
给你一个数n,求1-n之间所有与n互质的数字的四次方的和。求小于n且与n互质的数字以及求这些数字的和比较简单,但是这里多了个四次方,求四次方和,这就第一次碰到了。不过网上找了下,有求四次方和的公式。 有了这个那就好求了。这题最大的难处是取模,wa了一大片,一定要注意模运算,一不小心就溢出了。#include <bits/stdc++.h>using namespace std;typede
2017-08-26 11:42:20 301
原创 hdu 4135 Co-prime(容斥原理)
经典容斥入门题?#include <bits/stdc++.h>using namespace std;typedef long long LL;LL solve(LL num, LL n){ vector<LL> p; LL temp = n; for(LL i = 2; i <= temp/i; ++i) { if(temp%i == 0)
2017-08-25 11:57:13 225
原创 zoj 3556 How Many Sets I(容斥原理)
刚看这题有点懵逼,结合题解才看懂题目意思 题意:给你一个集合S,S有n个元素,有多少有序集合(S1,S2,...,Sk)(S_1,S_2,...,S_k)满足S1⋂S2⋂...⋂Sk=ϕS_1\bigcap S_2\bigcap ...\bigcap S_k=\phi ,SiS_i是S的子集,而且选出的这K个集合是可重复的。 思路:S一共有2n2^n个子集,从里面选k个集合(可重复),使得交集为
2017-08-25 09:39:24 238
原创 hdu 6165 FFF at Valentine(强连通分量缩点+拓扑排序)
题目思路倒是不难,我做的时候画了画样例,就感觉只要这个有向图能被一条单向路径串起来成一个链,也就是根单向的直线,那情侣就赢了。否则,就完了。因为成了一个单向的链后,任意两点,都可以从某一点到达另一点。不过,我不会写代码怎么验证有向图是个单向的链,然后就处于懵逼中。这刚学了tarjan缩点,才来做。#include <bits/stdc++.h>using namespace std;const i
2017-08-23 17:51:27 705
原创 UVALive 4683 Find The Number(容斥+二分)
题单第六题:http://blog.csdn.net/shengtao96/article/details/52490020 题意:给你k个数(保证这k个数不能互相整除),找出第n个只能被这k个数里面的某一个数整除的数(不能被2个或者2个以上的数整除)。 看完题想想,应该就能二分来做,问题是怎么找第n个只能被这k个数字里面某个数字整除的数字。容斥的时候我们把相交的部分全部减去,只剩下各个集合不相
2017-08-23 17:07:58 325
原创 poj 2773 Happy 2006(容斥+二分)
输入m和k,求与m互质的第k个数,与m互质的第一个数为1。先分析求某个范围内与m互质的数,肯定要容斥的,现在求第k个与m个互质的数字,而且范围不知道,既然不知道,那就二分来找这个范围,找到后也就找到结果了。#include <stdio.h>#include <string.h>typedef __int64 LL;const LL One = 1;const LL INF = One<<61
2017-08-23 14:46:44 204
原创 poj 2186 Popular Cows(Tarjan,强连通分量缩点)
参考:http://blog.csdn.net/u010885899/article/details/47254707 题意是给你几头牛,然后给你一个A牛喜欢B牛 这类的关系,这种喜欢的关系还可以传递,比如A喜欢B,B喜欢C,那就A也喜欢C了。问有多少头牛被所有牛喜欢。 模板题,Tarjan求出强连通分量,然后缩点,缩点后如果只有一个出度为0的点,则这个强连通分量里的点数就是答案,如果出度为0的
2017-08-23 12:41:09 331
原创 poj 3695 Rectangles(容斥原理)
在容斥原理题单里看到这个题,第一想法肯定是扫描线啊。但一看题单分析,还真是容斥。矩形相交的图形和文氏图差不多。然后dfs容斥就好了 题单里第四题:http://blog.csdn.net/shengtao96/article/details/52490020#include <stdio.h>#include <string.h>#include <algorithm>using names
2017-08-22 12:27:09 329
原创 UVA 10721 Bar Codes(容斥原理)
题意转换下就是x1+x2+x3+...+xk=n,1<=xi<=mx_1+x_2+x_3+...+x_k = n, 1<=x_i<=m。以样例为例子,x1+x2+x3+x4=7,1<=xi<=mx_1+x_2+x_3+x_4=7,1<=x_i<=m,设y1=x1−1,y2=x2−1,y3=x3−1,y4=x4−1y_1=x_1-1,y_2=x_2-1,y_3=x_3-1,y_4=x_4-1,则y1+
2017-08-21 19:53:01 252
原创 poj 3904 Sky Code(容斥原理)
思路:从一堆数里面选四个数,而且这四个数gcd=1,问一共有多少种方案,我们考虑这四个数字gcd!=1的情况有多少种方案,然后用C(n,4)-4个数gcd!=1的情况。计算gcd!=1的方案数,是将这N个数字每个数字都素因子分解,对于每个数num,计算出他的素因子能够组合出多少种num的因子,然后记录下来,同时还要记录这个因子是由几个素数组合成的,以便容斥时判断加减。在计算gcd!=1的情况的时候呢
2017-08-21 16:59:23 346
原创 poj 1091 跳蚤(容斥原理)
要使跳蚤可以跳到起始点左边一个单位,要保证卡片上N+1个数字的gcd=1gcd=1,否则的话,跳蚤跳到距离起始点左边或者右边的距离一定不能躲开他们之间的公因子。这就好求了,就是求有多少种方案使得这N+1个数字的gcd为1,这个并不好求,但是我们可以求有多少种方案使得N+1个数字的gcd!=1gcd!=1。因为M是最大的,所以这个gcd一定是M的因子,我们可以把M素因子分解,然后枚举M的素因子进行容斥
2017-08-20 21:30:57 309
原创 zoj 3233 Lucky Number(容斥原理)
题目不难,有些细节没想到。。。。 求出能够至少被BLN的某个数字整除的数字的个数很好求。要满足BUN中至少有一个数字不能整除这个幸运数,排除掉能被BUN中所有数字最小公倍数整除的数字后就完了。 也就是用容斥原理求[low,high]满足BLN集合条件的x的时候,减去[low,high]能整除lcm(x,bm)的个数(bm是指BUN中所有数字的公倍数) 还有就是最小公倍数可能会溢出long lo
2017-08-19 22:50:45 605
原创 hdu 1695 GCD(容斥原理)
和hdu 2841差不多,去个重复就行#include <bits/stdc++.h>using namespace std;vector<int> p;int solve(int num, int n){ if(num == 1) return n; p.clear(); for(int i = 2; i <= num/i; ++i) { i
2017-08-19 10:26:28 191
原创 hdu 2841 Visible Trees(容斥原理)
和hdu 1796差不多 枚举1-n的每个数字,计算1-m有多少数字和他互质。 合数分解,然后容斥#include <bits/stdc++.h>using namespace std;vector<int> p;//计算1-n有多少数字与num互质int solve(int num, int n){ p.clear(); for(int i = 2; i <= num/
2017-08-19 09:23:49 228
原创 hdu 1796 How many integers can you find(容斥原理)
有坑,那就是可能输入0。这个容斥比较简单,枚举所有可能的情况,然后容斥,奇加偶减,共2^m种情况。计算lcm的时候小心int溢出#include <bits/stdc++.h>using namespace std;int n,m;int mset[25];int lcm(int a, int b){ return a/__gcd(a,b)*b;}int main(){ i
2017-08-18 21:56:27 187
原创 手动开高次方
也就开到59次根号下。当然精度要比pow(n,1/m)高。 find(x,k)表示x√k\sqrt[k]{x}const LL INF = 1e18+300; const LL T = (1LL<<31);LL pow_mul(LL x,LL k) { LL ans=1; while(k) { if(k&1) {
2017-08-18 20:14:17 901
原创 hdu 3208 Integer’s Power(容斥原理)
看着和hdu 2204有些相似,但是解法还是有差距的。求(a,b)之间的数字的幂的和,求出来1-b的减去1-(a-1)的即可。一个数字表示成M^K,取那个最大的K作为这个数字的幂。考虑枚举所有的幂,2^60>1e18,所以从2枚举到59就行。比如64可以表示成2^6,4^3,8^2,则64的幂就是6。但是有重复,就用到容斥了,8^2已经包含64了,但是64的幂是6,所以就要去掉8^2这种情况,也要去
2017-08-18 19:59:38 278
原创 hdu 2204 Eddy's爱好(容斥原理)
问1到N之间有多少个可以表示成M^K(K>1)的数,M^K <= N的个数有M−−√K\sqrt[K]{M}个,如果K是合数,那么M^(a*b)可以表示成(M^a)^b和(M^b)^a,这就出现重复了,所以K一定要是素数,K即使是素数,也会出现重复,比如比如9^3==3^6==27^2,所以还要去掉指数是素数的积(3^6)的情况。因为2^60>1e18,2*3*5*7>60,所以最多枚举三个因子(K
2017-08-16 19:17:32 231
原创 poj 2392 Space Elevator(多重背包)
先排序,再背包。#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int MAXN = 500;int dp[MAXN*100];struct block{ int h,a,c;};block bs[MAXN];bool cmp(const block& a,
2017-08-15 22:17:02 207
原创 hdu 1171 Big Event in HDU(多重背包可行性)
总价值的一半为背包容量,可以多重背包,可以转成完全背包#include <bits/stdc++.h>using namespace std;const int MAXN = 10000;int num[MAXN];int dp[MAXN*100];int v[MAXN];int n,sum,W;int main(){ ios::sync_with_stdio(false);
2017-08-15 22:11:28 236
原创 poj 1787 Charlie's Change(完全背包 或 多重背包 记录路径)
多重背包,但是可以用完全背包来做。 参考:http://www.cnblogs.com/kuangbin/archive/2012/09/20/2695803.html#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;const in
2017-08-14 16:09:22 408
原创 hdu 6119 小小粉丝度度熊(尺取法)
合并相互交叉的区间,尺取法#include <bits/stdc++.h>using namespace std;const long long MAXN = 100100;struct node{ long long s,e;};node prens[MAXN], nns[MAXN];long long n,m,cnt;bool cmp(const node& a, const
2017-08-14 13:55:20 713 4
原创 Codeforces Round #428 (Div. 2) D. Winter is here(容斥,补题)
最后几分钟才看这题,看了题解才看懂啥意思。 枚举gcd(gcd>1),比如gcd是b,找到b的倍数(包括b)的个数t,则,这t个数的因子都有b,则这些序列的价值就是∑ti=0i∗(ti)\sum_{i=0}^{t}i*\bigl(\begin{smallmatrix}t\\ i\end{smallmatrix}\bigr),化简后就是t∗2t−1t*{2}^{t-1},因为这都是b的倍数,比如2*
2017-08-14 13:50:06 238
原创 Codeforces Round #428 (Div. 2) C. Journey(dfs)
暴力一发。做的时候没设置输出的精度,wa了好几发#include <bits/stdc++.h>using namespace std;const int MAXN = 100010;vector<int> G[MAXN];bool book[MAXN];int n;double res;void dfs(int nm, int step, double p){ bool fla
2017-08-14 13:18:45 205
原创 Codeforces Round #428 (Div. 2) B. Game of the Rows(贪心,补题)
四个人的座位拆成双人和单人,先排完四人的,再排二人的,再排单人的。我做的时候直接就把某个group排完,wa到死。看了下别人的贪心策略,写了下就A了#include <bits/stdc++.h>using namespace std;int n,k;int seat[3];int num[110];int main(){ ios::sync_with_stdio(false);
2017-08-14 13:17:20 221
原创 Codeforces Round #428 (Div. 2) A. Arya and Bran
#include <bits/stdc++.h>using namespace std;const int MAXN = 110;int candy[MAXN];int main(){ ios::sync_with_stdio(false); int n,k; cin >> n >> k; for(int i = 0; i < n; ++i) c
2017-08-14 13:13:17 226
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人