随笔分类 -  hdu

摘要:一个机智题,可惜比赛的时候没有机智出来#include#include#include#include#define ll long long#define mod 1000000009#define maxn 100009using namespace std;ll c[maxn];void gc... 阅读全文
posted @ 2014-07-22 22:01 Yours1103 阅读(329) 评论(0) 推荐(0)
摘要:有依赖的背包,转化成01背包来做;#include#include#include#includeusing namespace std;int n,m;int f[100009];int dp[100009];int main(){ int num,value,pen,pp; while(scanf("%d%d",&n,&m)!=EOF) { memset(f,0,sizeof f); for(int i=1; i=pen; j--) { dp[j]=max(dp[j],dp[j... 阅读全文
posted @ 2014-04-08 15:37 Yours1103 阅读(142) 评论(0) 推荐(0)
摘要:有依赖的背包,用树形dp解#include#include#include#include#define maxn 205using namespace std;int n,m;int f[maxn][maxn];struct node{ int pre; int cnt_son; int son[maxn]; int value;} no[maxn];void dfs(int x){ f[x][1]=no[x].value; int v; for(int i=0; i1; j--)//从大往小更新,结果不会覆盖; { ... 阅读全文
posted @ 2014-04-08 14:13 Yours1103 阅读(123) 评论(0) 推荐(0)
摘要:背包,输出方案数!#include#include#include#define maxn 505using namespace std;int f[maxn];int cot[maxn];int num[maxn];int main(){ int n,m,t; scanf("%d",&t); while(t--) { int mi=1=num[i]; j--) { if(f[j]==f[j-num[i]]+1) cot[j]+=cot[j-num[i]]; ... 阅读全文
posted @ 2014-04-07 14:23 Yours1103 阅读(165) 评论(0) 推荐(0)
摘要:splay 练手用;杭电的oj要手动开栈;#include#pragma comment(linker, "/STACK:102400000,102400000")#include#include#define inf 999999#define maxn 1500009#define lch(rt) son[rt][0]#define rch(rt) son[rt][1]using namespace std;int son[maxn][2],fa[maxn];int val[maxn],size[maxn],flg[maxn];int cnt,root;int num[ 阅读全文
posted @ 2014-03-14 15:12 Yours1103 阅读(205) 评论(0) 推荐(0)
摘要:splay#include#include#include#include#define maxn 300009#define lch(rt) son[rt][0]#define rch(rt) son[rt][1]using namespace std;int son[maxn][2],fa[maxn],size[maxn],val[maxn],st[maxn];int root,cnt;int num[maxn],flg[maxn];int n,m;void push_up(int rt){ size[rt]=size[lch(rt)]+size[rch(rt)]+1;}void p... 阅读全文
posted @ 2014-03-13 21:53 Yours1103 阅读(162) 评论(0) 推荐(0)
摘要:简单dp#include#define maxn 10005#include#includeusing namespace std;double dp[140][maxn];double t[140][140];int num[maxn];int main(){ int n,m; while(scanf("%d",&m)!=EOF) { m=(m*(m-1)*(m-2)/6); for(int i=0; ima2)ma2=dp[i][j]; } ma1=ma2; } ma1=0... 阅读全文
posted @ 2014-03-13 16:28 Yours1103 阅读(183) 评论(0) 推荐(0)
摘要:斜率dp#include#include#include#include#define maxn 10005#define maxm 5005using namespace std;int dp[maxn][maxm];int q[maxn*10];int num[maxn];bool check(int j,int tail,int i){ int yk=dp[q[tail-1]][j-1]+num[q[tail-1]+1]*num[q[tail-1]+1]; int yj=dp[q[tail]][j-1]+num[q[tail]+1]*num[q[tail]+1]; in... 阅读全文
posted @ 2014-03-12 17:13 Yours1103 阅读(120) 评论(0) 推荐(0)
摘要:Good Serial Inc.比较简单;#include#include#include#define maxn 1000009#define ll long longusing namespace std;const ll mod=987654321;ll f[maxn]; int main(){ ll n,m; f[1]=1; for(ll i=2;imod)f[i]%=mod; } while(scanf("%lld%lld",&n,&m)&&(n+m)>0) { ll ans=1; if(n0) {... 阅读全文
posted @ 2014-03-11 17:33 Yours1103 阅读(175) 评论(0) 推荐(0)
摘要:两种构造的方式都是正确的;1.#include#include#include#define maxn 60#define ll long longusing namespace std;int x;ll M,n;struct matrix{ int len_x; int len_y; ll data[maxn][maxn]; void ini() { len_x=0; len_y=0; memset(data,0,sizeof data); }};matrix mat_big;ll f[maxn][maxn];ma... 阅读全文
posted @ 2014-03-10 22:58 Yours1103 阅读(251) 评论(0) 推荐(0)
摘要:概率dp,有点像背包的做法;dp[i][j]代表前i个数组成的j数的概率为多少#include#include#define maxn 40009using namespace std;double dp[45][maxn];int s;double sco;int main(){ int t,n; scanf("%d",&t); while(t--) { memset(dp,0,sizeof dp); dp[0][0]=1; scanf("%d%lf",&n,&sco); for(int i=0;i=sco) ... 阅读全文
posted @ 2014-02-19 08:27 Yours1103 阅读(186) 评论(0) 推荐(0)
摘要:最长公共上升子序列:O(n*m)的算法; 1 #include 2 #include 3 #define maxn 1000 4 using namespace std; 5 int a[maxn],b[maxn],f[maxn]; 6 int main() 7 { 8 int t,n,m; 9 scanf("%d",&t);10 while(t--)11 {12 memset(f,0,sizeof f);13 int ans=0;14 scanf("%d",&n);15 for(int i=0;i... 阅读全文
posted @ 2013-11-14 19:54 Yours1103 阅读(194) 评论(0) 推荐(0)
摘要:知道是状态压缩,但是不会做;看题解学的;dp[i]表示现在状态是i,先手-后手的分数。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int b,g,n,s,a,co[20],dd[20]; 7 int map[25][20],dp[10)dp[i]=max(dp[i],cnt+dp[i^(1<<j)]);53 else dp[i]=max(dp[i],-dp[i^(1<<j)]);54 }55 }56 }57 ... 阅读全文
posted @ 2013-11-12 20:41 Yours1103 阅读(226) 评论(0) 推荐(0)
摘要:set的利用; 1 #include 2 #include 3 #include 4 #define maxn 100009 5 using namespace std; 6 7 struct node 8 { 9 int w,h;10 bool operator s;18 multiset::iterator it;19 int main()20 {21 int n,t;22 scanf("%d",&t);23 while(t--)24 {25 scanf("%d",&n);26 s.clear();27 ... 阅读全文
posted @ 2013-11-12 18:59 Yours1103 阅读(153) 评论(0) 推荐(0)
摘要:一个很不错的题;刚刚看到这个题目就感觉要用线段树或者树状数组,但是有感觉有点不同;敲了一发简单的线段树之后果断的T了;网上一搜题解,发现要用55颗线段树或者树状数组;一共有k种树,然后每种树根据他们%k的余数的不同又分成好几颗;然后最后统计的时候只要对每个节点统计这k种树种的信息就行; 1 #include 2 #include 3 #define maxn 50005 4 using namespace std; 5 6 int d[100][maxn],num[maxn]; 7 int n,q; 8 void insert(int k,int p,int v) 9 {10 whi... 阅读全文
posted @ 2013-11-12 16:57 Yours1103 阅读(188) 评论(0) 推荐(0)
摘要:思路:二分答案,然后模拟消灭石头的过程;如果单纯的暴力模拟的话,肯定会T的;所以要用到一定的技巧来维护;在网上看到大神们用O(n)的复杂度来优化,真心orz;原理是这样的:用一个变量sum_2存前面所有的对当前石头造成影响的冲击波的损失的能量和;所以对于当前的石头所需要的新的冲击波的数量为:(当前石头的能量值-前面有影响的冲击波数*能量x+sum_2)/能量x+1;然后就是维护sum_2了!维护sum_2要利用这个公式:(x+1)^2=x^2+2*x+1; 1 #include 2 #define maxn 50005 3 #define ll long long 4 using namesp 阅读全文
posted @ 2013-11-08 19:55 Yours1103 阅读(423) 评论(0) 推荐(0)
摘要:一个很简单的2-sat的题;不过比较难想到;其实也不是很难,可能接触的少了吧! 1 #include 2 #include 3 #define maxn 10009 4 using namespace std; 5 6 struct twosat 7 { 8 int n; 9 vectorg[maxn*2];10 bool mark[maxn*2];11 int s[maxn*2],c;12 13 bool dfs(int x)14 {15 if(mark[x^1])return 0;16 if(mark[x])... 阅读全文
posted @ 2013-11-06 23:02 Yours1103 阅读(188) 评论(0) 推荐(0)
摘要:一个二分图最大匹配的题;匈牙利算法不熟;建了个模,用最小费用最大流解决了 1 #include 2 #include 3 #define INF 9999999 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define maxn 6100 10 11 struct edge 12 { 13 int from,to,cap,flow,cost; 14 }; 15 struct MCMF 16 { 17 int n,m,s,t; 18 vector... 阅读全文
posted @ 2013-11-06 22:18 Yours1103 阅读(197) 评论(0) 推荐(0)
摘要:组合游戏题;组合游戏的规则:1.必败态的所有后继都是必胜态;2.必胜态最少有一个必败的后继;这里的必胜态是f[1][0][0][0];其中f[a][b][c][d]表示有a个1,b个2,c个3,d个4是不是一个必胜态;可以认为大于3的奇数等同于3,大于4的偶数等同于4.然后递归求解; 1 #include 2 using namespace std; 3 4 bool vis[51][51][51][51]; 5 bool f[51][51][51][51]; 6 int F(int a,int b,int c,int d) 7 { 8 if (!vis[a][b][c][d]) ... 阅读全文
posted @ 2013-11-04 21:08 Yours1103 阅读(190) 评论(0) 推荐(0)
摘要:简单的计算几何;可以把0-2*pi分成几千份,然后找出最小的;也可以用三分; 1 #include 2 #include 3 #include 4 #define pi acos(-1) 5 #define eps 1e-6 6 using namespace std; 7 8 struct node 9 {10 double x,y;11 node(double x=0,double y=0):x(x),y(y){ }12 bool operator0)return length(v3);40 else return fabs(cross(v1,v2))/l... 阅读全文
posted @ 2013-11-01 21:01 Yours1103 阅读(137) 评论(0) 推荐(0)