[BZOJ 3681]Ariettad
终于是打完了 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的更多相关文章
- bzoj 3681 Arietta
一棵有根树,每个点有一个音高,有 $m$ 中弹奏方法,每种方法可以弹奏 $d$ 子树中音高在 $[l,r]$ 间的音符,每种方法最多弹 $t$ 次 求最多能弹出多少个音符 $n \leq 10000$ ...
- BZOJ 3681 线段树合并+网络流
思路: 暴力建图有n*m条边 考虑怎么优化 (那就只能加个线段树了呗) 然后我就不会写了..... 抄了一波题解 //By SiriusRen #include <bits/stdc++.h&g ...
- 【BZOJ 3681】Arietta
传送门 题目描述 Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中. 但是她从未停止过和恋人 Velding 的书信往来.一天,她准备去探访他. 对着窗外的阳光,临 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
随机推荐
- 使用Myeclipse插件将wsdl生成java客户端代码
使用环境:MyEclipse9.0 本教程使用Myeclipse内置插件生成java代码,网上说这是xfire插件,不管怎样,生成和调用客户端代码都十分简单. 1.在项目上右键,选择New->O ...
- readelf与动态库
使用arm-linux-gcc编译的可执行文件可能会无法在开发板上执行,并提示:-/bin/sh xxx not found 解决办法: 在主机上使用readelf -d xxx 来查看该程序所需要的 ...
- Java Base64 类
package org.yp.ypfinancing.core.service.payV2.domain.service.Sdp.utils; public final class Base64 { ...
- 中小网站如何使用谷歌Adsence国际化优势赚钱?
劲捷电子信息有限公司是一家拿了美国风险投资的互联网公司.他的创办人祁劲松2005年加入AdSense,迄今收获颇丰,为此他还写了一本 <Google AdSense实战宝典>.在祁劲松看来 ...
- 一个很奇怪的问题,程序没有改动加密参数应该也没有变化.但是两次的加密结果却不一致.md5加密问题
从图上我们看出20160803的加密结果是AAEBA9C578EA522215EAE76AFCAF250.时间是9.4分 现在我们再看这个同样的加密地址与时间结果却是另一种 31672B16..... ...
- 【zz】matlab 直方图匹配
原文地址:http://www.cnblogs.com/tiandsp/archive/2012/12/19/2825418.html 直方图匹配或叫做直方图规定化都可以,是把原图像的直方图按照给定的 ...
- mac搭建本地svn
1.终端,创建SVN资源文件库 svnadmin create /Volumes/DATA/SVNTest 2配置权限 上面的语句执行完之后在相应路径下可以找到该文件夹,打开之后 这里主要是修改con ...
- JSP自定义标签
在JSP网页编程中,我们通常不满足于jstl或其他的框架,我们也可以自己写属于自己专用的标签. 在这里介绍一下表格中展示JavaBean的自定义标签的使用 第一步:写一个父标签,用来显示获取数据 新建 ...
- C#变量详解
1,变量的分类: C#是一种类型安全的语言.每一个变量都要求定义为一个特定的类型,并且要求存储在变量中的值只能是这种类型的值. 值类型 在C#中你可以通过声明枚举类型或是结构类型来定义你自己的值类型. ...
- php大力力 [051节] 支付宝支付.申请支付资质,等待审核中
https://beecloud.cn/doc/payapply/?index=6 支付宝支付申请支付资质 一.注册支付宝用户 在支付宝官网注册成为用户 二.签约对应支付产品 应用集成支付宝支付,需要 ...