BZOJ 3681 线段树合并+网络流
思路:
暴力建图有n*m条边
考虑怎么优化
(那就只能加个线段树了呗)
然后我就不会写了.....
抄了一波题解
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=,M=N*,inf=0x3f3f3f3f;
vector<int>vec[N];
int n,m,first[M],next[M],v[M],w[M],tot,cnt=,S=,T=;
int lson[M],rson[M],root[N],jy,vis[M];
int read(){
char p=getchar();int x=;
while(p<''||p>'')p=getchar();
while(p>=''&&p<='')x=x*+p-'',p=getchar();
return x;
}
void Add(int x,int y,int z){v[tot]=y,w[tot]=z,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y,int z){Add(x,y,z),Add(y,x,);}
int insert(int l,int r,int pos,int num){
pos=++cnt;
if(l==r){add(cnt,T,);return pos;}
int mid=(l+r)>>;
if(mid<num)add(pos,rson[pos]=insert(mid+,r,rson[pos],num),inf);
else add(pos,lson[pos]=insert(l,mid,lson[pos],num),inf);
return pos;
}
int merge(int l,int r,int pos,int last){
if(pos*last==)return pos+last;
int now=++cnt,mid=(l+r)>>;
if(l==r){add(now,pos,inf),add(now,last,inf);return now;}
add(now,lson[now]=merge(l,mid,lson[pos],lson[last]),inf);
add(now,rson[now]=merge(mid+,r,rson[pos],rson[last]),inf);
return now;
}
void dfs(int x){
for(int i=;i<vec[x].size();i++)
dfs(vec[x][i]),root[x]=merge(,n,root[x],root[vec[x][i]]);
}
void query(int l,int r,int pos,int L,int R){
if(!pos)return;
if(l>=L&&r<=R){add(cnt,pos,inf);return;}
int mid=(l+r)>>;
if(mid<L)query(mid+,r,rson[pos],L,R);
else if(mid>=R)query(l,mid,lson[pos],L,R);
else query(l,mid,lson[pos],L,R),query(mid+,r,rson[pos],L,R);
}
bool tell(){
memset(vis,-,sizeof(vis));
queue<int>q;q.push(S),vis[S]=;
while(!q.empty()){
int t=q.front();q.pop();
for(int i=first[t];~i;i=next[i])
if(vis[v[i]]==-&&w[i])vis[v[i]]=vis[t]+,q.push(v[i]);
}return ~vis[T];
}
int zeng(int x,int y){
if(x==T)return y;
int r=;
for(int i=first[x];~i;i=next[i])if(vis[v[i]]==vis[x]+&&w[i]){
int t=zeng(v[i],min(w[i],y-r));
w[i]-=t,w[i^]+=t,r+=t;
}if(!r)vis[x]=-;
return r;
}
int flow(){int ans=;while(tell())while(jy=zeng(S,inf))ans+=jy;return ans;}
int main(){
memset(first,-,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)vec[read()].push_back(i);
for(int i=;i<=n;i++)root[i]=insert(,n,root[i],read());
dfs();
for(int i=;i<=m;i++){
int l=read(),r=read(),x=read(),y=read();
cnt++,add(S,cnt,y),query(,n,root[x],l,r);
}
printf("%d\n",flow());
}
BZOJ 3681 线段树合并+网络流的更多相关文章
- BZOJ 4756 线段树合并(线段树)
思路: 1.最裸的线段树合并 2. 我们可以观察到子树求一个东西 那我们直接DFS序好了 入队的时候统计一下有多少比他大的 出的时候统计一下 减一下 搞定~ 线段树合并代码: //By SiriusR ...
- 【BZOJ-3681】Arietta 网络流 + 线段树合并
3681: Arietta Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 182 Solved: 70[Submit][Status][Discuss ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- BZOJ.4399.魔法少女LJJ(线段树合并)
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...
- BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...
- BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)
BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...
- BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)
BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...
- BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)
LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...
- BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)
标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...
随机推荐
- CAD保存高版本的dwg(com接口)
主要用到函数说明: MxDrawXCustomFunction::Mx_SaveDwgEx 保存DWG文件,可以设置保存的文件版本号和密码,详细说明如下: 参数 说明 IN CString sFile ...
- drf07 过滤 排序 分页 异常处理 自动生成接口文档
4. 过滤Filtering 对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持. pip install django-filter 在配置文件sett ...
- [HZOJ10420]计算
[HZOJ10420]计算 题目 给定一个数列,第i个位置包含两个数ai,bi 每次询问给出x,y 求数列ai*x+bi*y的最大值 输入所有数为自然数,在int范围内 INPUT 第一行为n,m.n ...
- noip模拟赛 党
分析:一道非常恶心的dp题.每个人要么选或不选,很像是0-1背包,可以套用背包问题的状态,但是因为题目要求3个值,所以可以再加一维表示3个答案. f[i][j][k][l][p][0/1/2]表示i个 ...
- BZOJ——T 2097: [Usaco2010 Dec]Exercise 奶牛健美操
http://www.lydsy.com/JudgeOnline/problem.php?id=2097 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- cogs 1310. [HAOI2006]聪明的猴子
1310. [HAOI2006]聪明的猴子 ★ 输入文件:monkey.in 输出文件:monkey.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 在一个热带 ...
- Java重载和覆盖
重写 Overriding 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding) 1.参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载. 2.返 ...
- supervisord进程管理工具小结
前言 昨天临近下班,发现业务队列处理不及时,正好想到不久之前,上了一个新功能:通过队列异步转发微信消息.可能是消息太多了处理不过来,没怎么多想,处理不过来了,多增加处理进程就可以了,后来发现自己so ...
- iOS: 在Swift中优雅的实现Substring
在Swift中,当我们想要截取某个字符串时,方法如下: let carNumber = "沪A12345" let startIndex = advance(userCar.car ...
- Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例
今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...