02 2012 档案

摘要:View Code 1 /* 2 推出:f[n]=2*f[n-1]+1; 3 f[1]=1; 4 可得:f[n]=2^n-1; 5 */ 6 #include<iostream> 7 #include<cstdio> 8 using namespace std; 9 10 const int x=1000000;11 void gao(int n)12 {13 long long s=1,t=2;//注意范围 14 for(;n;n>>=1,t=(t%x)*(t%x),t%=x)15 if(n&1)16 {17 s%=x;18 ... 阅读全文
posted @ 2012-02-21 12:56 知行执行 阅读(144) 评论(0) 推荐(0)
摘要:View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 priority_queue <int ,vector<int>,greater<int> > q; 6 int main() 7 { 8 int t,n,x,y,sum; 9 int i;10 scanf("%d",&t);11 while(t--)12 {13 while(!q.empty())q.pop() 阅读全文
posted @ 2012-02-18 08:34 知行执行 阅读(256) 评论(0) 推荐(0)
摘要:高次方求模:比如a的b次方对c求模我们可以把b 化为二进制形式看那一位有1比如b=10101则 a^b=a^(10000)*a^(100)*a^(1)以函数形式体现:long long a,b,c;void han(){ long long t,s; for(t=a,s=1;b;b>>=1,t*=t,t%=c)//用b>>=1查看b中1 if(b&1){s*=t;s%=c;} printf("%lld\n",s%c); } 阅读全文
posted @ 2012-02-18 07:47 知行执行 阅读(777) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 高次方求模: 3 比如a 的 b次方 对c 求模: 4 比如:2^10次方,对3求模 5 10的二进制是1010相当于2^10=2^8*2^2 6 我们看对应的二进制位是否为1,若为1则乘上2^i次方 7 若为0则不乘(注意一个规律:第i位2^i=(2^i-1)*(2^i-1)) 8 */ 9 #include<iostream>10 #include<cstdio>11 using namespace std;12 13 long long a,b,c;14 void han()15 {16 long long t,s;17 for( 阅读全文
posted @ 2012-02-18 07:40 知行执行 阅读(172) 评论(0) 推荐(0)
摘要:View Code 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int a[3400000]={0}; 6 int main() 7 { 8 int m,n,i,t; 9 scanf("%d%d",&m,&n);10 for(i=0;i<m;++i)11 {12 scanf("%d",&t);13 a[t/32] |=(1<<(t%32));//一个int 表示32位 14 } //商相同,余数不同, 阅读全文
posted @ 2012-02-17 20:52 知行执行 阅读(155) 评论(0) 推荐(0)
摘要:View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 7 struct node 8 { 9 int x,y; 10 }pace[1000]; 11 queue <node> q; 12 bool flag[21][21];//标记各个点是否走过 13 char map[21][100];//迷宫 14 int num[6];//各个门的总钥匙数 15 int ha 阅读全文
posted @ 2012-02-17 19:46 知行执行 阅读(473) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 思路(借鉴): 3 n!阶乘能分解出几个5,就有几个0 4 因为5与偶数相乘的一个零,偶数是充足的 5 6 */ 7 #include<iostream> 8 using namespace std; 9 int a[10000001];10 int main()11 {12 int i,n,m;13 for(i=1;i<10000001;++i)14 {15 if(i<5){a[i]=0;continue;}16 int k=i/5;// i先分解出一个5,他的商还能分解几个 17 a[i]=k... 阅读全文
posted @ 2012-02-17 13:50 知行执行 阅读(191) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 观察题目可以发现: 3 划分一个整数 如:n 4 分别是以 n开头,以n-1开头...,以1开头等 5 相当于最大的是开头的那个 其余的数不能超过这个数 6 7 */ 8 9 #include<iostream>10 using namespace std;11 int query(int n,int x)12 {13 if(x<1||n<1)return 0;14 if(x==1||n==1)return 1;15 if(n<x)return query(n,n);//对于n<x说明整数是n 最大也是以n开头 16 if( 阅读全文
posted @ 2012-02-17 11:38 知行执行 阅读(208) 评论(0) 推荐(0)
摘要:View Code 1 2 /* 3 思路: 4 比如:n=100,m=5 5 100是有20个5组成的 6 因此100减去一个5是95 ,减去两个是90 7 ...减去19个是0. 8 则是5 倍数的数有二十个(不是m的倍数的不能分解出m) 9 ,从这二十个10 数中各分解出一个5则有20个511 这二十个数变为12 20,19,18,...,1即 20的阶乘13 相当于转移到求20的阶乘能分解多少个m了14 依次类推! 15 */16 #include<iostream>17 using namespace std;18 int main()19 {20 int t,n,m;2 阅读全文
posted @ 2012-02-16 08:58 知行执行 阅读(118) 评论(0) 推荐(0)
摘要:View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 struct node 7 { 8 int v; 9 node *next;10 }point[1000001];11 node *table[1000000];12 13 int a[101];14 int k;15 16 int hash(int x)17 {18 return (x%1000000);19 }20 21 void add()22 {23 int 阅读全文
posted @ 2012-02-14 09:24 知行执行 阅读(162) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 问题: 3 给你一些有向边 组成一个有向图 4 问这个图是不是一颗树 5 思路: 6 组成树的条件: 7 1.图按无向图计算 是连通的(并查集判断) 8 2.有且仅有一个顶点的入度为零(根节点) 9 3.除根节点外的其余顶点入度必须都为1 10 */ 11 #include<iostream> 12 #include<cstring> 13 using namespace std; 14 15 bool flag[10010];//标记 16 int rd[10010];//记录每个点的入度 17 18 int rank[1001... 阅读全文
posted @ 2012-02-13 10:51 知行执行 阅读(158) 评论(0) 推荐(0)
摘要:树状数组:(插点法插线法)最常见的一种用途是求一个数列的前N项和比如说数组a[] 吧:把他转化一下存入树状数组c[] 中如:c[1]=a[1]c[2]=a[1]+a[2]c[3]=a[3]c[4]=a[1]+a[2]+a[3]+a[4]......................................................c[16]=a[1]+a[2]+....................+a[16]也即c[n]管理着2^k个数 (k代表二进制n最后连续有多少个0) c[n]为这个连续2^k个数的最后一个因此有 c[n]=a[n-2^k+1]+.....+a[n];则: 阅读全文
posted @ 2012-02-12 13:04 知行执行 阅读(239) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 问题: 3 在一个数组中 不断在某些区间中增加值 4 询问 某一节点 的值 5 思路: 6 树状数组(插线法): 7 */ 8 #include<iostream> 9 #include<cstdio>10 using namespace std;11 12 int lt[1000001];13 int T,N;14 15 int lowbit(int x)16 {17 return x&(-x);18 }19 void add(int s,int v)20 {21 while(s>0)22 {23 lt[s]+=v;24 阅读全文
posted @ 2012-02-12 11:28 知行执行 阅读(231) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 trie树: 3 利用trie树 查找单词 的简单程序 4 */ 5 //法一:自己的方法 6 #include<iostream> 7 #include<cstdio> 8 using namespace std; 9 10 struct trie11 {12 bool is;//标记是否是个单词 13 trie *next[11];// 分别代表14 void (*init)(trie *);// 为了初始化is=0,next=NULL 15 }node[100000];16 17 trie *root;18 bool f;19 . 阅读全文
posted @ 2012-02-11 20:21 知行执行 阅读(153) 评论(0) 推荐(0)
摘要:文章作者:yx_th000 文章来源:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 转载请注明,谢谢合作。关键词:trie trie树 数据结构前几天学习了并查集和trie树,这里总结一下trie。 本文讨论一棵最简单的trie树,基于英文26个字母组成的字符串,讨论插入字符串、判断前缀是否存在、查找字符串等基本操作;至于trie树的删除单个节点实在是少见,故在此不做详解。l Trie原理Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。l Trie性质好多人说trie的根节点不包含任何字符信 阅读全文
posted @ 2012-02-11 17:44 知行执行 阅读(180) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 问题:给出一些两端染有颜色木棒, 3 把这些木棒以相同的颜色对接 4 是否能形成一条直线 5 思路: 6 1.输入 以文件结束 7 2.利用字符串hash ,在hash表中存放的 8 是这是第几个端点,也能表明在这位置的端点 9 是否出现过10 3.并查集判断连通性11 4.看是否存在欧拉路 12 13 呵呵,没想到数组开这么大,用了hash记录点 竟然一次过了,欣喜,加油!!! 14 */15 #include<iostream>16 #include<cstdio>1... 阅读全文
posted @ 2012-02-10 23:24 知行执行 阅读(211) 评论(0) 推荐(0)
摘要:View Code 1 /*参考 DP 中的 15题*/ 2 #include<iostream> 3 #include<cstring> 4 #define min(x,y) x<y?x:y 5 using namespace std; 6 int num[110][110]; 7 char ch[110]; 8 int comp(int i,int j) 9 {10 if(ch[i]=='('&&ch[j]==')')return 1;11 if(ch[i]=='['&&ch[j] 阅读全文
posted @ 2012-02-10 18:05 知行执行 阅读(222) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 问题:输入一组括号 看需要最少添加几个括号才能使 3 这组括号匹配 4 思路:DP 5 dp[j][i]表示从第j个字符到第i个字符这个括号串最少需要添加几个能使 6 这个子串匹配 7 则有 8 1.如果从j 到 i-1没有能与i匹配的则有 9 dp[j][i]=dp[j][i-1]+1;10 2.若从j 到i-1有与i匹配的(假如为第k个)则有11 dp[j][i]=dp[j][k-1]+dp[k+1][i-1];(可能有多个与i都匹配 取最小的) 12 */ 13 #include<ios... 阅读全文
posted @ 2012-02-10 17:26 知行执行 阅读(288) 评论(0) 推荐(0)
摘要:1.最小生成树---普里姆 或 kruskal 算法2.一笔画问题(一个图走过所有边且不重复)---欧拉路 或 欧拉回路3.图的连通性问题---并查集 阅读全文
posted @ 2012-02-10 16:38 知行执行 阅读(151) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 问题描述:给定一个图求最小生成树 3 思路: K r u s k a l算法每次选择n- 1条边, 4 所使用的贪婪准则是: 5 从剩下的边中选择一条不会产生环路的具有 6 最小耗费的边加入已选择的边的集合中。 7 注意到所选取的边若产生环路则不可能形成一棵生成树。 8 K r u s k a l算法分e 步,其中e 是网络中边的数目。 9 按耗费递增的顺序来考虑这e 条边,每次考虑一条边。 10 当考虑某条边时,若将其加入到已选边的集合中会出现环路, 11 则将其抛弃,否则,将它选入。 12 利用并查集的求法判断是否会构成回路:若他们根节... 阅读全文
posted @ 2012-02-10 16:26 知行执行 阅读(272) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 问题:按字典序全排列 3 法一:分别以数字i开头 利用递归深搜 4 */ 5 #include<iostream> 6 using namespace std; 7 bool flag[10]; 8 int n,m; 9 void digui(int h,int b[],int x)10 {11 int i;12 if(x==m)13 {14 for(i=0;i<m;++i)15 cout<<b[i];16 cout<<endl;17 return ;18 }19 for(i=1;i<... 阅读全文
posted @ 2012-02-09 20:16 知行执行 阅读(228) 评论(0) 推荐(1)
摘要:View Code 1 /* 2 题意: 3 共有N个,一次最多取M 个 4 思路: 5 这是一道技巧性的题,考察从题中找规律! 6 假设有a ,b两个人 a 先取 看是否能赢: 7 若a能赢则最后一次是a取,且一定是取了M个 8 而倒数第二次是b取,且一定是取1个, 9 因此倒着看就是一个状态转移了总数为N个,总数为N-(M+1),N-2*(M+1).....10 情况下a先取,能赢得问题了 11 */12 #include<iostream>13 using namespace std;14 int n,m;15 int main()16 {17 int t;18 cin> 阅读全文
posted @ 2012-02-09 19:20 知行执行 阅读(152) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 思路: 3 把这个无向图看成有向图 4 相当于无向图 的边走两边,同一条边走的方向不同 5 相当于求 有向图的 欧拉回路 6 */ 7 #include<iostream> 8 #include<cstring> 9 using namespace std;10 struct node 11 {12 int b;13 bool flag;14 node *next;15 }E[100010];16 node table[10010];17 int n,m;18 void clur(int x)19 {20 node *p=tab... 阅读全文
posted @ 2012-02-09 15:55 知行执行 阅读(194) 评论(0) 推荐(0)