自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

DC的ACM奋斗史

思路即模板

  • 博客(95)
  • 收藏
  • 关注

原创 大数运算(二) —— 大数加法

注:本程序适用于100000位以内的加法运算,效率很高,在内存和时间允许的情况下可完成10^8位的加法运算下面用实例来模拟一下我的方法:输入:a=1234567890123456789  b=9876543210987654321a  :  9     8     7     6     5     4     3     2     1     0     9     8

2012-08-25 10:16:44 1832 4

原创 大数运算(一) —— N的阶乘

注:本程序只适用于N10000!的结果大约有36000位,需要开一个至少为36000的数组下面用实例来模拟一下我的方法:输入N=60       1       2       3       4       5       6       7       8       9       10      11      12(数组指针)i=11

2012-08-25 09:30:19 1796

原创 UVa 11294 - Wedding(2-SAT)

想了好长时间,绕死我了可以把每对夫妇看做一个点,w和h则表示他们所在的位置可以假定w0和h0的位置(因为相反的位置效果一样),然后建图建图的时候,由于这一条件——当一对吵架者中的一个人出现在新娘的对面时,另一个必须在新娘的同侧,连边即可。#include #include #include #include using namespace std;#define

2013-09-10 17:18:59 1038

原创 UVa 10765 - Doves and bombs(割点,双连通分量)

求各点所在的双连通分量个数,水题#include #include #include #include #include #include #define maxn 10005using namespace std;struct Edge{ int u; int v;};struct node{ int no; int p;};int pre[ma

2013-09-10 09:36:57 1022

原创 UVa 11396 - Claw Decomposition(二分图判定,染色法,dfs)

可推知,该图必为一二分图,然后分两部分着色,用dfs可以实现之前用了一种方法,每访问一个点加入删除它所在的所有边,然后标记与边相连的所有点,不知为什么错误了,望高手指点以下是AC代码#include #include #include #define maxn 305using namespace std;vector G[maxn];int vis[maxn];boo

2013-09-07 23:07:31 961

原创 UVa 11504 - Dominos(缩点)

缩点之后dfs求连通块个数,水题#include #include #include #include using namespace std;#define maxn 100005vector G[maxn];vector H[maxn];stack S;int fa[maxn];int pre[maxn],lowlink[maxn],sccno[maxn],dfs_cl

2013-09-07 15:58:51 1074

原创 HDU 4454 - Stealing a Cake(三分)

我比较快速的想到了三分,但是我是从0到2*pi区间进行三分,并且漏了一种点到边距离的情况,一直WA了好几次后来画了下图才发现,0到2*pi区间内是有两个极值的,每个半圆存在一个极值以下是代码#include #include #include #define pi acos(-1.0)using namespace std;typedef struct{ doub

2013-09-02 16:11:23 932

原创 HDU 4465 - Candy(概率与数学优化)

2012成都Regional的B题,花了一个小时推出了式子,但是搞了好久发现都控制不了精度,后来突然想到组合数可以用log优化,改了之后就AC了比较水的概率题#include #include #define maxn 200005double f[2*maxn];double c(int a,int b){ return f[a]-f[a-b]-f[b];}int

2013-08-31 09:53:46 826

原创 ZOJ 3716 - Ribbon Gymnastics

题意:给出4个点坐标,以4个点为圆心画四个圆,四个圆不能相交,求最大半径和一共4个点,最短的两条不共点的线段之和即为答案#include #include typedef struct point{ double x; double y; point(double x=0,double y=0):x(x),y(y) {}} point;double s[1

2013-08-19 19:41:50 861

原创 HDU 3955 - March(bfs)

题目是模拟一个游戏的,不太好读,它有一些乱七八糟的条件,很容易搞错http://www.cppblog.com/aswmtjdsj/archive/2011/08/18/153800.html这位大神的博客里讲得非常清楚各种绕,各种折腾,哎...还是代码能力不行啊继续苦练吧。。#include #include #define maxn 105#define inf

2013-08-17 19:17:50 901

原创 HDU 4372 - Count the Buildings(组合计数)

首先想过n^3的组合方法,即f(i,j,k)=f(i-1,j,k)*(i-2)+f(i-1,j-1,k)+f(i-1,j,k-1),肯定搞不定然后想了好久没有效果,就去逛大神博客了,结果发现需要用到第一类stirling数第一类stirling数S(n,m)表示的是n个数排成m个非空环排列的数目每个环排列中必然有一个是可以看见的,然后再对这m个环求组合数不难理解,但是很难想到#

