- 博客(38)
- 资源 (4)
- 收藏
- 关注
原创 hdu5254
//给一个n*m的棋盘,//如果是//01//10//的情况,可以将这两个0变成1//给出棋盘中哪些位置是1,//问这棋盘最后有多少1//bfs找每一个1的斜对角是否为1//如果找到一对斜对角为1的数//斜对角对应的旁边的0变为1//对于每一个新生的1其旁边的4个点的标记数组改为0#include#include#include#includ
2015-05-31 22:05:57 622
原创 hdu5241Friends 大数乘法
//可以知道各种语言相互独立//故而知道是2的乘方//由样例可知是32的n次方//剩下的是一个大数乘法#include#include#includeusing namespace std ;const int maxn = 30050 ;const int mod = 100 ;int num[maxn] ;int len ;int solve(i
2015-05-31 13:57:11 1236
原创 hdu5246超级赛亚ACMer 二分
//给一个序列,ACMer的初始值为0-m任意一个//每次和序列值ai相等就acmer的值就为ai+k//k的值是每次比较后减-//问acmer最后得到的值能否大于所有值//从小于m的最小的值开始,用二分找小于m+k最小的那一个,直到大于最大值#include#include#include#includeusing namespace std ;const
2015-05-30 22:49:45 630
原创 hdu5248 二分
//有一个序列A , 改变序列的元素使其成为单调递增的序列B//求最小的max(|Ai-Bi|)(1//枚举最大值x,用二分查找#include#include#includeusing namespace std ;const int maxn = 100010 ;int a[maxn] ;int b[maxn] ;int n ;int judge(i
2015-05-30 22:46:39 938
原创 hdu2824 The Euler function 筛选法求欧拉函数模板题
//求a , b范围内的所有的欧拉函数//筛选法求欧拉函数模板题#include#include#includeusing namespace std ;const int maxn = 3000010 ;typedef __int64 ll ;int e[maxn] ;int a , b ;void Euler(){ int i,j;
2015-05-29 18:39:24 681
原创 hdu4002 Find the maximum 欧拉函数
//求小于N且n/phi(x)最大的n如果有多个,输出最小的//phi(x) = x*(1-1/p1)*(1-1/p2)*(1-1/p3)....//要使得x/phi(x) 最大,即使得(1-1/p1)*(1-1/p2)*(1-1/p3)....最小//又p1, p2 , p3 , ....//全为素数因子,所以可以对枚举所有素数因子乘积,//打表后找小于等于n的数#inc
2015-05-29 16:24:37 743
原创 hdu3501 Calculation 2 欧拉函数
//求小于n且和n不互质的所有数之和//若gcd(n , i) == 1 那么 gcd(n , n-i) == 1//可以用反证法//设gcd(n , n-i) != 1;//那么可以有 n = k1*a//n - i = k2*a ;//i = (k1-k2)*a //gcd(n ,i) != 1//那么 ans = n*(n-1)/2 - n*euler(n)/
2015-05-28 22:11:55 574
原创 hdu2588GCD
//给出n , m 求出小于n且与n的最大公因数大于m的个数//枚举所有n的大于m的因数i为最大公因数//那么就只需要求n/i的欧拉函数就行#include#include#includeusing namespace std ;const int maxn = 100010 ;typedef __int64 ll ;ll f[maxn] ;ll get_f
2015-05-28 20:53:07 611
原创 hdu1286找新朋友 欧拉函数模板题
#include#include#includeusing namespace std ;int Euler(int n){ int rea = n ; for(int i = 2;i*i { if(n%i == 0) rea -= rea/i ; while(n%i == 0)
2015-05-28 19:22:21 629
原创 poj2796Feel Good 单调栈
//一个长度为n的序列,对于一个区间中的value为这个区间的最小值乘上这个区间的所有数的和//这就是找每一个点,找以其为最小值的区间//显然直接暴力法找必然超时//可以开一个单调递增栈,对于每一个新元素a[i]//当前值小于等于栈顶元素,表示以栈顶元素为最小值的区间的右端是i//栈顶元素a[j]出栈 , 由于是单调递增栈,新的栈顶元素a[k]必然小于a[j],故需要更新新的栈
2015-05-26 20:53:42 4589
原创 Codeforces Round #172 (Div. 1) BMaximum Xor Secondary 单调栈
//给一个长度为N的个不相同的序列,找出所有区间中最大值和第二大数的异或值最大的值//对于所有区间只需要找其最大值和第二大数,所以对于很多区间的结果是重复的//对于每一个数,它起作用的区间只有在其前面最多只有一个数是大于它的//可以用一个单调递减栈来做,对于每一个新的数a[i],在它前面第一个大于它的数a[j]//和第二个大于它的数之间的数到a[i]的区间的数的最大值和第二大数为a
2015-05-26 19:12:26 1132
原创 zoj 3870 Team Formation 位运算
//给n个数,找有多少队的两个数的异或值大于它们自己//对于两个数中小的那个数的最高位在大的数中该位为0//那么两个数异或所得的数比两个数大//否则,这个数比大的数小#include#include#include#includeusing namespace std ;const int maxn = 100010;long long map[40];
2015-05-26 17:18:46 753
原创 hdu4939Stupid Tower Defense dp
//给你三个塔//红塔:敌人过红塔时有每秒x伤害//绿塔:敌人过绿塔后有每秒y伤害//蓝塔:敌人过蓝塔后过每一格时间增加z//问敌人过n个格造成最大伤害//很容易想到红塔必然放最后//所以对于每一格的选择只有蓝塔和红塔//用dp[i][j]表示对于前i格选了j个蓝塔//dp[i][j] = max(dp[i-1][j] + (i-1-j)*y*(t+j*z) , d
2015-05-22 19:19:42 940
原创 hdu4939 Stupid Tower Defense stl map
#include#include#include#include#includeusing namespace std ;const int maxn = 100010 ;int vis[maxn];map map_r ;map map_c ;map , int> ma ;int main(){ //freopen("in.txt","r"
2015-05-21 20:31:15 444
原创 hdu4952Number Transformation
// 给你一个数,有k次操作,第i+1次操作得到的数,得到最小的大于第i次操作的数是i+1的倍数//将第i个数拆分为i*x, 那么(i+1)*x' >= i*x//得到x' >= x - x/(i+1) //由式子可得到当x小于(i+1)后不变//复杂度为x的开方#include#include#includeusing namespace std ;typed
2015-05-20 20:47:22 654
原创 hdu4961
//预处理所有数的因数//从前到后扫一遍,记录所有因子的最后一个位置,找出所有b[i]//然后从后到前扫一遍,找出所有c[i]#include#include#include#include#includeusing namespace std ;const int maxn = 100010 ;typedef __int64 ll ;vectorvec
2015-05-19 20:25:56 601
原创 hdu4970
//和hdu1556差不多,不过hdu1556时间是3s , 可以用线段树过//开一个n的数组a[n],对于每一个tower变换l , r , d//a[l]+=d , a[r+1]-=d;//从1到n扫一遍,a[i] += a[i-1]//那么a[i]里存的·就是第i个位置受到的伤害#include#include#includeusing namespace s
2015-05-19 17:33:48 674
原创 hdu5229 ZCC loves strings 博弈
//很容易可以判断当两个字符串相等或者长度相加为奇数时第一个赢//用map存入每一个字符串标号,对应找出每一个字符串有多少个以及其长度是奇数还是偶数//则很容易求得答案#include#include#include#includeusing namespace std ;const int maxn = 200010 ;typedef __int64 ll ;
2015-05-17 13:41:34 673
原创 codeforce266D 最短路
//给你一个无向连通图,找一个点使得它到这个图最短路中最大的距离最短//可以遍历所有边,对于每条边有的连个顶点u,v//可以通过这两个点将这个图分左边,u-v边,右边三个部分//但是哪些点分在左边,哪些点分在右边,如果暴力所有情况显然会超时//用一个二维数组存入所有点到u,v两个点的最短路//将其排序,对于a[i].u >=a[j].u ,a[i].v >= a[j].v 的点
2015-05-16 14:56:46 722
原创 codeforce543B
//当s1,t1与s2,t2两条线路没有交点时// ans = min(ans , m - dis[s1][t1] - dis[s2][t2])//当s1,t1与s2,t2两条线路有交点时,则它们的交点必定是连续的//设,x1,x2为s1,t1最短路和s2,t2最短路的交点//那么x1,x2,必然在这两条最短路上,那么dis[x1][x2]也在这条线上//枚举相交线段i,j,找
2015-05-15 21:56:10 713
原创 codeforces 366D 并查集
//给你一个无向图,图的每条边有一个范围,所选数x要在这个范围能过这条边//求x最大范围//枚举所有的边的右边,对于所选右边找左边最小值,用并查集判断是否可行#include#include#include#includeusing namespace std ;const int maxn = 1010;int F[maxn] ;int find(int
2015-05-14 21:16:21 672
原创 poj2663 Tri Tiling dp 水题
用2个组合为3种情况,4,6,8......为2种情况#include#include#includeusing namespace std ;const int maxn = 40 ;typedef long long ll ;ll a[maxn] ;ll dp[maxn] ;int main(){ // freopen("in.txt","r",
2015-05-12 22:48:51 559
原创 hdu1024Max Sum Plus Plus dp
//dp[i][j] 表示前i个数中有j段,得到的最大值//dp[i][j] = max(dp[i-1][j] , dp[i-1][j-1]) + a[i]//注意dp[i-1][j-1]为前i-1个点中不含i-1这个点得到的最优解//dp[i-1][j]中必须要有i-1中这个点#include#include#includeusing namespace std ;
2015-05-12 21:31:57 600
原创 hdu 1025 dp+二分求最长递增子序列
//dp[i],长度为i的递增子序列的最后一位的最小值//对于这种处理得到的dp[i]必然是递增的//对于第i个数a[i],只需要找到最小的大于它的位置pos,//由于是最小的大于a[i] ,pos - 1 的值必然小于a[i]//那么dp[pos] = a[i] ;#include#include#includeusing namespace std ;con
2015-05-12 16:33:02 550
原创 codeforce198B 最短路
//对于该点能到达的下一点用一条路径表示//然后用spfa求出其最小值//在更新最小点时判断一下他去这一个点时会不会淹死#include#include#include#includeusing namespace std ;const int inf = 0x3f3f3f3f;const int maxn = 100010 ;const int mod =
2015-05-11 22:51:45 609
原创 Codeforces Round #170 (Div. 1)A
//用并查集记录有几个集合,然后将总的集合数剪一即为所求答案//注意一下全0就行#include#include#includeusing namespace std ;const int maxn = 110 ;int map[maxn][maxn] ;int F[maxn] ;int n , m ;int find(int x){ if(F
2015-05-11 17:13:34 602
原创 Codeforces Round #168 (Div. 1)B 树形dp
//给一棵树,每次操作可以将包括顶点1的连通子集的所有点的节点加1或减1//问最少几次操作使得这棵树的所有顶点的值都为0//以1为根节点建树//将加和减分开考虑,用up[u],down[u]表示以u为跟节点的子树中需要加的操作//最大为up[u] ,需要减的操作最大为down[u] //其余的加和减的操作则可以在处理这两个操作时一起覆盖//在将u的子数全都处理完后u点的值由
2015-05-10 21:58:59 442
原创 poj1061 青蛙的约会 扩展欧几里得
//(x + km)%l == (y + kn)%l//s*l + k(m - n) = y - x//用扩展欧几里得求出k//注意一下k需要为最小正数#include#include#includeusing namespace std ;typedef __int64 ll ;ll exgcd(ll a , ll b , ll &x , ll &y){
2015-05-09 16:43:18 647
原创 hdu1576 A/B 扩展欧几里得求逆元
//(a/b)%c ==> a%c = (b*k) %c;// k = (a*(b_1))%c ,b_1为b的逆元#include#include#includeusing namespace std ;const int mod = 9973 ;typedef __int64 ll;int exgcd(int a ,int b , ll &x ,ll &y){
2015-05-09 14:59:14 755
原创 Codeforces Round #167 (Div. 1)B
//对x从小到大排序//开一个数组equal,存入一段相同的x的值//那么ans = equal[1]! * equal[2]! ....//然后在除以没一段相同x中的y相同的数的阶乘//由题意可知,开(xi == xj),(yi == yj)的最多只有两个//可以记录下(xi == xj) ,(yi == yj)的对数,//在计算的时候可以对偶数除2就行#includ
2015-05-08 21:43:21 514
原创 Codeforces Round #162 (Div. 1) C Choosing Balls dp
//dp[i] 表示以颜色为i结尾的最大值//dp[i] = max(dp[i] , dp[i] + a*v[i] ,other_max + b*v[i]) ;//为除颜色i以外的其它颜色的最大值#include#include#includeusing namespace std ;const int maxn = 100010 ;const __int64 in
2015-05-08 17:29:00 669
原创 Codeforces Round #162 (Div. 1) B dp
//存入所有数的素数因数//若两个数不互质,那么他们之间必然有素数因数//dp[i][0]表示第i个数不选前i个数中能得到的最长序列//dp[i][1]表示选了第i个数//dp[i][0] = max(dp[i-1][0] , dp[i-1][1])//dp[i][1] = max(dp[pos][1] + 1 ,dp[i][1] );//pos位第i个数的质数因子出现的最
2015-05-07 20:24:05 445
原创 Codeforces Round #157 (Div. 1)B 数位dp
//枚举有几个(7或4),用数位dp的记忆化搜索找有i个(7或4)的数又多少个//暴力搜索在第i个中选几个#include#include#includeusing namespace std ;const int mod = 1e9 + 7;int dp[20][20];//第i位有 j个数(7或者4)int bit[20] ;int temp[20];i
2015-05-05 20:19:14 627
原创 hdu2089 数位dp水题
#include#include#includeusing namespace std ;const int maxn = 10 ;int dp[maxn][3];//0什么都没有,1,有6,2有62或4int bit[maxn] ;int dfs(int pos , int flag ,int lim){ if(pos == 0) return
2015-05-04 17:20:25 631
原创 zoj3870Team Formation
//将其从小到大排序//对于每一个数,其0点位为其前面数的最高位,那么它们的异或一定大于它们两个的值#include#include#include#includeusing namespace std ;const int maxn = 100010;long long map[40];int a[maxn] ;long long solve(int m
2015-05-04 16:09:18 595
原创 hdu4507吉哥系列故事——恨7不成妻 数位dp
//(a1 + a2 + a3 + a4)^2 + (b1 + b2 + b3 + b4)^2//=a1^2 + (a2+a3+a4)^2 + 2*a1*(a2+a3+a4) + b1^2 + 2*b1*(b1+b2+b3)//每次dfs返回三个数,a,b,c//a表示个数,b表示所有数的和,c表示所有数的平方和//那么更新的ans.a += a;//ans.b +=(b +
2015-05-04 16:02:54 666
原创 hdu3555Bomb 数位dp
#include#include#includeusing namespace std ;const int maxn = 20 ;int bit[maxn] ;__int64 dp[maxn][maxn][2] ;//dp[i][j][1]第i位数为j时内有49的数量,0位不含void init(){ memset(dp , 0 ,sizeof(dp))
2015-05-02 16:48:13 559
原创 hdu 3555 数位dp水题 记忆化搜索做法
#include#include#includeusing namespace std ;const int maxn = 20;__int64 dp[maxn][3] ;//dp[i][flag] ,flag = 2,表示已经有49,flag == 1,表示没有49,这一位是4,int bit[maxn] ; //flag == 0, 什么都没有__int64
2015-05-02 15:20:22 779
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人