当前位置: 首页 > news >正文

delphi WordPress/云seo关键词排名优化软件

delphi WordPress,云seo关键词排名优化软件,西宁做腋臭哪里北大DE网站,北京装修公司哪家口碑好一些HDU_4010 这个题目由于需要Cut和Join,所以需要用link-cut-tree来写。 无论是Cut还是Join,都涉及到一个基本的操作,就是把一个节点变成根(makeroot),如果能把makeroot这个操作写成功的话,Cut和Join就比较好完成了。 实际…

HDU_4010

    这个题目由于需要Cut和Join,所以需要用link-cut-tree来写。

    无论是Cut还是Join,都涉及到一个基本的操作,就是把一个节点变成根(makeroot),如果能把makeroot这个操作写成功的话,Cut和Join就比较好完成了。

    实际上在进行access(x)的操作之后,如果我们想将x作为根,只需要将这条路径上的边的父子关系都“反向”即可,那么便只要将x旋转到根,然后将这棵splay以及其子树上左右儿子的位置交换,也就是打一个rev(reverse)的标记就可以了。

    此外,对于一些细节也需要注意,比如某些操作中x如果和y相等的话是否需要特判一下。

#include<stdio.h>
#include<string.h>
#define MAXD 300010
#define MAXM 600010
#define INF 0x7fffffff
int N, first[MAXD], e, next[MAXM], v[MAXM], q[MAXD];
struct Splay
{int pre, ls, rs, key, max, rev, add;bool root;void update(); void pushdown(); void zig(int ); void zag(int ); void splay(int );void renew(){root = true;pre = ls = rs = 0;rev = add = 0;}
}sp[MAXD];
int Max(int x, int y)
{return x > y ? x : y;
}
void Splay::update()
{max = Max(Max(sp[ls].max, sp[rs].max), key);
}
void makeadd(int cur, int delta)
{if(cur)sp[cur].add += delta, sp[cur].key += delta, sp[cur].max += delta;
}
void Swap(int &x, int &y)
{int t;t = x, x = y, y = t;
}
void makerev(int cur)
{sp[cur].rev ^= 1;Swap(sp[cur].ls, sp[cur].rs);
}
void Splay::pushdown()
{if(add)makeadd(ls, add), makeadd(rs, add), add = 0;if(rev)makerev(ls), makerev(rs), rev = 0;
}
void Splay::zig(int x)
{int y = rs, fa = pre;rs = sp[y].ls, sp[rs].pre = x;sp[y].ls = x, pre = y;sp[y].pre = fa;if(root)root = false, sp[y].root = true;elsesp[fa].rs == x ? sp[fa].rs = y : sp[fa].ls = y;update();
}
void Splay::zag(int x)
{int y = ls, fa = pre;ls = sp[y].rs, sp[ls].pre = x;sp[y].rs = x, pre = y;sp[y].pre = fa;if(root)root = false, sp[y].root = true;elsesp[fa].rs == x ? sp[fa].rs = y : sp[fa].ls = y;update();
}
void Splay::splay(int x)
{int y, z;for(pushdown(); !root;){y = pre;if(sp[y].root)sp[y].pushdown(), pushdown(), sp[y].rs == x ? sp[y].zig(y) : sp[y].zag(y);else{z = sp[y].pre;sp[z].pushdown(), sp[y].pushdown(), pushdown();if(sp[z].rs == y){if(sp[y].rs == x)sp[z].zig(z), sp[y].zig(y);elsesp[y].zag(y), sp[z].zig(z);}else{if(sp[y].ls == x)sp[z].zag(z), sp[y].zag(y);elsesp[y].zig(y), sp[z].zag(z);}}}update();
}
void access(int x)
{int fx;for(fx = x, x = 0; fx != 0; x = fx, fx = sp[x].pre){sp[fx].splay(fx);sp[sp[fx].rs].root = true;sp[fx].rs = x, sp[x].root = false;sp[fx].update();}
}
void makeroot(int x)
{access(x);sp[x].splay(x);makerev(x);
}
void prepare()
{int i, j, x, rear = 0;sp[0].max = -INF;q[rear ++] = 1;sp[1].renew(), sp[1].max = sp[1].key;for(i = 0; i < rear; i ++){x = q[i];for(j = first[x]; j != -1; j = next[j])if(v[j] != sp[x].pre){sp[v[j]].renew(), sp[v[j]].pre = x, sp[v[j]].max = sp[v[j]].key;q[rear ++] = v[j];}}
}
void add(int x, int y)
{v[e] = y;next[e] = first[x], first[x] = e ++;
}
void init()
{int i, x, y;memset(first, -1, sizeof(first));e = 0;for(i = 1; i < N; i ++){scanf("%d%d", &x, &y);add(x, y), add(y, x);}for(i = 1; i <= N; i ++)scanf("%d", &sp[i].key);prepare();
}
void Join(int x, int y)
{if(x == y){printf("-1\n");return ;}makeroot(x);makeroot(y);if(sp[x].pre == 0)sp[y].pre = x;elseprintf("-1\n");
}
void Cut(int x, int y)
{makeroot(x);access(y);sp[y].splay(y);if(sp[x].pre == 0)printf("-1\n");else{int t = sp[y].ls;sp[t].root = true, sp[t].pre = 0, sp[y].ls = 0;sp[y].update();}
}
void Change(int x, int y, int z)
{int fy;makeroot(y);makeroot(x);if(sp[y].pre == 0)printf("-1\n");else{access(x);for(fy = y, y = 0; fy != 0; y = fy, fy = sp[y].pre){sp[fy].splay(fy);if(sp[fy].pre == 0){makeadd(sp[fy].rs, z), makeadd(y, z);sp[fy].key += z;}sp[sp[fy].rs].root = true;sp[fy].rs = y, sp[y].root = false;sp[fy].update();}}
}
void Query(int x, int y)
{int fy;if(x == y){sp[x].splay(x);printf("%d\n", sp[x].key);return ;}makeroot(y);makeroot(x);if(sp[y].pre == 0)printf("-1\n");else{access(x);for(fy = y, y = 0; fy != 0; y = fy, fy = sp[y].pre){sp[fy].splay(fy);if(sp[fy].pre == 0)printf("%d\n", Max(Max(sp[sp[fy].rs].max, sp[y].max), sp[fy].key));sp[sp[fy].rs].root = true;sp[fy].rs = y, sp[y].root = false;sp[fy].update();}}
}
void solve()
{int i, x, y, z, m, op;scanf("%d", &m);for(i = 0; i < m; i ++){scanf("%d%d%d", &op, &x, &y);if(op == 1)Join(x, y);else if(op == 2)Cut(x, y);else if(op == 3){scanf("%d", &z);Change(y, z, x);}elseQuery(x, y);}
}
int main()
{while(scanf("%d", &N) == 1){init();solve();printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/staginner/archive/2012/06/17/2552330.html

http://www.jmfq.cn/news/4968595.html

相关文章:

  • 哈尔滨建设网站公司哪家好/seo搜索引擎优化实训总结
  • 建站服务的网络公司有哪些/b2b有哪些电商平台
  • 忻州建设网站的公司/实时热搜
  • 永久免费的网站哪个好/汕头网站推广排名
  • 免费学编程网站/公司网站制作教程
  • 长沙网站建设好处/软文大全500篇
  • 一般淘宝网站做几个月赚钱/杭州seo排名收费
  • 免费发广告网站/百度识图查图片
  • 西安优秀的集团门户网站建设/销售新人怎么找客户
  • 网站三网合一什么意思/网络公司seo推广
  • 黄村网站建设价格/灵宝seo公司
  • 西安微信网站制作/网络推广外包注意哪些
  • 建设静态网站/信息流广告优化师
  • 网站的电子地图怎么做/搜索引擎推广的基本方法
  • 菲律宾有做网站的吗/网络营销推广方式有哪些
  • 国产wordpress模板/百度搜索关键词优化
  • 化工原料东莞网站建设/2345网址导航官网官方电脑版
  • 做服装微商城网站/佛山seo网站排名
  • 企业活动网站创意案例/网络营销渠道策略研究
  • 做电影网站如何推广方案/sem工作内容
  • 徐州市贾汪区建设局网站/兰州正规seo整站优化
  • 手机访问网站建设中/新闻头条最新消息10条
  • 网站建设的方法/优化大师网页版
  • 佛山骏域网站建设专家/凡科建站后属于自己的网站吗
  • springboot和WordPress/seo任务
  • 一个完整的网站设计/宜兴百度推广公司
  • 推荐几个手机能看的网站/网站关键词排名查询工具
  • 甘肃嘉峪关建设局网站/线下营销推广方式有哪些
  • 深圳的网站建设公司的外文名是/网络营销有哪些手段
  • 发布文章后马上更新网站主页/南宁seo多少钱报价