自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 资源 (2)
  • 收藏
  • 关注

原创 【左偏树】HDU 1512/ZOJ 2334

推荐黄源河的论文http://wenku.baidu.com/view/515f76e90975f46527d3e1d5.html #define N 100010struct node{ int dis,v; int l,r;}k[N];int n,m,pre[N];void init(){ int i; for(i=0;i<=n;

2012-02-17 15:59:04 1209

原创 【归并树—求第K小数】POJ 2104/HDU 2665

归并树 O(logn*logn*logn) for each query,很慢的说,划分树版http://blog.csdn.net/leolin_/article/details/6696801/*//1,建立归并树后我们得到了序列key[]的非降序排列,由于此时key[]内元素的rank是非递减的,因此key[]中属于指定区间[s,t]内的元素的rank也是非递减的,所以我们可以用

2012-02-15 11:40:56 729

原创 【二分匹配匈牙利算法模板】

注意内外循环!!!#define N 204int match[N];bool vis[N];int g[N][N];int n,m;bool sear(int s){ int i,j; for(i=1;i<=m;i++){//内循环是y集合(可以根据下一行的邻接矩阵改变一下) if(g[s][i] && !vis[i]){ v

2012-02-12 02:42:53 547

原创 【最大团模板】

ZOJ 1492 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=492/*最大团 = 补图G的最大独立集数———>最大独立集数 = 补图G'最大团*///最大团模板#define N 102int mx;//最大团数(要初始化为0)int x[N],tuan[N];int can[N][N];//can

2012-02-12 01:50:19 1682

原创 【无向图求最小割集】

一个无向连通网络,去掉一个边集可以使其变成两个连通分量则这个边集就是割集;最小割集当然就权和最小的割集。可以用最小切割最大流定理:1.min=MAXINT,确定一个源点2.枚举汇点3.计算最大流,并确定当前源汇的最小割集,若比min小更新min4.转到2直到枚举完毕5.min即为所求输出min    不难看出复杂度很高:枚举汇点要O(n),最

2012-02-10 21:45:13 7217

原创 【tarjan求解双连通分量】

无向图的连通分支(连通子图): 判断一个无向图是否连通,如果进行dfs或者bfs之后,还有未访问到的顶点,说明不是连通图,否则连通。求解无向图的所有连通分支: 只需要重复调用dfs或者bfs 就可以解决:遍历顶点,如果v 未访问,则对其进行dfs, 然后标记访问。关节点(割点): 是图中一个顶点v, 如果删除它以及它关联的边后,得到的新图至少包含两个连通分支。双连通图: 没有关

2012-02-09 03:21:41 2470

原创 【LCA模板题】POJ 1330

RMQ版#define N 10010struct edge{ int v; int next;}e[2*N];int ecnt;int head[N];bool vis[N];int n;//点数int R[N];//第一次出现i点下标int p[N*2];//记录路径点编号//int dis[N];//与根的距离int dep[2*N];//深度int

2012-02-08 04:31:03 995 1

原创 【背包模板】

int V;//容量 //01void zeroone(int cost,int val){//费用,价值 int i; for(i=V;i>=cost;i--){ if(dp[i]<dp[i-cost]+val){ dp[i] = dp[i-cost]+val; } } } //

2012-02-05 20:21:34 660

转载 【转】刘汝佳黑书POJ题目

一.动态规划参考资料:刘汝佳《算法艺术与信息学竞赛》《算法导论》推荐题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=1141 简单http://acm.pku.edu.cn/JudgeOnline/problem?id=2288 中等,经典TSP问题http://acm.pku.edu.cn/Judge

2012-02-03 22:07:20 1112

原创 【模拟】HDU 4134

