08 2013 档案

摘要:比赛地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30596#overview解题报告:(来自杭电ACM微博)1001注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序列的个数,有递推关系:dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]如果i和j位置出现的字符相同,那么dp[i][j]可以由dp[i+1][j-1]中的子序列加上这两个字符构成回文子序列,也就是dp[i][j]+=dp[i+1][j-1],注意 阅读全文
posted @ 2013-08-31 22:48 814jingqi 阅读(125) 评论(0) 推荐(0) 编辑
摘要:iSea WHU http://hi.baidu.com/iseasoulTwilightgod CUSThttp://blog.csdn.net/twilightgodAekdycoin FZUhttp://hi.baidu.com/aekdycoinForeverlin HNUhttp://hi.baidu.com/forverlin1204/blogMatrix67 PKUhttp://www.matrix67.com/blog/watashi ZJUhttp://watashi.ws/blog/tag/zoj/Sha崽 HDUhttp://www.notonlysuccess.comC 阅读全文
posted @ 2013-08-28 23:15 814jingqi 阅读(121) 评论(0) 推荐(0) 编辑
摘要:题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2330题目思路: 首先是乘法原理加法原理计数,对a [i]当做裁判的情况,记c[i] d[i] 分别表示前面和后面小于它的数的个数,ai当裁判方法数就是c[i]*(n-i-1-d[i])+d[i]*(i-c[i])了然后如果直接暴力统计ci di ,复杂度O(N*N) TLE; 本题的一个限制是a【i】两两不同, 那么他们可以作为下标,维护一个数组(实际写 阅读全文
posted @ 2013-08-27 21:20 814jingqi 阅读(115) 评论(0) 推荐(0) 编辑
摘要:题目地址:http://poj.org/problem?id=2689题目思路: 找出int 内所有素数空间上时不允许的,但是题目要求l ,u的差不超过100w ,在空间上还是允许的。然后先找出5w以内的素数,这样的可以中这些素数作为合数最小的素因子将这个合数筛掉。 几个要注意的地方 【1】 因为l可能很大,j的起点不能去“p*p” 然后比L小就加一个p,想一下如果p=2,l很大会花很多时间的。 【2】 然后就是这个j 要用long long 存 ,因为我们找到的j的初值是p 的倍数中第一个大于等于L的,l很大时可能超long long。 【3】 这个筛法筛去的第一个数是4 所以1要特判 .. 阅读全文
posted @ 2013-08-27 01:03 814jingqi 阅读(142) 评论(0) 推荐(0) 编辑
摘要:题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=499分析思路: 直接计算两两的最大公约数会超时的,我们换个角度看问题,我们找到输入进来的数的所有约数,如果某个数出现了两次或者以上,那么满足条件的最大的就是ggcd了然后就是类似于筛法找约数, 这样可以找到 1~n中,每个数不超过自己平方根的所有约数。 然后比平方根大的那个可以用它除出来(完全平方数要特判了)。然后不是暴力直接从最大的开始找出现过两次的,我们设置一个maxn来记录就好了,每次第二次出现的数和maxn比较一下就可以了。先看代码:#include #include # 阅读全文
posted @ 2013-08-25 03:14 814jingqi 阅读(171) 评论(0) 推荐(0) 编辑
摘要:比赛地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27640#overview结题报告:http://blog.watashi.ws/833/andrew-stankevich-9-solution/先占坑,以后一题题补起来 阅读全文
posted @ 2013-08-25 03:05 814jingqi 阅读(80) 评论(0) 推荐(0) 编辑
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4493一个double 如果就用cout 貌似会用科学技术法;#include using namespace std; int x1(double k) { k*=10; return (int)k%10; } int x2(double k) { k*=100; return (int)k%10; } int x3(double k) { k*=1000; return (int)k%10; } int main() { int T; ... 阅读全文
posted @ 2013-08-24 22:10 814jingqi 阅读(97) 评论(0) 推荐(0) 编辑
摘要:题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4497本题就是整数的标准分解,然后结合一点组合计数, 我们知道每个素数对应指数的最大值和最小值,现在问原始的三个数有多少种。首先做一个优化,将G变为1 ,将L 变为L/G (不整除就不谈了啊~ 无解) 、然后对每一个素数,分三种情况:【1】 指数==0 (不整除,忽略) 【2】 指数==1 那么c【3】【2】+ c【3】【2】 (哪两个是最大的或最小的) 【3】指数>=2 情形2的6种+ 指定大的*指定小的*剩下一个取中间的(n-2)个。 分解10^9这样的数时,我们打了10^ 6以内的素数 阅读全文
posted @ 2013-08-24 21:16 814jingqi 阅读(139) 评论(0) 推荐(0) 编辑
摘要:题目地址http://acm.hdu.edu.cn/showproblem.php?pid=4704首先,这样的方法数就是c【N-1】【K-1】 就是可重复元素的组合数 ,然后求和后是2^N-1 计算mod 100000007 由于模是素数,由费马小定理,只需要计算N-1除以mod 的余数,然后计算余数的时候,据说BigInteger会超时,那就死算吧,把每一位是多少算出来。注意要点: 1 虽然p【i】都是int 范围内的,但是在计算过程中可能溢出。 所以开long long 2 算快速幂时也可能存在类似问题,所以参数都设置成long long#include #includ... 阅读全文
posted @ 2013-08-24 20:54 814jingqi 阅读(167) 评论(0) 推荐(0) 编辑
摘要:题解报告:http://acmicpc.info/archives/1405Oj hdu4493~4499和4597~4599 阅读全文
posted @ 2013-08-24 17:41 814jingqi 阅读(114) 评论(0) 推荐(0) 编辑
摘要:#include#include#include#includeusing namespace std;#define N 100005vector v[N+1];void pre(){ for(int i=2;i<=sqrt(N);i++) for(int j=i*i;j<=N;j+=i) v[j].push_back(i); for(int i=1;i<=N;i++) { v[i].push_back(1); }}int main(){ pre(); for(int i=4;i<100;i++) { fo... 阅读全文
posted @ 2013-08-21 22:41 814jingqi 阅读(170) 评论(0) 推荐(0) 编辑
摘要:题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4030 只要在哪一个状态下是小的那个赢了,游戏就结束。 所以我们考虑最坏的情况,每次都是小的赢,自己变为两倍。想起了之前选拔赛那个两个盒子之间球倒来倒去那个题。当时只要超过1000次就认为进入循环了。 这里计算概率也要分两种情况,进入循环和不进入循环。 不进入循环就会在某一时刻a【k】==b【k】。 意味着会有k+1轮, 对于期望,最后一个不再是(k+1)*0.5^(k+ 阅读全文
posted @ 2013-08-19 01:07 814jingqi 阅读(177) 评论(0) 推荐(0) 编辑
摘要:#include using namespace std; //struct point //{ // // //}; int max(int a,int b) { if(a>b) return a; else return b; } void swap(int &a,int &b) { int temp=a; a=b; b=temp; } int main() { int n; cin>>n; int a,b,c,d; int xa[n],ya[n],xb[n],yb[n]; for(int i=0;i>xa[i]>>ya[i]>.. 阅读全文
posted @ 2013-08-10 00:48 814jingqi 阅读(241) 评论(0) 推荐(0) 编辑
摘要:题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2666这个题的意思有点没说清楚,不知道最频繁指的什么,后来队友指点,直接开一个1440大的数组存每一分钟的状态,然后找出最大的次数,然后第一次出现这样的次数的一段。为了统计,在最后补了一个-1;代码:#include #include #include #include using namespace std; string format(int n) { 阅读全文
posted @ 2013-08-09 21:28 814jingqi 阅读(152) 评论(0) 推荐(0) 编辑
摘要:1 #include 2 #include 3 using namespace std; 4 5 const int maxn=12; 6 7 int vis[maxn]; 8 9 vector G[maxn]; 10 11 12 int dfs_clock; 13 int pre[maxn]; 14 int post[maxn]; 15 int cc[maxn]; 16 int current_cc=0; 17 void dfs(int u) 18 { 19 //pre 20 21 vis[u]=1; 22 pre[u]=++dfs_clock... 阅读全文
posted @ 2013-08-09 00:24 814jingqi 阅读(242) 评论(0) 推荐(0) 编辑
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4662题解: 首先U全部转化为三个I(本质),M又只能在开头。所以就是在乎I的个数问题了。 如果仅仅有扩倍,则I的个数为2^n个,如果中间某次去了K个两个U ,I的个数就为2^n-6*k, 再下次无论是扩倍还是减6,都还是可以表示为2^n-6*k. 所以必要条件找到了,那就是num(I)=2^n-6*k 有整数解,再看充分性,一旦可以表示为这种形式,我们就扩倍n次,然后做k次去两个U的操作,充分性得证。 考虑这个不定方程。 首先2^k mod6 是周期数列1,2,4,2,4....所以必要条件是I= 阅读全文
posted @ 2013-08-09 00:15 814jingqi 阅读(160) 评论(0) 推荐(0) 编辑
摘要:题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2662思想: 1 先把每个概率乘起来,然后乘以可充排列的种数。 2 先一开始用(n1+n2+n3+...+nk)! / (n1! *n2! * n3!*...*nk!) 来算,sb了 因为用BigInteger太慢了~ 这个数是可以很大很大的, 50!呀。但是这个数可以拆成组合数的乘积: c[n1+n2+..+nk][n1] *c[n2+n3+..nk][ 阅读全文
posted @ 2013-08-07 00:58 814jingqi 阅读(130) 评论(0) 推荐(0) 编辑
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1861 一个研究生入学考试上机题==b思路: 将信息放在结构体里,然后存在向量中, 最后扫描到n==0就统计,输出,清空向量。 需要注意的是 1 同一艘船可能出租两次,于是扫描到op=='E' 时,就要立马处理。 2 扫描到op=='E' 时 ,还要看是否有S的记录,如果没有找到就不处理 3 从00:00 -> 00:00 算是借了一分钟~ 而不是差值0分钟 4 字符串和整数之间转化 用stringstream ,#includ... 阅读全文
posted @ 2013-08-05 01:20 814jingqi 阅读(109) 评论(0) 推荐(0) 编辑
摘要:题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1733初始化时,需要计算所有的f[0][i] 和 f[i][0] , 状态转方程是 f[i][j]= if (a[i]==b[j] ) f[i-1][j-1]+1 else max(f[i-1][j],f[i][j-1]) 数组开大一点· 【100】【100】 是错了的代码:#include #include using namespace std; int f[1000][1000]; int max(int a,int b) { if(a>b 阅读全文
posted @ 2013-08-05 01:10 814jingqi 阅读(219) 评论(0) 推荐(0) 编辑
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4611题解:显然一个个求和时会以lcm(a,b)为周期,但是一旦a,b公因子比较少,这样也还是会超时的, i++这个跨度太小. 注意到如果mod a的序列在上升,mod b的序列也在上升,则ans+= 的那个值是不变的,这样我们就可以增加跨度了。 考虑从i开始的跨度为jump的序列时,只需要去 a-i%a ,b-i%b的较小值就可以了。 最后注意一下i+jump不可以超过边界,一旦超过,我们把i赋值成很大,这样保证会退出去就可以了#include #include using namespace s 阅读全文
posted @ 2013-08-03 19:21 814jingqi 阅读(160) 评论(0) 推荐(0) 编辑