参考ExtremeSpanningTrees,考虑优化整体二分时求$g_{i}\in \{w_{mid},w_{mid+1}\}$的最优解

首先题目有一个条件似乎没有写出来,是保证$l\le k\le r$的(但并不是特别重要,可能更方便)

可以发现只关心于$k$属于当前考虑的点集中的询问即可,因此每一次层的限制数为$o(m)$(可以通过上面的条件,将区间求并后优化为$o(n)$个)

考虑用线段树来优化建图,具体来说,分为以下几步:

1.将点以及区间离散到点个数长度的区间,来保证复杂度;

2.建两颗线段树,左边的线段树从儿子到父亲,右边的线段树从父亲到儿子(流量inf)

3.每一个点连向左边对应的叶子,右边的叶子连向对应的点,根据权值划分到$S$和$T$

4.对于初始$k$到$[l,r]$的边,对应为$k$在左边的叶子连向右边$[l,r]$对应的log个区间,反之类似

理论时间复杂度为$o(n^{3}\log^{2}n)$,可以通过

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 5005
4 #define ll long long
5 #define oo 0x3f3f3f3f
6 #define vi vector<int>
7 #define L (k<<1)
8 #define R (L+1)
9 struct ji{
10 int nex,to,len;
11 }edge[N<<5];
12 queue<int>q;
13 int n,m,p,l,r,k,lx[N][2],rx[N][2],w[N],v[N],a[N],ans[N];
14 int V,E,leaf[N],head[N<<4],work[N<<4],d[N<<4],vis[N<<4],bl[N];
15 bool cmp(int x,int y){
16 return (bl[x]<bl[y])||(bl[x]==bl[y])&&(x<y);
17 }
18 void add(int x,int y,int z){
19 edge[E].nex=head[x];
20 edge[E].to=y;
21 edge[E].len=z;
22 head[x]=E++;
23 if (E&1)add(y,x,0);
24 }
25 bool bfs(){
26 memset(d,oo,sizeof(d));
27 d[0]=0;
28 q.push(0);
29 while (!q.empty()){
30 int k=q.front();
31 q.pop();
32 for(int i=head[k];i!=-1;i=edge[i].nex)
33 if ((edge[i].len)&&(d[edge[i].to]==oo)){
34 d[edge[i].to]=d[k]+1;
35 q.push(edge[i].to);
36 }
37 }
38 return d[(V<<1)+n+1]<oo;
39 }
40 int dfs(int k,int s){
41 if (k>(V<<1)+n)return s;
42 for(int &i=work[k];i!=-1;i=edge[i].nex)
43 if ((edge[i].len)&&(d[edge[i].to]==d[k]+1)){
44 int p=dfs(edge[i].to,min(s,edge[i].len));
45 if (p){
46 edge[i].len-=p;
47 edge[i^1].len+=p;
48 return p;
49 }
50 }
51 return 0;
52 }
53 void dinic(){
54 while (bfs()){
55 memcpy(work,head,sizeof(work));
56 while (dfs(0,oo));
57 }
58 }
59 void dfs(int k){
60 if (vis[k])return;
61 vis[k]=1;
62 for(int i=head[k];i!=-1;i=edge[i].nex)
63 if (edge[i].len)dfs(edge[i].to);
64 }
65 void build(int k,int l,int r){
66 if (l==r){
67 leaf[l]=k;
68 V=max(V,k);
69 return;
70 }
71 int mid=(l+r>>1);
72 build(L,l,mid);
73 build(R,mid+1,r);
74 }
75 void update(int k,int l,int r,int x,int y,int z,int p){
76 if ((l>y)||(x>r))return;
77 if ((x<=l)&&(r<=y)){
78 if (p)add(k,z+V,oo);
79 else add(z,k+V,oo);
80 return;
81 }
82 int mid=(l+r>>1);
83 update(L,l,mid,x,y,z,p);
84 update(R,mid+1,r,x,y,z,p);
85 }
86 void dfs(int l,int r,int x,int y){
87 if (x==y){
88 for(int i=l;i<=r;i++)ans[a[i]]=v[x];
89 return;
90 }
91 int mid=(x+y>>1);
92 V=E=0;
93 build(1,1,r-l+1);
94 for(int i=0;i<=(V<<1)+n+1;i++)head[i]=-1;
95 for(int i=2;i<=V;i++){
96 add(i,i/2,oo);
97 add(i/2+V,i+V,oo);
98 }
99 for(int i=l;i<=r;i++){//若i比j小则i向j连边,源点连大的,汇点连小的
100 add((V<<1)+i,leaf[i-l+1],oo);
101 add(leaf[i-l+1]+V,(V<<1)+i,oo);
102 if (w[a[i]]>=v[mid+1])add(0,(V<<1)+i,1);
103 else add((V<<1)+i,(V<<1)+n+1,1);
104 }
105 for(int i=l;i<=r;i++)
106 for(int j=0;j<2;j++){
107 int x=lx[a[i]][j],y=rx[a[i]][j];
108 int wx=lower_bound(a+l,a+r+1,x)-a-l+1,wy=upper_bound(a+l,a+r+1,y)-a-l;
109 if (wx<wy)update(1,1,r-l+1,wx,wy,leaf[i-l+1],j);
110 }
111 dinic();
112 for(int i=0;i<=(V<<1)+n+1;i++)vis[i]=0;
113 dfs(0);
114 for(int i=l;i<=r;i++){
115 if ((w[a[i]]>=v[mid+1])&&(vis[leaf[i-l+1]])||(w[a[i]]<v[mid+1])&&(vis[leaf[i-l+1]+V]))bl[a[i]]=1;
116 else bl[a[i]]=0;
117 }
118 sort(a+l,a+r+1,cmp);
119 for(int i=l;i<=r+1;i++){
120 if ((bl[a[i]])||(i>r)){
121 if (l<i)dfs(l,i-1,x,mid);
122 if (i<=r)dfs(i,r,mid+1,y);
123 return;
124 }
125 }
126 }
127 int main(){
128 scanf("%d%d",&n,&m);
129 for(int i=1;i<=n;i++)scanf("%d",&w[i]);
130 for(int i=1;i<=n;i++)
131 for(int j=0;j<2;j++)lx[i][j]=rx[i][j]=i;
132 for(int i=1;i<=m;i++){
133 scanf("%d%d%d%d",&p,&l,&r,&k);
134 lx[k][p]=min(lx[k][p],l);
135 rx[k][p]=max(rx[k][p],r);
136 }
137 memcpy(v,w,sizeof(v));
138 sort(v+1,v+n+1);
139 int nn=unique(v+1,v+n+1)-v-1;
140 for(int i=1;i<=n;i++)a[i]=i;
141 dfs(1,n,1,nn);
142 long long sum=0;
143 for(int i=1;i<=n;i++)sum+=abs(ans[i]-w[i]);
144 for(int i=1;i<=n;i++){
145 for(int j=lx[i][0];j<=rx[i][0];j++)assert(ans[j]>=ans[i]);
146 for(int j=lx[i][1];j<=rx[i][1];j++)assert(ans[j]<=ans[i]);
147 }
148 printf("%lld",sum);
149 }