2013-08-15 11:53:07 1037

原创 HDU 4394 - Digital Square(BFS+乘法原理)

不怎么难的一道题,还是各种挫烂臭,数组开小,没有跑到9,没有记录长度,没有更新最小值,总之是各种恶心不多说了,面壁去。。。#include #include #define LL long longtypedef struct{ LL num; int len;} digit;LL ans,n;LL p[18];int len;bool f;digit

2013-08-13 09:03:05 1194

原创 HDU 3778 - Soccer(人肉)

这个题贴代码是为了反思的。。。比赛交的时候就TLE,赛后一直TLE,后来被某神指点后才发现自己把字符串定义在结构体里面,每次拷贝一个字符串,不TL才怪哎。。。丢死了。。。TL的代码还是不贴了#include #include #include using namespace std;typedef struct{ int id; //char s[50];

2013-08-12 20:18:55 918

原创 HDU 4577 - X-Boxes(杭州邀请赛B题)(JAVA大数+规律)

首先,第一位最多可放置(n/(2^(k-1)+1)/2个(第奇数个肯定全都能放到),因为奇数不含因子2然后再看多余部分,可以放置1,3,5,7乘以他们的2^(jk)(j=1,2,3,4,...),这个跑一个循环就出来了两部分加和,即为答案这题一开始卡超时,后来发现把2^k写到循环里面了,改到循环外面存一下就AC了组队赛的第一个JAVA题import java.util.Scan

2013-08-10 18:58:12 1317

原创 SPOJ 364 - Pocket Money(DP)

很简单的递归结构的DP,状态转移方程:dmax(i,j)=max(dmax(i,j),dmax(i,k)dmax(k,j));dmin(i,j)=max(dmin(i,j),dmin(i,k)dmin(k,j))#include #include #define LL unsigned long longLL ma[110][110];LL mi[110][110];LL a[110

2013-08-09 15:50:51 792

原创 HDU 4649 - Professor Tian(2013MUTC5-1007)(概率)

不知道这题算作什么类型的题目,反正很巧妙,队友小杰想了没一会就搞定了为了学习这种方法,我也搞了搞,其实思路不难想,位运算嘛,只有0和1,而且该位的运算只影响该位,最多20位,一位一位地计算即可,只需要把每位的情况考虑清楚#include int a[210];char op[210];double p[210];int main(){ int n,cas=0;

2013-08-06 21:29:02 884

原创 HDU 4671 - Partition(2013MUTC5-1009)(整数拆分,五边形数定理)

还是数学知识匮乏,要这个五边形数定理以后得补充这类知识啊#include #define LL long longLL p[100005];int T,n,t;int main(){ p[0]=1; p[1]=1; p[2]=2; for(int i=3; i<=100000; i++) { for(int j=1

2013-08-06 19:35:53 1131

原创 UVa 10692 - Huge Mods(指数循环节)

关于指数循环节的公式以及证明:http://hi.baidu.com/aekdycoin/item/e493adc9a7c0870bad092fd9#include #include #include #define LL long longLL a[20];LL euler(LL n){ LL m=(LL)sqrt(n+0.5); LL ans=n;

2013-08-06 09:59:06 1396

原创 HDU 3903 - Trigonometric Function

这个题做了有近一个小时的时间,先后出现了思路错误、越界等一些情况,各种处理之后终于AC了先从公式入手——cos(nA+mB)=cos(nA)cos(mB)-sin(nA)sin(mB)而根据倍角公式,任意n倍的sin(nA)、cos(nA)、tan(nA)都可以化成sin(A)、cos(A)、tan(A)的多项式的形式根据余弦公式,cos(A)=(b*b+c*c-a*a)/(2*b

2013-08-05 16:34:27 981

原创 URAL 1233 - Amusing Numbers

首先计算出k至少为第几位,如果m小于这个数,那么输出0还有一种情况, 就是10的i次方的这种情况,如果i等于m,那么直接输出k,否则输出0其他的情况,就是二分,然后判断计算其插入到k之前的数的个数与k至少的位数之和#include #include #define LL unsigned long longLL d[20],k,m,s;int t;void init(){

2013-08-05 14:02:26 749

原创 URAL 1964 - Chinese Dialects(贪心)

题意:有n个人,会说k种语言,其中ai个人会说第i种语言,问最少有多少人会同时说k种语言一开始我还以为这是个容斥原理的题目,后来一想,贪心即可后面和前面的交集进行比较,如果不会有交集,则退出,否则求出新的交集,继续计算思路很巧妙,是个好题#include int n,k;int a[25];int solve(){ int x=a[0]+a[1]-n; if

2013-08-04 12:40:59 1073

原创 HDU 4259 - Double Dealing(求循环节)

首先将扑克牌进行一次置换,然后分解出所有的循环节,所有循环节的最小公倍数即为答案#include #include #include using namespace std;#define LL long longint n,k;LL d[850],ct;int vis[850];int a[850];int dfs(int x){ if(!vis[a[x]])

2013-08-03 16:52:11 1006

原创 HDU 4279 - Number

2012年天津赛区网赛的题目,想了好久,也没能想出来还是小杰思路敏捷,给我讲解了一番,才让我把这个题做出来f(x)=x-phi(x)(1——x与x互素个数)-g(x)(x的因子个数)+1其中g(x)为multiply(q(i)+1),x=multiply(p(i)^q(i))(p(i)为所有素因子)打表可得,phi(x)只有x=2时为奇数,其余全为偶数,而f(2)=0,可以不予考虑

2013-08-03 15:21:35 864

原创 URAL 1019 - Line Painting

跟前面某个题一样,都是区间染色问题,还是用我的老方法,区间离散化+二分区间端点+区间处理做的,时间跑的还挺短坑爹的情况就是最左端是0,最右端是1e9,区间求的是开区间#include #include #include #include using namespace std;typedef struct{ int l; int r;

2013-08-03 11:01:29 959

原创 URAL 1010 - Discrete Function

这是个什么题啊,F**K!答案一定是斜率最大的相邻两点!!(很容易想明白的,这里不给出了)#include #include double f[100005];double k(int a,int b){ return fabs((f[b]-f[a])/(double)(b-a));}int main(){ int n; scanf("%d",&n);

2013-08-02 17:16:26 872

原创 URAL 1007 - Code Words

简单题,用一个数组存储从i到n共有多少个1,方便移位的时候计数只有以下三种情况:1、l=n如果满足条件,直接输出,否则需要修改12、l=n+1需要删除1或03、l=n-1需要添加1或0这个题输入的时候要用scanf或cin(题目提示有空格或空行)#include #include char s[1050];int d[1050],cnt;int main(){

2013-08-02 16:11:24 787

原创 URAL 1117 - Hierarchy(递推或递归)

数据量不大,可以递推出所有1——2^k的结果,然后可以把过程分解首先找到比n小的最大的2^k,然后从2^k继续计算,2^k到n即可转化为1到n-2^k从i到j的时间可表示成从1到i的时间和从1到j的时间的差的绝对值。#include #define LL long longLL d[35];void init(){ d[1]=0; d[2]=0; fo

2013-08-02 13:58:35 738

原创 HDU 4635 - Strongly connected(2013MUTC4-1004)(强连通分量)

这道题在我们队属于我的范畴,最终因为最后一个环节想错了,也没搞出来题解是这么说的:最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是,同时X部中每个点到Y部的每个点都有一条边,假设X部有x个点,Y部有y个点,有x+y=n,同时边数F=x*y+x*(x-1)+y*(y-1),整理得:F=N*N-N-x*

2013-08-01 18:41:14 1087

原创 URAL 1055 - Combinations(快速筛素因子个数)

数据量不超过50000,先筛出50000以内的素数(约5200个),然后在log时间内筛出每个素因子的个数,总复杂度O(nlogn)#include #include #include bool isprime[50010];int prime[5200],p;int ct[5200];int init(){ p=0; memset(isprime,0,sizeo

2013-08-01 10:59:29 1145

原创 HDU 4631 - Sad Love Story(最近点对)

题意:给出A、B、C,按照给出的公式推出每一个点,添加每一个点时,求出相应的最短距离,所有最短距离加和因为是随机点,不可能有边界数据,所以可以爆搞每次找(0,R-1)区间的最近点对(R为上一个最近点对里面编号最大的),然后加上R到N里面所有的距离(相乘即可)这题搞出来的。。。应该不是什么正规解法。。。跑了19015ms。。。还是太水了#include #include #i

2013-08-01 09:52:54 718

原创 URAL 1008 - Image Encoding(bfs坑爹题)

坑爹题,两种输入输出互相交换,裸bfs#include #include typedef struct{ int x; int y;} point;point q[310];int vis[15][15],mat[15][15];int dx[4]= {1,0,-1,0};int dy[4]= {0,1,0,-1};char ans[5]= {"RTLB"}

2013-07-31 21:31:24 895

原创 URAL 1026 - Questions and Answers(计数排序)

整数的范围只有1到5000,所以开个5000的数组,记录一下每个数出现的个数即可复杂度为O(k*5000),效率比较高#include #include #include using namespace std;int a[5050];int main(){ char s[5]; int n,x,k; scanf("%d",&n); memse

2013-07-31 19:28:24 909

原创 URAL 1062 - Triathlon(半平面交)

这个题乍眼一看好像很简单,然后我就认为u、v、w只要有全部比另外一个人小的就不能win,否则就能win,但是这个思路只对了一半不能win的结论是正确的,但是win的结论不止排除这一个条件将这个人与其他人的条件列式如果都win的话,则满足 x/v+y/u+(k-x-y)/w(i的)#include #include #include using namespace std;c

2013-07-31 16:27:46 890

原创 SGU 126 - Boxes

非常好的一个题,一开始打算纯暴,结果发现出现了好多循环,后来发现了这个游戏其中的内涵还是以前的逆推思想,终态是(2*x,0),那么上一步一定是(x,x),再上一步是(3/2x,1/2x),再上一步有两种情况(就不一一举出了),再上一步还有两种情况...最终可推得A,B只有满足(A+B)/GCD(A,B)==2^k时才会成立,k即为移动次数#include #include #def

2013-07-30 09:21:18 911

原创 SPOJ 428 - Particular Palindromes(数位类DP)

求长度为L的被m整除的回文串的个数建立状态:d(i,j)表示第i位模m的余数为j的个数d(i,j)=d(i+1,j+k*10^i)(L为奇数且最中间的情况)d(i,j)=d(i+1,j+k*(10^i+10^L-1-i))(其他情况,k从0到9,从一半开始递推)#include #include #define LL long longLL d[25][1050];LL p

2013-07-29 16:55:05 989

原创 SPOJ 416 - Divisibility by 15(贪心)

糟烂的代码啊...  这个题目思路很简单——末位只可能为0和5,所有数字的和肯定被3整除没有0和5的肯定不行否则,把所有数字求和如果被3整除,则从大到小输出如果除3余1,则按以下顺序——删1;删4;删7;删2、5、8中的2个(特别注意如果没有0要保留一个5)如果除3余2,则按以下顺序——删2;删5(特别注意如果没有0要保留);删8;删1、4、7中的2个下面是糟烂的代

2013-07-29 16:33:46 803

原创 UVa 557 - Burger

做了这个题之后我才发现,对数是个极其好的东西一开始我直接用公式暴力的,但是超出了浮点数范围,后来改成对数,但是超时了,我也很纠结,后来发现可以打表,然后打了表就过了#include #include double L[100005];int main(){ int n; double k; L[0]=0; for(double i=1;i<=10

2013-07-29 15:00:08 1405 1

原创 SGU 144 - Meeting(连续概率)

有两个人在x到y时间段约会,先到的先等,等z分钟,求他们约会成功的概率画个图就明白了#include int main(){ double x,y,z; scanf("%lf%lf%lf",&x,&y,&z); double p=1-z/(y-x)/60; printf("%.8lf\n",1-p*p); return 0;}

2013-07-28 20:32:18 754

原创 SGU 162 - Pyramids(四面体体积公式)

任意一个三棱锥或者说四面体,其棱为a,b,c,d,e,f,其中a与d,b与e,c与f互为对边,那么有三棱锥(四面体)的体积公式为

2013-07-28 15:23:27 2233

原创 UVa 11027 - Palindromic Permutation(排列编码)

题意:给出一个串,问你第k个回文排列是什么从最高位开始往下找,从最小的字母开始,算出第i位为这个字母的个数(组合方法),直至这些个数加起来都等于k#include #include #include using namespace std;#define LL long longchar s[50],A[50],ans[50],mid;LL ct[50],x;int n,l;

2013-07-28 11:30:30 767

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除