终于是打完了 CH 上的数据结构专场了……

不过看样子还有一套 5555

传送门: http://ch.ezoj.tk/contest/CH%20Round%20%2351%20-%20Shinrein%E7%A5%AD%20%231

直接连边会 TLE。但是,连出去的点都是一个连续点集……

——于是我们机智的用了 “可合并线段树”(好,) 以空间换取时间

在网络流的图中塞一棵可持久化线段树进去,这样区间连边时就只会连 O(logn) 的边了

智商++,而且这道题让我重新认识了线段树的合并,真是受益匪浅~

不过——

我恨卡内存!!!

 #include <cstdio>
#include <cstring>
#include <vector>
const int inf=0x7FFFFFFF;
const int sizeOfSegmemt=;
const int sizeOfEdge=;
const int sizeOfPoint=;
const int sizeOfNote=; int n, m;
int P[sizeOfNote], H[sizeOfNote];
std::vector<int> son[sizeOfPoint];
inline int min(int, int);
inline int getint();
inline void putint(int); struct seg {int p; seg * l, * r;};
seg memory_seg[sizeOfSegmemt], * port_seg=memory_seg;
seg * t[sizeOfPoint];
inline seg * newseg();
void insert(seg *& , int, int, int, int);
seg * merge(seg * , seg * );
void query(seg * , int, int, int, int, int);
void dfs(int); int S, T;
int V, E;
struct edge {int point, flow; edge * next, * pair;};
edge memory_edge[sizeOfEdge], * port_edge=memory_edge;
edge * e[sizeOfPoint];
int h[sizeOfPoint], gap[sizeOfPoint];
inline edge * newedge(int, int, edge * );
inline void link(int, int, int);
int head, tail, queue[sizeOfPoint];
inline bool bfs();
edge * r[sizeOfPoint], * p[sizeOfPoint];
int aug[sizeOfPoint];
inline int isap(); int main()
{
int D, L, R, M; n=getint(), m=getint();
S=; T=n+; V=n+;
for (int i=;i<=n;i++)
{
P[i]=getint();
son[P[i]].push_back(i);
}
for (int i=;i<=n;i++)
H[i]=getint(); dfs(); for (int i=;i<=m;i++)
{
L=getint(), R=getint(), D=getint(), M=getint();
link(S, ++V, M);
query(t[D], , n, L, R, V);
} putint(isap()); return ;
}
inline int min(int x, int y)
{
return x<y?x:y;
}
inline int getint()
{
register int num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}
inline void putint(int num)
{
char stack[];
register int top=;
if (num==) stack[top=]='';
for ( ;num;num/=) stack[++top]=num%+'';
for ( ;top;top--) putchar(stack[top]);
putchar('\n');
}
inline edge * newedge(int point, int flow, edge * next)
{
edge * ret=port_edge++;
ret->point=point; ret->flow=flow; ret->next=next;
return ret;
}
inline void link(int u, int v, int f)
{
e[u]=newedge(v, f, e[u]); e[v]=newedge(u, , e[v]);
e[u]->pair=e[v]; e[v]->pair=e[u];
}
inline bool bfs()
{
memset(h, 0xFF, sizeof(h)); h[T]=;
head=tail=;
for (queue[tail++]=T;head<tail;head++)
{
int u=queue[head];
gap[h[u]]++;
for (edge * i=e[u];i;i=i->next) if (h[i->point]==-)
{
h[i->point]=h[u]+;
queue[tail++]=i->point;
}
}
return h[S]>-;
}
inline int isap()
{
int flow=;
int hmin=; if (!bfs()) return ; memcpy(r, e, sizeof(e));
memset(p, , sizeof(p));
aug[S]=inf;
for (int u=S;h[S]<V; )
{
if (u==T)
{
flow+=aug[T];
for (edge * i=p[T];i;i=p[i->point])
i->pair->flow-=aug[T], i->flow+=aug[T], aug[i->point]-=aug[T];
for (edge * i=p[T];i;i=p[i->point]) if (aug[i->point])
{
u=i->point;
break;
}
} edge *& i=r[u];
for ( ;i && (!i->flow || h[i->point]+!=h[u]);i=i->next);
if (i)
{
p[i->point]=i->pair; aug[i->point]=min(aug[u], i->flow);
u=i->point;
}
else
{
if (!--gap[h[u]]) break;
hmin=V;
for (edge * j=e[u];j;j=j->next) if (j->flow && h[j->point]+<hmin)
{
r[u]=j;
hmin=h[j->point]+;
}
++gap[h[u]=hmin];
u=u==S?S:p[u]->point;
}
} return flow;
} inline seg * newseg()
{
seg * ret=port_seg++;
ret->p=++V; ret->l=ret->r=NULL;
return ret;
}
void insert(seg *& t, int l, int r, int p, int v)
{
if (!t) t=newseg();
if (l==r) link(t->p, v, inf);
else
{
int m=(l+r)>>;
if (p<=m) insert(t->l, l, m, p, v), link(t->p, t->l->p, inf);
else insert(t->r, m+, r, p, v), link(t->p, t->r->p, inf);
}
}
seg * merge(seg * x, seg * y)
{
if (!x) return y;
if (!y) return x;
seg * t=newseg();
bool leaf=true;
if ((t->l=merge(x->l, y->l))) link(t->p, t->l->p, inf), leaf=false;
if ((t->r=merge(x->r, y->r))) link(t->p, t->r->p, inf), leaf=false;
if (leaf) link(t->p, x->p, inf), link(t->p, y->p, inf);
return t;
}
void query(seg * t, int l, int r, int ql, int qr, int p)
{
if (!t) return ;
if (l==ql && r==qr) link(p, t->p, inf);
else
{
int m=(l+r)>>;
if (qr<=m) query(t->l, l, m, ql, qr, p);
else if (ql>=m+) query(t->r, m+, r, ql, qr, p);
else query(t->l, l, m, ql, m, p), query(t->r, m+, r, m+, qr, p);
}
}
void dfs(int u)
{
link(u, T, );
insert(t[u], , n, H[u], u);
for (unsigned int i=;i<son[u].size();i++)
{
dfs(son[u][i]);
t[u]=merge(t[u], t[son[u][i]]);
}
}

