摘要: 这是一个非常神奇的题;感觉像一个模拟搜索;但是竟然可以用网络流来解决;直接粘题解把: 如果不能走通的话,必然说明能够从右上角(图外面)沿雷“跳” ,一直可以“跳”左下角(图外面) ,因此建好图之后求一个最小割就可以得到结果了。但是关键在于:1.哪些雷之间可以相互“跳” ?2.哪些雷可以从右上角“跳”过去,哪些雷可以“跳”到左下角? 第二个问题很好办,如果地雷的范围能接触到最上或者最右的格子,就可以从右上角跳到这个雷上,如果地雷的范围能接触到最下或者最右的格子,就可以跳到左下角。 第一个问题需要分类讨论一下,如果两个雷在同一水平线或者竖直线上,当两个雷的距离不超过 2*K+1 时可以认为两... 阅读全文
posted @ 2013-12-11 22:50 Yours1103 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 这个题是计算不同子序列的和;spoj上的那个同名的题是计算不同子序列的个数;其实都差不多;计算不同子序列的个数使用dp的思想;从头往后扫一遍如果当前的元素在以前没有出现过,那么dp[i]=dp[i-1]*2+1;不然找到最右边的这个元素出现的位置j;dp[i]=d[i]*2-dp[j];spoj代码:#include#include#include#define mod 1000000007using namespace std;char s[100005];int pos[100005];int biao[30];int dp[100005];int main(){ int t,n; ... 阅读全文
posted @ 2013-12-11 22:47 Yours1103 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 这个题我想到要用kmp找到循环节;但是后面的我就不会做了;看到题解才知道是字符串的最小表示;#include#include#include#define maxn 100005using namespace std; char s[maxn*2];int next[maxn]; void kmp(int n){ int j=0; for(int i=2;i0&&s[i]!=s[j+1])j=next[j]; if(s[i]==s[j+1])++j; next[i]=j; }} void MinimumRepresentation(int n){ ... 阅读全文
posted @ 2013-12-11 22:41 Yours1103 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 因为每个元素都是移动到比它小1位的元素的后面;这样的话以后的一定就可以把他们两个打包;所以用这种方法最多扫一遍就可以了;但是最小的那个数要不要移动呢?如果最小的数后面的数都是升序的,那么一直扫到最小的那个数就行了;不然的话要完整的扫一遍;这个地方我没想清楚,WA的好惨,最后还是看到斌哥的代码才恍然大悟的;#include#include#define maxn 100005using namespace std;int n,t,m;int num[maxn],f[maxn],r[maxn],cnt[maxn]; bool cmp(const int &x,const int & 阅读全文
posted @ 2013-12-11 22:38 Yours1103 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 这是一个动态规划的题;当初想到要用dp,但是一直想不到状态转移的方程;题解上的原话: 动态规划,设 g[i]表示总结点数为 i 的方案种数,另设 f[i][j]表示各个孩子的总结点数为i,孩子的个数为 j 的方案数,那么有 g[i+1]=f[i][1]+f[i][2]+...+f[i][k],相当于添加一个根节点之后变成完整的树,同时要把有 1 个孩子,2个孩子, ……,k 个孩子的情况都考虑进去。对于 f[i][j]的求解可以用类似背包的方法去做,在求解的时候也会用到 g[1], g[2], ..., g[i]的值,根据前面的那个 g[i+1]的表达式来看,这些 g[]已经在前面算出来了。. 阅读全文
posted @ 2013-12-11 22:32 Yours1103 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 这个题目其实很简单,可惜当时比赛的时候看到出的人少,以为有trick,就和队友扯淡去了;因为每个数总是被相邻的数影响,所以往前往后扫两遍就行了; 1 #include 2 #include 3 #include 4 #define maxn 100005 5 using namespace std; 6 7 int num[maxn]; 8 int num1[maxn]; 9 int num2[maxn];10 11 int main()12 {13 int t;14 int n,d;15 scanf("%d",&t);16 while(t--)17 ... 阅读全文
posted @ 2013-12-11 22:30 Yours1103 阅读(179) 评论(0) 推荐(1) 编辑