hdu 3966 树链剖分(坑内存)
来源:互联网 发布:淘宝接单app软件 编辑:程序博客网 时间:2024/06/10 10:24
//hdu 3966 树链剖分+树状数组(节点)#pragma comment(linker, "/STACK:1024000000,1024000000")#include <cstdio>#include <algorithm>#include <iostream>#include <string.h>#include <vector>#define lowbit(x) ((x)&(-x))#define LL long long#define maxn 50005using namespace std;int top[maxn],fa[maxn],son[maxn],siz[maxn],dep[maxn],s[maxn],n,v[maxn],t[maxn],z;vector<int> g[maxn];inline void add (int x, int v) { while (x <= n) { t[x] += v; x += lowbit(x); }}inline void add (int l, int r, int v) { add(l, v); add(r+1, -v);}inline int query (int x) { int ret = 0; while (x) { ret += t[x]; x -= lowbit(x); } return ret;}void change(int a,int b,int c){ int aa=top[a],bb=top[b]; while(aa!=bb) { if(dep[aa]<dep[bb]) { swap(aa,bb); swap(a,b); } add(s[aa],s[a],c); a=fa[aa]; aa=top[a]; } if(dep[a]<dep[b]) swap(a,b); add(s[b],s[a],c);}void dfs(int a,int b,int c){ siz[a]=1; dep[a]=c; son[a]=0; fa[a]=b; for(int i=0;i<g[a].size();i++) { int j=g[a][i]; if(j==b) continue; dfs(j,a,c+1); siz[a]+=siz[j]; if(siz[j]>siz[son[a]]) son[a]=j; }}/*void dfs(int a,int b){ siz[a]=1; for(int i=0;i<g[a].size();i++) { int j=g[a][i]; if(j==b) continue; fa[j]=a; dep[j]=dep[a]+1; dfs(j,a); siz[a]+=siz[j]; if(siz[j]>siz[son[a]]) son[a]=j; }}*///不知道为什么这种写法会爆内存,不科学void build(int a,int b){ s[a]=++z; top[a]=b; if(son[a]) build(son[a],b); for(int i=0;i<g[a].size();i++) { int j=g[a][i]; if(j==son[a]||j==fa[a]) continue; build(j,j); }}int main () { int m,q; //freopen("d:\\in.txt","r",stdin); while (scanf("%d%d%d", &n, &m, &q) == 3) { z=0; memset(t, 0, sizeof(t)); for (int i = 1; i <= n; i++) { scanf("%d", &v[i]); g[i].clear(); } int a, b, c; for (int i = 0; i < m; i++) { scanf("%d%d", &a, &b); g[a].push_back(b); g[b].push_back(a); } dfs(1,-1,0); //dfs(1, -1); build(1, 1); for (int i = 1; i <= n; i++) add(s[i],s[i],v[i]); char op[5]; while (q--) { scanf("%s%d", op, &a); if (op[0] == 'Q') printf("%d\n", query(s[a])); else { scanf("%d%d", &b, &c); if (op[0] == 'D') c = -c; change(a, b, c); } } } return 0;}
0 0
- hdu 3966 树链剖分(坑内存)
- HDU 3966 Aragorn's Story(树链剖分+线段树区间更新+手动扩大内存)
- HDU 1232 超内存
- HDU 1671 Phone List (字典树+释放内存)
- hdu 3791(动态内存的释放问题)未解决
- HDU-3966 (树链剖分+线段树)
- HDU 3966 Aragorn's Story(树链剖分)
- hdu-3966(树链剖分+线段树)
- HDU 3966 Aragorn's Story(树链剖分)
- HDU 3966 Aragorn's Story(树链剖分)
- HDU-3966-Aragorn's Story(树链剖分)
- HDU 3966 Aragorn's Story (树链剖分)
- HDU 3966 (树链剖分对点权值,模板)
- HDU-3966-Aragorn's Story(树链剖分)
- HDU 3966 Aragorn's Story (树链剖分)
- hdu 3966 Aragorn's Story(树链剖分)
- HDU 3966 树链剖分
- hdu 3966 树链剖分模版
- Android Java四种引用区分 <17>
- 前后端分离,ajax前端跨域访问后端
- 收集的一些比较好的博客
- android开发之Camera(相机)
- 一篇关于字节序的文章
- hdu 3966 树链剖分(坑内存)
- java基础学习
- 数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
- C#中为何要使用ref参数 (个人理解)
- 如何编写测试报告
- LeetCode Search a 2D Matrix
- oracle第2天之sql
- 10大基础实用算法及其图解(程序员必备)
- 【WC2005】【BZOJ1453】Dface双面棋盘