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

不过看样子还有一套 5555

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

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

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

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

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

不过——

我恨卡内存!!!

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. const int inf=0x7FFFFFFF;
  5. const int sizeOfSegmemt=;
  6. const int sizeOfEdge=;
  7. const int sizeOfPoint=;
  8. const int sizeOfNote=;
  9.  
  10. int n, m;
  11. int P[sizeOfNote], H[sizeOfNote];
  12. std::vector<int> son[sizeOfPoint];
  13. inline int min(int, int);
  14. inline int getint();
  15. inline void putint(int);
  16.  
  17. struct seg {int p; seg * l, * r;};
  18. seg memory_seg[sizeOfSegmemt], * port_seg=memory_seg;
  19. seg * t[sizeOfPoint];
  20. inline seg * newseg();
  21. void insert(seg *& , int, int, int, int);
  22. seg * merge(seg * , seg * );
  23. void query(seg * , int, int, int, int, int);
  24. void dfs(int);
  25.  
  26. int S, T;
  27. int V, E;
  28. struct edge {int point, flow; edge * next, * pair;};
  29. edge memory_edge[sizeOfEdge], * port_edge=memory_edge;
  30. edge * e[sizeOfPoint];
  31. int h[sizeOfPoint], gap[sizeOfPoint];
  32. inline edge * newedge(int, int, edge * );
  33. inline void link(int, int, int);
  34. int head, tail, queue[sizeOfPoint];
  35. inline bool bfs();
  36. edge * r[sizeOfPoint], * p[sizeOfPoint];
  37. int aug[sizeOfPoint];
  38. inline int isap();
  39.  
  40. int main()
  41. {
  42. int D, L, R, M;
  43.  
  44. n=getint(), m=getint();
  45. S=; T=n+; V=n+;
  46. for (int i=;i<=n;i++)
  47. {
  48. P[i]=getint();
  49. son[P[i]].push_back(i);
  50. }
  51. for (int i=;i<=n;i++)
  52. H[i]=getint();
  53.  
  54. dfs();
  55.  
  56. for (int i=;i<=m;i++)
  57. {
  58. L=getint(), R=getint(), D=getint(), M=getint();
  59. link(S, ++V, M);
  60. query(t[D], , n, L, R, V);
  61. }
  62.  
  63. putint(isap());
  64.  
  65. return ;
  66. }
  67. inline int min(int x, int y)
  68. {
  69. return x<y?x:y;
  70. }
  71. inline int getint()
  72. {
  73. register int num=;
  74. register char ch;
  75. do ch=getchar(); while (ch<'' || ch>'');
  76. do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
  77. return num;
  78. }
  79. inline void putint(int num)
  80. {
  81. char stack[];
  82. register int top=;
  83. if (num==) stack[top=]='';
  84. for ( ;num;num/=) stack[++top]=num%+'';
  85. for ( ;top;top--) putchar(stack[top]);
  86. putchar('\n');
  87. }
  88. inline edge * newedge(int point, int flow, edge * next)
  89. {
  90. edge * ret=port_edge++;
  91. ret->point=point; ret->flow=flow; ret->next=next;
  92. return ret;
  93. }
  94. inline void link(int u, int v, int f)
  95. {
  96. e[u]=newedge(v, f, e[u]); e[v]=newedge(u, , e[v]);
  97. e[u]->pair=e[v]; e[v]->pair=e[u];
  98. }
  99. inline bool bfs()
  100. {
  101. memset(h, 0xFF, sizeof(h)); h[T]=;
  102. head=tail=;
  103. for (queue[tail++]=T;head<tail;head++)
  104. {
  105. int u=queue[head];
  106. gap[h[u]]++;
  107. for (edge * i=e[u];i;i=i->next) if (h[i->point]==-)
  108. {
  109. h[i->point]=h[u]+;
  110. queue[tail++]=i->point;
  111. }
  112. }
  113. return h[S]>-;
  114. }
  115. inline int isap()
  116. {
  117. int flow=;
  118. int hmin=;
  119.  
  120. if (!bfs()) return ;
  121.  
  122. memcpy(r, e, sizeof(e));
  123. memset(p, , sizeof(p));
  124. aug[S]=inf;
  125. for (int u=S;h[S]<V; )
  126. {
  127. if (u==T)
  128. {
  129. flow+=aug[T];
  130. for (edge * i=p[T];i;i=p[i->point])
  131. i->pair->flow-=aug[T], i->flow+=aug[T], aug[i->point]-=aug[T];
  132. for (edge * i=p[T];i;i=p[i->point]) if (aug[i->point])
  133. {
  134. u=i->point;
  135. break;
  136. }
  137. }
  138.  
  139. edge *& i=r[u];
  140. for ( ;i && (!i->flow || h[i->point]+!=h[u]);i=i->next);
  141. if (i)
  142. {
  143. p[i->point]=i->pair; aug[i->point]=min(aug[u], i->flow);
  144. u=i->point;
  145. }
  146. else
  147. {
  148. if (!--gap[h[u]]) break;
  149. hmin=V;
  150. for (edge * j=e[u];j;j=j->next) if (j->flow && h[j->point]+<hmin)
  151. {
  152. r[u]=j;
  153. hmin=h[j->point]+;
  154. }
  155. ++gap[h[u]=hmin];
  156. u=u==S?S:p[u]->point;
  157. }
  158. }
  159.  
  160. return flow;
  161. }
  162.  
  163. inline seg * newseg()
  164. {
  165. seg * ret=port_seg++;
  166. ret->p=++V; ret->l=ret->r=NULL;
  167. return ret;
  168. }
  169. void insert(seg *& t, int l, int r, int p, int v)
  170. {
  171. if (!t) t=newseg();
  172. if (l==r) link(t->p, v, inf);
  173. else
  174. {
  175. int m=(l+r)>>;
  176. if (p<=m) insert(t->l, l, m, p, v), link(t->p, t->l->p, inf);
  177. else insert(t->r, m+, r, p, v), link(t->p, t->r->p, inf);
  178. }
  179. }
  180. seg * merge(seg * x, seg * y)
  181. {
  182. if (!x) return y;
  183. if (!y) return x;
  184. seg * t=newseg();
  185. bool leaf=true;
  186. if ((t->l=merge(x->l, y->l))) link(t->p, t->l->p, inf), leaf=false;
  187. if ((t->r=merge(x->r, y->r))) link(t->p, t->r->p, inf), leaf=false;
  188. if (leaf) link(t->p, x->p, inf), link(t->p, y->p, inf);
  189. return t;
  190. }
  191. void query(seg * t, int l, int r, int ql, int qr, int p)
  192. {
  193. if (!t) return ;
  194. if (l==ql && r==qr) link(p, t->p, inf);
  195. else
  196. {
  197. int m=(l+r)>>;
  198. if (qr<=m) query(t->l, l, m, ql, qr, p);
  199. else if (ql>=m+) query(t->r, m+, r, ql, qr, p);
  200. else query(t->l, l, m, ql, m, p), query(t->r, m+, r, m+, qr, p);
  201. }
  202. }
  203. void dfs(int u)
  204. {
  205. link(u, T, );
  206. insert(t[u], , n, H[u], u);
  207. for (unsigned int i=;i<son[u].size();i++)
  208. {
  209. dfs(son[u][i]);
  210. t[u]=merge(t[u], t[son[u][i]]);
  211. }
  212. }