模拟不解释int a[110];int main(){ int t; scanf("%d",&t); int ca = 1; while(t--){ int n; scanf("%d",&n); int i,j; for(i=1;i<=n;i++)scanf("%d",&a[i]);

2012-02-29 16:47:50 605

原创 【dfs】HDU 4141

简单的dfs,bfs也可以int g[11][11];int n,m;bool vis[11][11];int d[4][2] = {0,1,0,-1,1,0,-1,0};int ans;void dfs(int x,int y){ if(vis[x][y])return ; vis[x][y] = 1; int i; if(x==1 || y==1

2012-02-29 16:17:06 598

原创 【贪心】HDU 4137

咋一看,Manhattan Sort?纳尼?其实水题一道...运用了贪心,因为要总的移动的距离最小的最优办法就是直接把它挪到它应该放的地方,况且每个数都是唯一的struct node{ int id; int v;}p[33];bool cmp(node a,node b){ return a.v<b.v;}int main(){ int t;

2012-02-29 00:35:37 554

原创 【容斥原理】HDU 4135

容斥原理的应用,分别找1~a的和1~b的个数,相减就是答案,其中找的时候要用容斥原理求,因为有些会重复计数#define N 1000005int p[N];int cnt;void factor(int n){ int i; int a = 1; for(i=2;i*i<=n;i+=a,a=2){ if(n%i==0){

2012-02-28 21:16:33 673

原创 【数学题/化简分数】HDU 4139

简单的数学题,化简分数,做法是分别记录分子和分母的素因子个数,分子的加1,分母的加-1,这样最后个数为0的就代表已经约去,有个小优化,找一个数的素因子的时候用上,快了300ms....Orz,具体看代码#define N 1000005int max(int a,int b){return a>b?a:b;}LL cnt[N];void gao(int n,int p){ int

2012-02-28 12:45:16 973

原创 【逆序数】POJ 2188

这题也是求逆序数,只是题目描述有点诡异==!给出的是钩子的id,不是一对一的关系,所以要映射一下,喜欢上用归并求逆序数#define N 1010int a[N],b[N];int tmp[N];int sum;void merge_sort(int l,int mid,int r){ int i = l,j = mid+1,k = 1; while(i<=mid &&

2012-02-28 01:01:30 962

原创 【直线划分+逆序数】ZOJ 3574

左边交点从小到大排序,右边求逆序数,用归并求,注意要处理一下左边交点共点的情况,答案就是直线数+交点数+1,一不小心刷到rank2...ORZ#define N 30005struct node{ int l,r;}p[N];int a[N];int n;int tmp[N];int num;void merge_sort1(int l,int mid,int r)

2012-02-27 19:44:13 722

原创 【状态压缩DP】HDU 2167

跟POJ 1185炮兵阵地差不多int g[16][16];int st[1001];char str[101];int dp[16][(1<<15)];int num[16][1001];int n;int tot;bool ok(int x){ if(x & (x<<1))return 0; if(x & (x>>1))return 0; return

2012-02-24 21:32:44 649

原创 【状态压缩DP】POJ 1185

稍后放出解释。。。int st[66];int cur[66];char str[110][15];int dp[110][66][66];//dp[i][j][k] 表示第i行状态为j,第i-1状态为k时的最大炮兵个数int num[66];int n,m;int tot;bool ok(int x){ if(x & (x<<1))return 0; if(x

2012-02-24 20:26:32 436

原创 【状态压缩DP】POJ 1170

题意:一个商店提供多种商品,当用户单独购买商品时有一个价格,当用户组合购买时可以获得优惠,现在提供多种优惠方案和需要购买的物品总数,问最大的优惠是多少。输入27 3 28 2 521 7 3 52 7 1 8 2 10表示有 2 种商品,编号分别是 7 和 8,分别要购买的数量是 3 和 2,2 和 5 是它们的单件购买价格。接下来是 2 种优惠。第 1 种优惠

2012-02-23 23:23:37 700

原创 【有根树的同构】ZOJ 1990/POJ 1635

有根树的同构的意思就是两棵树的形状一样,子树可以旋转,因此,当子树的子节点数相同就可以判断同构不用建树,只需要利用dfs时遇到'1'的时候回溯就行,开一个数组hash[i] = j表示子结点数为i(包括自己)的结点为j个0ms无压力int hash[801];//hash[i] = j表示子结点数为i(包括自己)的结点为j个int get1(){ int n = 1;

2012-02-23 15:55:12 918 1

原创 【字符串最小表示】HDU 2609

http://acm.hdu.edu.cn/showproblem.php?pid=2609对每个串都求出最小表示的串,sort一下,暴力一下。。。A了#define N 10005char str[N];struct node{ char s[1000];}ss[N];bool cmp(node a,node b){ return strcmp(a.s,b.s)<

2012-02-23 01:06:08 1403

原创 【字符串最小表示】HDU 3374

http://acm.hdu.edu.cn/showproblem.php?pid=3374原来这个东西叫最小表示。。。方法:分别求一次最小表示和最大表示求出首字母位置,然后下面就比较暴力,用两次kmp求出最大串和最小串出现的次数#define N 1000010char str[N],ss[N*2],lin[N];int p[N];int Minrp(char *s, in

2012-02-23 00:25:08 659

转载 【字符串循环同构的最小表示法】

循环字符串的最小表示法的问题可以这样描述:对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。由于语言能力有限,还是用实际例子来解释比较容易:设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。对于字符串循环同构的最小表示法,其问题实质是求S串的一个位置,从这个位置开始循环输出S,得到的S’字典序最

2012-02-22 21:15:26 1276

原创 叉积的作用

在三维向量空间中 , 假设a和b是两个向量, 那么它们的叉积c=aXb可如下严格定义。  (1)|c|=|a×b|=|a||b|sin  (2)c⊥a, 且c⊥b,  (3)c的方向要用“右手法则”判断(用右手的四指先表示向量a的方向,然后手指朝着手心的方向摆动到向量b的方向,大拇指所指的方向就是向量c的方向)。叉积的一个非常重要性质是可

2012-02-21 21:36:54 983

原创 计算三角形面积

方案一:三角形面积=底*高/2。方案二:三角形面积=sinA*b*c/2.sinA=sqrt(1-cosA*cosA);cosA根据余弦定理:CosA=(c^2+b^2-a^2)/2bc;缺点:中间因为浮点型的转换,浮点型相除,开根号,造成误差偏大。方案三:海伦公式S=√[p(p-a)(p-b)(p-c

2012-02-21 21:30:35 1461

原创 【dfs】HDU 4155

dfs。只标记空格int g[22][22];bool vis[22][22];int d[4][2] = {0,1,0,-1,1,0,-1,0};int n;int sumb,sumw,sum;int tag;void dfs(int x,int y){ int i,j; for(i=0;i<4;i++){ int xx = x+d[i][0];

2012-02-19 14:51:04 705

原创 【dfs博弈】HDU 4155

一开始理解错题意,以为每个人各自有一堆,后来发现是总共才有1堆,问谁会使得堆的和大于31就是输,可以看出31是必胜点,每个人最优的策略是使得自己到达31,因此可以dfs,利用回溯把每个状态输赢求出来,类似于dp,从后往上推。状态的话可以用一个七维数组记录char str[200];int dp[33][5][5][5][5][5][5];int num[10];int lin(int

2012-02-19 13:00:30 653

原创 【最小路径覆盖】HDU 4160

建图:如果有wi i连一条有向边,最后求一次最小路径覆盖即可,ps:最小路径覆盖 = |V| - 最大匹配#define N 505int match[N];bool vis[N];int g[N][N];int n;struct node{ int w,l,h;}p[N];bool sear(int s){ int i,j; for(i=0;i<n;i+

2012-02-18 20:24:26 635

原创 【二维线段树】HDU 1823

很裸的一道二维线段树,第一次做,其实二维的线段树也就是树套树,先一维再第二维,第一、二维的操作都很类似。说回hdu这道题,有点水,提交的时候记得交c++,g++会wa死你!#define N 210struct node{ int al,ar; double mx;};struct node1{ int hl,hr; node subt[4000];

2012-02-16 17:04:53 2394

原创 【划分树】HDU 3473

题意就是求[l,r]中位数与其余元素差的绝对值再求和方法:用划分树求出中位数,询问的同时求出中位数左边元素和还有左边元素个数,因此这里需要增加一个数组suml[dep][i]表示深度为dep的一段区间里划分到左边的元素和,求出来后就可以算出右边元素和还有右边元素个数,最后的结果就是ans = rs-ls+mid*(lcnt-rcnt),具体看代码和注释。注意有可能溢出,所以凡是跟元素和有关

2012-02-16 14:24:12 805

原创 【线段树+O(nlgn)最长上升子序列】HDU 3564

the k-th number Xk means that we add number k at position Xk (0 注意插数的时候是插到当前序列里,也就是说不可能插到当前序列末尾,还有,这是可以不连续的!!!我还以为是LICS......囧#define N 100005struct node{ int l,r; int cnt;}t[N*4];void b

2012-02-14 16:19:03 1253

原创 【线段树求LCIS】HDU 3308

注意查询时当左右两个区间可以合并的情况min(mid-x+1, t[id#define N 100005struct node{ int l,r; int lm,rm; int mx;}t[N*4+1000];int a[N+100];inline void up(int id){ t[id].lm = t[id<<1].lm; if(t[id

2012-02-14 10:41:12 493

原创 【线段树延迟更新】HDU 3275

以后再补解题报告,先贴代码http://acm.hdu.edu.cn/showproblem.php?pid=3275#define N 100005char str[N];int sum0[N*4],sum1[N*4];bool mark[N*4];void up(int id){ sum0[id] = sum0[id<<1] + sum0[id<<1|1]; sum

2012-02-14 06:58:14 515

原创 【线段树延迟更新】Codeforces Round #104 (Div. 1) E

#define N 1000005int c4[N*5],c7[N*5];int c47[N*5],c74[N*5];bool mark[N*5];char str[N];void up(int id){ c4[id] = c4[id<<1] + c4[id<<1|1]; c7[id] = c7[id<<1] + c7[id<<1|1]; c47[id] = ma

2012-02-13 19:27:28 630

原创 【最大团】POJ 3692

最大团 = 补图最大独立集 = 补图全集 - 补图最小路径覆盖 = 补图全集 - 补图最大匹配#define N 204int match[N];bool vis[N];int g[N][N];int n,m;bool sear(int s){ int i,j; for(i=1;i<=m;i++){//内循环是y集合 if(g[s][i] && !vi

2012-02-12 02:44:51 555

原创 【图染色】POJ 1419 & UVA 193

暴力dfs,先假设全部为白色,然后枚举每个点,对每个点dfs乱搞,网上搜了下可以用最大团做,没见过,先放在这里,学会了再做一遍!#define N 102int color[N];int g[N][N];int maxm,len;int n;int ans[N];int num;void dfs(int u){//0——白色,1——黑色 int i,j; if

2012-02-11 18:29:02 752

原创 【求最小代价环floyd】POJ 1734

#define N 110int g[N][N];int dis[N][N];int ans[N];int p[N][N];//记录i——j之间的路径int n,m;int minm;int cnt;int mid;void floyd(){ int i,j,k; for(k=1;k<=n;k++){ //求环 for(i=1;i<

2012-02-10 15:17:17 671

原创 【tarjan双连通求割点&连通分量】POJ 1523

/*构建一棵dfs树,序列dfn[i]为深度优先数,表示dfs时访问i节点的序号,low[i]表示从i节点出发能访问到的最小的深度优先数。当且仅当节点u满足如下两个条件之一时,u为割点:1.u为dfs树的根,且u至少有两个子节点。2.u不是dfs树的根,至少存在一个节点v是u的子节点,且low[v]>=dfn[u]。若u为割点,记subnets[u]为u的子节点数,则去掉u后,图被分成

2012-02-10 01:36:26 439

原创 【tarjan双连通+LCA求割边数】POJ 3694

http://poj.org/problem?id=369408年的合肥赛区网络赛,这里求u,v的LCA只是常数时间复杂度#define N 100010struct edge{ int v; int next;}e[N*10];int ecnt;int head[N];void init(){ ecnt = 0; memset(head,-1,s

2012-02-09 13:18:10 1067

原创 【双连通分量】POJ 3352 3177

POJ 3352 跟POJ 3177其实是一样的,只不过3177可能有重边,要特判。3352问改造后去掉一条边仍然连通,3177问改造后任意两点至少有两条不同的路,其实是一样的,都是先找出桥,把各分量缩成一点变成一棵树,结果就是(子叶数+1)/2#define N 1005vector v[N];int low[N];bool vis[N];int du[N];int cnt

2012-02-09 03:16:40 456

acm程序设计曾宗根

acm程序设计曾宗根,方便

2011-09-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除