[loj6518]序列的更多相关文章

  1. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

  2. Windows10-UWP中设备序列显示不同XAML的三种方式[3]

    阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...

  3. 软件工程里的UML序列图的概念和总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...

  4. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  5. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  6. 最长不下降序列nlogn算法

    显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...

  7. [LeetCode] Sequence Reconstruction 序列重建

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  8. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  9. [LeetCode] Repeated DNA Sequences 求重复的DNA序列

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

随机推荐

  1. JavaScript数组 几个常用方法

    前言 数组方法有太多了,本文记录一些本人容易记错的一些数组方法,用于巩固及复习. 后续会慢慢的将其他数组方法添加进来. 善用数组方法可以使数据处理变的优雅且简单. 那下面让我们开始吧: filter( ...

  2. react之组建通信

    父组件与子组件通信 父组件将自己的状态传递给子组件,子组件当做属性来接收,当父组件更改自己状态的时候,子组件接收到的属性就会发生改变 父组件利用ref对子组件做标记,通过调用子组件的方法以更改子组件的 ...

  3. 洛谷4219 BJOI2014大融合(LCT维护子树信息)

    QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...

  4. 北鲲云超算如何让仿真技术、HPC和人工智能之间的深度融合?

    在CAE领域,随着仿真技术在多个行业的深度应用,也带来了仿真模型日益复杂.仿真过程数据倍增.仿真计算费用昂贵等问题,降阶模型.人工智能.云计算等多种技术和仿真技术的深度融合,成为了仿真技术的重要发展趋 ...

  5. C#开发BIMFACE系列48 Nginx部署并加载离线数据包

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列47 IIS部署并加载离线数据包>中详细介绍了IIS部署并访问的完整步 ...

  6. Java和jmeter环境变量的配置来这就对了!

    java环境变量设置 1.新建JAVA_HOME 变量 点击 新建按钮 变量名:JAVA_HOME 变量值:电脑上JDK安装的绝对路径 2.新建/修改 CLASSPATH 变量 如果存在 CLASSP ...

  7. 【原创】浅谈指针(五)const和指针

    前言 过了几个月再次更新.最近时间也不多了,快要期中考试了,暂且先少写一点吧. 本文仅在博客园发布,如在其他平台发现均为盗取,请自觉支持正版. 练习题 我们先来看几道题目.如果这几道题都不会的话,就先 ...

  8. 【Java虚拟机11】线程上下文类加载器

    前言 目前学习到的类加载的知识,都是基于[双亲委托机制]的.那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗? 答案是否定的. JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载 ...

  9. csp总结 (差点爆零的总结)

    T1,iterator忘了怎么写了,想了很久都想不出来有什么可以替代,只好O(n^2): T2,不会,只会打暴力 T3,自以为是正解,写了很久大概3h,却一直过不了大样例,大样例输出全是0: T4,不 ...

  10. cadence 技巧

    pcb中如何选中完整的一条网络? 1 edit  properties  右边 find nets 2 cadence 选中不同的网络高亮 display--->assign color在opt ...