09 2012 档案
摘要:题目链接和那天网络赛很相似,倒着推,这是二维的情况。注意提交别用G++,真坑啊。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #define eps 1e-9 6 using namespace std; 7 double p[1005][1005]; 8 int main() 9 {10 int n,m,i,j;11 while(scanf("%d%d",&n,&m)!=EOF)12 {
阅读全文
摘要:题目连接多校的题目,和网络赛那个多么的相似啊。。。枚举每个状态 含有奇数的期望-偶数卡的期望,就是最后的结果。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #define eps 1e-9 6 using namespace std; 7 double p[21]; 8 int main() 9 {10 int n,num;11 __int64 i,j;12 double ans,t;13 while(scanf("
阅读全文
摘要:题目链接理解了过程就是个水题,收拾东西回家。 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 #define N 100000 6 double dp[N+1]; 7 int p[N+1]; 8 int main() 9 {10 int i,j,n,m,sv,ev;11 while(scanf("%d%d",&n,&m)!=EOF)12 {13 if(!n&&!m) break;1
阅读全文
摘要:题目链接早就见过这个题,开始以为有公式的,推了几次没推出,后来知道这个题是状态压缩DP。最近开始看状态压缩,本想试着解出来,但是这个比那个牛吃草复杂多了。。。位运算还是不是很熟练,这个题的解题报告有很多方法,最重要的就是状态转移,基本上都是用DFS写的,我看的做法是DISCUSS里的做法。用1表示横放,0表示竖放。然后转移的时候吧上一行的状态取反(~j&((1<<m)-1),然后去DFS就行了,注意是在(~j&((1<<m)-1)这个数字的二进制基础上进行DFS,加入横放或者竖放。结束的状态就是矩阵的所有的元素都是1. 1 #include <io
阅读全文
摘要:题目链接看的这个博客,讲的很好,初学状态压缩,对位运算操作还不是很熟,有很多用法,然后就是这个题,开始想用队列优化一下,存上一层合法情况的下标的,老是RE不知为何。。改成暴力的找,居然0ms就过了,这让我情何以堪啊。。。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <map> 7 #include <queue> 8 #inclu
阅读全文
摘要:题目链接这个我是用记忆化搜索写的。比赛的时候卡死在这里,以为是个简单的二维DP,思维被局限了,以前也没怎么做过区间DP,没做出,不过还是觉得理解了状态状态转移,代码什么的都是很短。dp[x][y][z]的意义是在x-y这一段上,前面已经有z-1个人唱歌了,所取得的最小值,这个DFS的写的有点感觉像是树形DP,递推能力太搓了。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #
阅读全文
摘要:题目链接容斥原理不会,map不会,状态压缩不会。做毛线。。。题目大意:给出1-n,n个数,有两个操作1是询问x-y区间上与p互质的数的和是多少,2是改变x位置上的数为c。自己确实办不了,map这样用第一次见,容斥原来用的这么高端,状态压缩知道,但是这个运用的很神,多亏了宝哥讲解,代码实在是看都看不懂。。。只有1000次的操作,先把x-y没有改变时候的情况下,求出,然后再计算在这个区间上是否有改变,这个用map来记录。然后就是求互质的问题了,这里要用到容斥原理,首先很明显两个数如果互质,则这两个数的质因子没有一个相同,所以只要把p的含有质因子的数在x-y上的和求出来,为了方便求1-y的然后减去1
阅读全文
摘要:题目链接如此裸的题,竟然写了近1个小时,最近做题太少了。签到题都做的这么慢,而且写的代码真心没法看了。。。 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 #define LL __int64 6 LL map[30][30]; 7 int ans,len,o[16]; 8 void dfs(int k,int step) 9 {10 LL x,y;11 int z,i,j;12 if(step == len)13 {14 ...
阅读全文
摘要:转者注:令人纠结的网络赛,实在是纠结,最近刚加上zlq学长,看看学长空间,发现此篇文章,写的不错。。。就在此时学长们又过了一个题。。。—————————————————————————————分割线————————————————————————————————————实际上呢~实际上呢 上了大学 不代表就轻松了实际上呢 不是学精两门课程 就可以一劳永逸了实际上呢 很多课程都很重要 只不过我们没有意识到实际上呢 我们所学的东西形成了一张大网 可惜我们还是没有意识到实际上呢 老师们也是为了我们好 特殊情况他们会特殊对待的实际上呢 人心确实可以像一缕阳光 把人从睡梦中唤醒实际上呢 人心也确实可以像
阅读全文
摘要:归并排序。以后留着复习数据结构用,看了很多个版本,这个版本写的比较好,我改编了一下。 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 #define N 1000000 5 int que[N],p[N];; 6 void Mergesort(int l,int r) 7 { 8 int mid,i,j,t; 9 if(l < r)10 {11 mid = (l+r)/2;12 Mergesort(l,mid);13 Mergesort(...
阅读全文
摘要:题目链接用DFS就可以过,判重的时候用map去重的,因为每一条边是最大是10000,用150000进制的3位数就可以表示出现的状态。数据水了。。。我的代码用的是15000进制就A了。。。卡线过的1300+ms 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <cstdlib> 6 #include <map> 7 using namespace std; 8 int ans,p[16],
阅读全文
摘要:题目链接在知道算法的情况下,写了矩阵的算法去找循环节,跑了10来分钟没出结果。。。真心2B啊。。。好好理解这种利用循环节的优化。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <cstdlib> 6 using namespace std; 7 #define LL __int64 8 int len1 = 222222224,len2 = 183120; 9 LL p[3][3],mat[3][
阅读全文
摘要:题目链接开始居然错以为是Fib,其实是Trib,对矩阵加深了一下认识,F(n) = F(n-1)+F(n-2)+F(n-3) 初始矩阵变为3阶了。幂模依旧很搓,搜很多个版本,基本上都是运算符重载的,还有调用数组名的,当然也有直接运算的,凑合着用吧。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <cstdlib> 6 using namespace std; 7 #define MOD 10000
阅读全文
摘要:题目链接不是很了解,线代的行列式和矩阵乘法,忘的差不多了。。。这个矩阵的n-1次方的左上角那个数就是菲薄那切数列的第n项。快速幂矩阵,和快速幂模差不多,把数相乘换成矩阵相乘了。渣代码请无视,改天整理一个模版版本。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 #define MOD 10000 7 #define LL __int64 8 int mat[3][3],p[3][3]
阅读全文
摘要:暑假里看到大神的一篇文章,在一个大公司里面试,面试冒泡排序链表版,当时想了写一下,不知该如何写起,就放下了,最近数据结构又重新学习链表,试着写了下,对链表的操作熟练运用吧。调的我很纠结啊。。。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 using namespace std; 6 struct node 7 { 8 int data; 9 struct node *next;10 }List;11 struct nod
阅读全文
摘要:题目链接网络赛啊。。。知道了算法还错了N次,托了N天,开始的代码+上一句话就AC了,TLE,我以为二分写搓了呢。。。 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <cstdlib> 6 #define ll __int64 7 ll f(int x,int z) 8 { 9 int i;10 ll ans = 1;11 for(i = 1;i <= z;i ++)12 {13 ans *=
阅读全文
摘要:题目链接题意:给一个n,问1-n多少个含有49的数字。算是第一个数位DP吧,感觉数位DP只是通过数字之间的关系,写出状态转移方程的,看了别人的状态的转移,我以为我就可以做出来的,谁知,最后计算貌似比状态转移还难理解,至今不太明白为何要先+1,再计算,猜测可能是计算的时候只能计算1 - x-1的合法数字。我所理解的计算的过程:如67995,先算出60000以内的再计算到67000之间的再计算67900再到67990,最后67995.PS:为什么要+1呢,以下是我的猜测,试一下数据可以发现如果这个数里面没有存在‘49’,或者最后两位不是48,那么+1根本没有影响,这两种情况会导致最后的结果也会+1
阅读全文
摘要:题目链接以前做过的题,比赛的时候没过,前后都一样的时候要特殊考虑一下,没什么印象了,就记得比赛完,又做的时候用qsort超时了,不会用sort,今天补上吧。代码写的很渣。。。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 #define N 10000000 7 struct nn 8 { 9 int d;10 int a;11 } p[200001];12 int cmp
阅读全文
摘要:题目链接刷一下存在感。。。多校的题目,其实以前也知道哈希的的用法,一直不知道如何实现,今天咨询了一下宝哥,然后讲解了一下他的代码,有点像是邻接中的挂链的形式。这个哈希 是运用对一个素数取模的办法,注意一下要先枚举两个数建立哈希,如果3个数,会超内存,效率目测也不好。静态的比动态申请内存稍快,这个题,建哈希不是最主要的矛盾。。。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #define M 177777 6 #defin
阅读全文
摘要:题目链接今天郁闷啊,网络赛在打酱油,就一个题可以贪心可以搞,暴搜一下,TLE,贪心一下WA,直接没心情再去做了,虽然题目描述也有点问题,但是主要还是自己没有状态啊。。。日子还是要继续,明天继续加油!这个题目上午做的,同样也是很郁闷。。。题目思路:很明显的polya,每隔一个置换的种数是m^gcd(i,n),所以要用到欧拉函数和快速幂模,本来这样准备开始写的,想了想还需要除以n,除法取模啊,找各种资料啊,找到几个关于分数取模的资料,先学习一下。。。然后发现需要扩展欧几里得。。。用扩展欧几里得求逆元,逆元貌似离散里学过(忘了),然后把这个除法就变成乘法了,a*n+b*M = 1扩展欧几里得求出a,
阅读全文
摘要:题目链接基本上跟上个题一模一样。居然因为INT64 CE了两次,哭死。。。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <cmath> 7 #include <map> 8 #define ll long long 9 using namespace std;10 ll euler(ll n)11 {12 ll i,m = (l
阅读全文
摘要:题目链接前传:本来之前在高中的一个OJ上看见的,SDOI上的一个题,看着很“数论”,想了想,没想法。。。看了看DISCUSS,说是POJ上的原题,然后看了一下DISCUSS说是欧拉函数,不会。。。然后就放下,最近遇见了很多这样类似的问题,所以先把这个裸题给过了。。。查了一下,有结论。。。∑gcd(i, n) = sum(i*euler(n/i));为啥会这样呢?我自己手算了一下10的情况,规律还是挺明显的,1-n中可以整除i的个数是n/i,这些数与n的最大公约数为i的时候,不就相当于这些都数除以i,然后寻找互质的数,所以i*euler(n/i)就是1-n中公约数是i的总和。欧拉函数用的是模版,
阅读全文
摘要:题目链接水DP。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define INF -2139062144 5 int p[25][25],dp[26][26]; 6 int max(int a,int b) 7 { 8 return a > b? a:b; 9 }10 int main()11 {12 int i,j,k,n;13 scanf("%d",&n);14 for(i = 1;i <= n;i ++)15 {16 f
阅读全文
摘要:题目链接题目还是挺裸的Polya的,但是有一个置换推错了。。。。悲剧啊,一直WA,Java也不熟悉,看着czyuan的文章快速入门。。。180度的时候想错了,其实是c^(n*n+1)/2种,想成和从中间翻一样呢。哎,java写的太搓了。。。开始的时候都没看见翻转。。。 1 import java.io.*; 2 import java.math.*; 3 import java.text.*; 4 import java.util.*; 5 public class Main 6 { 7 public static void main(String[] args) 8 { ...
阅读全文
摘要:题目链接数字三角形的加强版,寻找到顶部对100取模最大的,想一想如果枚举的话2^24复杂度肯定会挂,转念一想,肯定都是小于100的数,100个数枚举一下就好。。。开始写了一个不靠谱的程序居然过了9组,也太假了,那个程序只会输出99,后9组数据全是99。。。改了改错,水过了。。。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 int p[25][25],dp[26][26][101]; 5 int main() 6 { 7 int i,j,k,n; 8 scanf(&quo
阅读全文
摘要:第一个Java程序。。。神似去年打hello world的时候,虽然不知道敲的是啥,但是成功迈出第一步了。 1 package main; 2 3 /** 4 * 5 * @author cuizhe 6 */ 7 public class Main { 8 9 /**10 * @param args the command line arguments11 */12 public static void main(String[] args) {13 System.out.println("Hello,Java!");14 ...
阅读全文
摘要:题目链接和Vijos上的选课一模一样。。无奈效率700+,怎么这么慢啊。。。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 struct node 5 { 6 int left,right; 7 }tree[301]; 8 int p[301],dp[301][301]; 9 int max(int a,int b)10 {11 return a > b? a:b;12 }13 void insert(int son,int father)14 {15 int t;
阅读全文
摘要:题目链接和多校上的黄金矿工很类似,貌似这个还简单点,每个主件,最多有2个附件,讨论下就可以,当然也神似树形DP。自己做的时候SB了,边输入边处理了,想当然了,果断悲剧了,交了N次之后,发现把背包分组的会错误,最可恨的是不知道该怎么搞了,想快排的,结构体神马的,发现从0开始,后来写的会很麻烦。。受不了了,把以前的代码改改,先把根找到,然后枚举他的孩子。。。虽然效率低点,终于DEBUG好几个小时后,终于乱搞过了。。。代码能力弱爆了,不会乱搞啊。。。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdli
阅读全文
摘要:题目链接从早上就开始写,开始一直徘徊在递归的死循环,递归部分竟然不知如何实现了,后来写了个很暴力方法。。。建树还是左孩子,右兄弟,这个题这样写反而不怎么方便(效率也低了?),在 所有儿子的和 和本身+孙子的和 取大,递归部分写的很麻烦,导致先是WA在第7组(看DISUSS知道了数据),某一个小地方敲错了,然后又挂在13组上了,又改了一个BUG,然后还是WA,原来是要注意负数情况。。。纠结不知道怎么改,乱搞了一下,改初始化 + 和0比较,终于过了。。。建树建的不好,导致写的很麻烦,效率也很搓。 1 #include <stdio.h> 2 #include <string.h&
阅读全文
摘要:题目链接参考题解做的,如果不是在树上,应该就是个普通的二维DP,前i门课选j门取得最大的分数,可是这个题每门课可能有先修课,所以建树,在树上进行递归。在和虎哥讨论了一下,如何建树,由于不是二叉树,所以每门课可能有多个孩子,本来想用邻接表的,但是好像很麻烦,递归起来不知怎么办,还有另一种方式就是左儿子右兄弟的方式,以前没用过,搜了下题解,这样建树状态转移就简单了,就和在URAL做的那个二叉树的树形DP差不多了。开始的时候也有另一种想法,先把各个点都给重新离散编上号,然后就可以转换为递推的形式了,不知是否可行。这个还是用静态的做法做的。。。第一这样建树,学习了。。。 1 #include <
阅读全文
摘要:题目链接裸二维DP。数据量比较小,0ms水过。。 1 #include <stdio.h> 2 #include <string.h> 3 int dp[1001][101],p[1001]; 4 int main() 5 { 6 int i,j,n,t,a,b,k,u,max; 7 scanf("%d",&t); 8 while(t--) 9 {10 memset(dp,128,sizeof(dp));11 scanf("%d%d%d%d",&n,&a,&b,&k);12 for(i =
阅读全文
摘要:题目链接和HDU 2993一样,两个题都很纠结啊。这个题调了好几天。。。终于在多次WA终于AC了。各种错误,判断条件写错,dp数组的初始值。HDU那个题还要手写读入,890ms水过了。这个题放到图上很直观了,网上有各种解释。。。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define N 500001 5 __int64 dp[N],que[N],p[N],sum[N]; 6 int i,m; 7 double slope(int x,int y) 8 { 9 re
阅读全文
摘要:题目链接算是斜率优化的经典题吧,公式好像挺好就能推出来,特别注意要long long,写写 居然还超时,托了一段时间,看了AC大神的题解,发现中间处理写搓了,计算的时候要记忆化,各种细节要注意,各种WA和TLE终于完成这个渣代码。。。还可以把求解时候再优化一下,这样1800+水过了。。。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define N 1000001 5 #define eps 1e-9 6 long long p[N],que[N]; 7 long l
阅读全文