12 2013 档案
摘要:这是一个非常神奇的题;感觉像一个模拟搜索;但是竟然可以用网络流来解决;直接粘题解把: 如果不能走通的话,必然说明能够从右上角(图外面)沿雷“跳” ,一直可以“跳”左下角(图外面) ,因此建好图之后求一个最小割就可以得到结果了。但是关键在于:1.哪些雷之间可以相互“跳” ?2.哪些雷可以从右上角“跳”过去,哪些雷可以“跳”到左下角? 第二个问题很好办,如果地雷的范围能接触到最上或者最右的格子,就可以从右上角跳到这个雷上,如果地雷的范围能接触到最下或者最右的格子,就可以跳到左下角。 第一个问题需要分类讨论一下,如果两个雷在同一水平线或者竖直线上,当两个雷的距离不超过 2*K+1 时可以认为两...
阅读全文
摘要:这个题是计算不同子序列的和;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; ...
阅读全文
摘要:这个题我想到要用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){ ...
阅读全文
摘要:因为每个元素都是移动到比它小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 &
阅读全文
摘要:这是一个动态规划的题;当初想到要用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[]已经在前面算出来了。.
阅读全文
摘要:这个题目其实很简单,可惜当时比赛的时候看到出的人少,以为有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 ...
阅读全文
摘要:用set写真是轻松愉快;#include#include#include#includeusing namespace std;setst;int ans;int main(){ int n,x; st.insert(-99999999); st.insert(99999999); scanf("%d",&n); for(int i=0; i0) { ans+=y; st.insert(x); } } } printf("%d\n",a...
阅读全文
摘要:很直观的一个gauss题;用的是以前用过的一个模板;#include#include#include#include#define maxn 12#define eps 0.00001using namespace std;double matrix[15][15];double ans[15];void exchange_col(int p1,int p2,int n){ double t; int i; for(int i=0; ifabs(matrix[p][i])) p=j; if(p!=i) exch...
阅读全文
摘要:先对a排序,a相等的话就对b排序;维护一个栈,每次取栈的头两个,和当前的直线相比较;如果当前的直线把头第一个屏蔽,就将他出栈,一直到不能屏蔽为止;代码:#include#include#include#define maxn 500005using namespace std;int st[maxn],top;int num[maxn];struct line{ int a,b; int id; bool operatort.b; else return a1) { if(check(i,st[top-1],st[top-2]...
阅读全文
摘要:图上的最小的染色方案;学习了陈丹绮的论文: MCS算法#include#define maxn 10005#define maxm 2000005using namespace std;int head[maxn],next[maxm],edge[maxm];int cnt;int d[maxn],f[maxn];void add(int a,int b){ edge[++cnt]=b; next[cnt]=head[a]; head[a]=cnt;}int main(){ int n,m,x,y; scanf("%d%d",&n,&m); while(m-
阅读全文
摘要:spfa+dp;刚刚开始一直想不通怎么判断他是否换了道;后来才知道,将那个时间段打包,找出这段时间内的最短路;真是太奇妙了!#include#include#include#include#define inf 1e6using namespace std;int map[22][22];int pass[22][105];int d[22],inq[22];int n,m,k,e;int dp[22];int spfa(int s,int t){ queueq; for(int i=1; id[u]+map[u][i])) { ...
阅读全文
摘要:单点更新,区间求最大值的题;可以使用树状数组和线段树;#include#include#include#define maxn 2000009#define ll long longusing namespace std;int m,n=0;ll ma[maxn],d[maxn];void insert(int w,ll x){ d[w]=x; while(w=l) { ret=max(ret,ma[r]); r-=r&-r; } else r--; } return ret;}cha...
阅读全文
摘要:n个人,m种信仰;问你相邻的人信仰不同的情况有多少种?首先第一个人有m种选择,第二个人有m-1种选择,后面所有的人都只有m-1种选择;所以结果就是m^n-m*(m-1)^(n-1)#include#include#include#define ll long long#define mod 100003using namespace std;ll pow_mod(ll n,ll p){ ll ans=1; while(p) { if(p&1) ans=ans*n%mod; n=n*n%mod; p>>=1; } retur...
阅读全文
摘要:斜率优化dp;推荐学习http://www.cnblogs.com/perseawe/archive/2012/05/12/bz1010.html看着别人的题解自己学着推,终于理解了#include#include#include#define ll long long#define maxn 50005using namespace std;int q[maxn],head=0,tail=0;ll f[maxn];ll g[maxn],s[maxn];ll dp[maxn];ll get_g(int k,int j,int c){ return dp[k]+(f[k]+c)*(f[k]...
阅读全文
摘要:刚刚看到题,感觉是最小割最大流;但是数据量很大,看看网上的题解,发现要把它变成最短路来做;每个孔作为一个点,孔之间的边作为点之间的边;然后利用spfa就可以了!不过这个题runtime error了我15发;经大师提醒才知道,在main函数里面不能够开大数组;因为main函数中的变量保存在栈中;代码:#include#include#include#define inf 1e8using namespace std;const int maxn=2*1005*1005;const int maxm=3*maxn;struct edge{ int from,to,dist; edge...
阅读全文

浙公网安备 33010602011771号