我恨卡内存++

[BZOJ 3681]Ariettad的更多相关文章

  1. bzoj 3681 Arietta

    一棵有根树,每个点有一个音高,有 $m$ 中弹奏方法,每种方法可以弹奏 $d$ 子树中音高在 $[l,r]$ 间的音符,每种方法最多弹 $t$ 次 求最多能弹出多少个音符 $n \leq 10000$ ...

  2. BZOJ 3681 线段树合并+网络流

    思路: 暴力建图有n*m条边 考虑怎么优化 (那就只能加个线段树了呗) 然后我就不会写了..... 抄了一波题解 //By SiriusRen #include <bits/stdc++.h&g ...

  3. 【BZOJ 3681】Arietta

    传送门 题目描述 Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中. 但是她从未停止过和恋人 Velding 的书信往来.一天,她准备去探访他. 对着窗外的阳光,临 ...

  4. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  5. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  6. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  7. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  8. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  9. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

随机推荐

  1. C++11:新式的字符串字面常量(String Literal)

    自C++11起,我们可以定义 raw string 字符串字面常量. Raw string 允许我们定义所见即所得的字符串字面常量,从而可以省下很多用来修饰特殊 字符的符号. Raw string 以 ...

  2. EasyUI加载树控件自动展开所有目录

    在这里如何加载树控件就不在熬述,在加载树控件后,树的节点全部展开,要在OnLoadSuccess事件中写代码:

  3. 第三章 Git使用入门

    我们都知道Linux和Android是开源的.Linux下的软件很多都不直接以二进制形式的安装包提供,而是直接提供了源代码,为了减少发行包的大小,用户须先下载源代码,在本机上编译并安装,使用make. ...

  4. jsp数据交互(一),九大内置对象

    九大内置对象 九大内置对象 内置对象 类型 说明 作用域 request javax.servlet.ServletRequest 请求对象——在 一次请求/一个Request请求周期 中传递数据,请 ...

  5. PHP往mysql数据库中写入中文失败

    该类问题解决办法就是 在建立数据库连接之后,将该连接的编码方式改为中文. 代码如下: $linkID=@mysql_connect("localhost","root&q ...

  6. 如何解决Selenium中"Cannot find function addEventListener in object [object HTMLDocument]"的错误

    project: blog target: how-to-resolve-cannot-find-function-addEventListener-error-in-selenium.md stat ...

  7. php7.0支持调用lua脚本

    需求前瞻: 最近因需求,需要支持php调用现有的Lua代码,可以减少php的代码量,同时在维护上也比较方便,不会照成需求变更,需要同时修改两份代码 第一步:安装php7.0及以上版本,此处安装方法就略 ...

  8. 写简单游戏,学编程语言-python篇:大鱼吃小鱼

    很常见的游戏之一,实现原理并不复杂,并且参考了几个相关的代码.这边主要还是以学习编程语言和学习编程思路为重点记录一下吧.最近时间有点吃紧,只能匆忙记录一下.用pygame做的大鱼吃小鱼的游戏截图如下: ...

  9. opnet学习过程

    学习opnet有一段时间了,走了 不少弯路,现在,想总结一下,推荐给大家一个比较好的学习过程. 因为英语不太好,所以在开始学opnet时用了很多心思去找中文资料,比如说,一些文档.书.视频等.看文档和 ...

  10. H3C汇聚层交换机认证在线人数展示系统之需求说明和功能点说明

    一.需求 (一)每五分钟查询一次交换机的连接情况: (二)每2.5分钟更新每栋楼的连接情况. 二.功能点 序号 功能点说明 待定 完成 未完成 完成时间 预计用时(min) 实际用时(min) 备注 ...