我恨卡内存++

[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. 使用Myeclipse插件将wsdl生成java客户端代码

    使用环境:MyEclipse9.0 本教程使用Myeclipse内置插件生成java代码,网上说这是xfire插件,不管怎样,生成和调用客户端代码都十分简单. 1.在项目上右键,选择New->O ...

  2. readelf与动态库

    使用arm-linux-gcc编译的可执行文件可能会无法在开发板上执行,并提示:-/bin/sh xxx not found 解决办法: 在主机上使用readelf -d xxx 来查看该程序所需要的 ...

  3. Java Base64 类

    package org.yp.ypfinancing.core.service.payV2.domain.service.Sdp.utils; public final class Base64 { ...

  4. 中小网站如何使用谷歌Adsence国际化优势赚钱?

    劲捷电子信息有限公司是一家拿了美国风险投资的互联网公司.他的创办人祁劲松2005年加入AdSense,迄今收获颇丰,为此他还写了一本 <Google AdSense实战宝典>.在祁劲松看来 ...

  5. 一个很奇怪的问题,程序没有改动加密参数应该也没有变化.但是两次的加密结果却不一致.md5加密问题

    从图上我们看出20160803的加密结果是AAEBA9C578EA522215EAE76AFCAF250.时间是9.4分 现在我们再看这个同样的加密地址与时间结果却是另一种 31672B16..... ...

  6. 【zz】matlab 直方图匹配

    原文地址:http://www.cnblogs.com/tiandsp/archive/2012/12/19/2825418.html 直方图匹配或叫做直方图规定化都可以,是把原图像的直方图按照给定的 ...

  7. mac搭建本地svn

    1.终端,创建SVN资源文件库 svnadmin create /Volumes/DATA/SVNTest 2配置权限 上面的语句执行完之后在相应路径下可以找到该文件夹,打开之后 这里主要是修改con ...

  8. JSP自定义标签

    在JSP网页编程中,我们通常不满足于jstl或其他的框架,我们也可以自己写属于自己专用的标签. 在这里介绍一下表格中展示JavaBean的自定义标签的使用 第一步:写一个父标签,用来显示获取数据 新建 ...

  9. C#变量详解

    1,变量的分类: C#是一种类型安全的语言.每一个变量都要求定义为一个特定的类型,并且要求存储在变量中的值只能是这种类型的值. 值类型 在C#中你可以通过声明枚举类型或是结构类型来定义你自己的值类型. ...

  10. php大力力 [051节] 支付宝支付.申请支付资质,等待审核中

    https://beecloud.cn/doc/payapply/?index=6 支付宝支付申请支付资质 一.注册支付宝用户 在支付宝官网注册成为用户 二.签约对应支付产品 应用集成支付宝支付,需要 ...