YBTOJ:工作评估(分块)

解析

首先想想 O(nm)O(nm)O(nm) 怎么做。
从左往右扫,不断把当前值和 x0x_0x0max⁡\maxmax 即可。

考虑正解:
f(l,r,w)f(l,r,w)f(l,r,w) 为初始为 www,工作区间为 (l,r)(l,r)(l,r) 结束后的价值,s(l,r)=∑i=lrais(l,r)=\sum_{i=l}^ra_is(l,r)=i=lrai
那么就有:
f(l,r,w)=min⁡(f(l,r,inf),w+s(l,r))f(l,r,w)=\min(f(l,r,inf),w+s(l,r))f(l,r,w)=min(f(l,r,inf),w+s(l,r))
如果一直没有碰到,显然就是 w+s(l,r)w+s(l,r)w+s(l,r)
否则就会和 f(l,r,inf)f(l,r,inf)f(l,r,inf) 相同。考虑反证:最终结果不同,那么最后触顶位置必然不同。设两个过程 A,BA,BA,B 最后触顶位置分别为 x,y(x<y)x,y(x<y)x,y(x<y) 那么 BBB 必然在 xxx 处没有触顶(否则 A、BA、BAB 以后就一样了),那么在 xxx 处就有 A>BA>BA>B,那么以后必然始终有 A≥BA\ge BAB。然而后来到 yyy 的地方 BBB 触顶而 AAA 没有,有了 A<BA<BA<B,矛盾。

分块后,我们可以块内暴力计算出所有区间的 f(l,r,inf),s(l,r)f(l,r,inf),s(l,r)f(l,r,inf),s(l,r)
注意到,如果某个区间的两个特征值都不超过另一个区间,那么其必然是无用的。所以我们可以去掉所有无用区间,只剩下 s,fs,fs,f 反向单调的一些区间。

如果两端点在块内,我们就可以在块内的这些区间中二分找到 f+w,sf+w,sf+w,s 大小关系改变的分界点,那么最大值必然是分界点两侧的区间之一。

对于跨块的情况,我们采用和 O(nm)O(nm)O(nm) 暴力类似的思想,一块一块扫,尝试维护当前的最大值。
可以分为以下3种情况:

  1. 从左侧块外开始,到块内结束。
  2. 从左侧块外开始,延伸到右侧块外。
  3. 从块内开始,延伸到右侧块外。

采用和块内类似的思想,分别再对每一个块处理出所有有用的前缀区间、后缀区间即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=1e5+100;
const int B=500;
const int inf=1e9;int n,m,w;
int bel[N],st[B],ed[B],tot;
int a[N],lim[N],sum[N];
struct node{int s,g;bool operator < (const node oth)const{if(s!=oth.s) return s<oth.s;else return g<oth.g;}
};
node pre[B][B],suf[B][B],c[B][N];
int num_pre[B],num_suf[B],num_c[B];
int s[B],g[B];
void init_block(){w=sqrt(n);tot=(n+w-1)/w;for(int i=1;i<=n;i++) bel[i]=(i+w-1)/w;for(int i=1;i<=tot;i++) st[i]=(i-1)*w+1,ed[i]=min(n,i*w);return;
}
node tmp[N];
int calc(node *x,int num){for(int i=1;i<=num;i++) tmp[i]=x[i];sort(tmp+1,tmp+1+num);int top(0);for(int i=1;i<=num;i++){while(top&&x[top].g<=tmp[i].g) --top;x[++top]=tmp[i];}return top;
}void solve(int k){int num(0),num1(0),num2(0);for(int l=st[k];l<=ed[k];l++){int now=inf,ss(0);for(int r=l;r<=ed[k];r++){now=min(lim[r],now+a[r]);ss+=a[r];c[k][++num]=(node){ss,now};if(l==st[k]) pre[k][++num1]=(node){ss,now};if(r==ed[k]) suf[k][++num2]=(node){ss,now};if(l==st[k]&&r==ed[k]) s[k]=ss,g[k]=now;}}num_c[k]=calc(c[k],num);num_pre[k]=calc(pre[k],num1);num_suf[k]=calc(suf[k],num2);
}
void init(){init_block();for(int i=1;i<=tot;i++) solve(i);
}
int find(node *x,int num,int w){int st=1,ed=num;while(st<ed){int mid=(st+ed+1)>>1;if(x[mid].s+w<=x[mid].g) st=mid;else ed=mid-1;}int ans=min(x[st].s+w,x[st].g);if(st<num){++st;ans=max(ans,min(x[st].s+w,x[st].g));}return ans;
}signed main(){
#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);
#endifn=read();m=read();for(int i=1;i<=n;i++) a[i]=read(),sum[i]=sum[i-1]+a[i];for(int i=1;i<=n;i++) lim[i]=read();init();while(m--){int l=read(),r=read(),w=read();int x=bel[l],y=bel[r],cur=w,ans(0);if(x==y){for(int i=l;i<=r;i++){cur=max(w,min(lim[i],cur+a[i]));ans=max(ans,cur);}printf("%d\n",ans);}else{for(int i=l;i<=ed[x];i++){cur=max(w,min(lim[i],cur+a[i]));ans=max(ans,cur);}for(int i=x+1;i<y;i++){ans=max(ans,find(c[i],num_c[i],w));ans=max(ans,find(pre[i],num_pre[i],cur));cur=max(w,max(min(cur+s[i],g[i]),find(suf[i],num_suf[i],w)));ans=max(ans,cur);}for(int i=st[y];i<=r;i++){cur=max(w,min(lim[i],cur+a[i]));ans=max(ans,cur);}printf("%d\n",ans);}}return 0;
}
/*
58 14 5762*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑客(续) (压位高精+状压dp)

黑客&#xff08;续&#xff09;descriptionsolutioncodedescription 【问题描述】 在破解了世界首富 Bychaha 的银行账户后&#xff0c;知名黑客 pks 发现&#xff0c;要得到 Bychaha 的全部财产&#xff0c;必须再破解一道密码。 作为客户账户安全的最后一道防线&#xff0…

东莞.NET俱乐部线下技术沙龙-活动报名

自广州.NET技术俱乐部在2018年12月08日线下活动顺利开展后&#xff0c;东莞作为兄弟城市&#xff0c;也想通过线下活动的方式&#xff0c;点燃东莞.NET技术的熊熊之火。现决定先借助广州、深圳兄弟城市的帮助下&#xff0c;开展一场东莞方主办的线下活动&#xff0c;聚集东莞本…

Acwing 1084. 数字游戏 II

Acwing 1084. 数字游戏 II 题意&#xff1a; 指定一个整数闭区间 [a.b]&#xff0c;问这个区间内有多少个取模数。 取模数&#xff1a;这种数字必须满足各位数字之和 mod N 为 0。 题解&#xff1a; 数位dp 这里不细讲数位dp了&#xff0c;可以看看 Acwing 1081. 度的数量&…

ybtoj洛谷P3268:圆的异或并(扫描线)

解析 很神奇的一道题。 关键条件&#xff1a;任意两个圆无交。 把一个圆分成上下两个圆弧&#xff0c;那么所有圆弧的高度关系不会发生变化。 所以可以开一个 set&#xff0c;维护一个从左往右扫的扫描线&#xff0c;按照当前扫描线的横坐标定义比较符号&#xff0c;在圆的最…

如何撰写较受欢迎的技术文章

本来我这篇文章的标题是 “如何撰写受欢迎的技术文章”&#xff0c;但反复斟酌之下&#xff0c;还是加了一个“较”字&#xff0c;这主要是考虑我不是什么知名作者&#xff0c;写的文章大多也谈不上很受欢迎&#xff0c;贸然地谈“受欢迎” 是有点忐忑的&#xff0c;而改成现在…

朝鲜时蔬(分数据点写算法+毒瘤数学)

朝鲜时蔬decriptionsolutioncodedecription 对于一个有穷非空正整数集合S{x1,x2,x3,...,xn}⊂N(n≥1)S\{x_1,x_2,x_3,...,x_n\}\subset N^(n\ge 1)S{x1​,x2​,x3​,...,xn​}⊂N(n≥1)&#xff0c;定义其和sum(S)sum(S)sum(S)为所有元素的和 sum(S)x1...xnsum(S)x_1...x_nsum…

洛谷P7515:矩阵游戏(差分约束)

解析 如果没有元素均要在 [0,1e6][0,1e6][0,1e6] 的条件&#xff0c;可以很容易的构造出一个合法解。 那么我们就要通过调整得到的解&#xff0c;使所有数都在合法范围内。 注意到&#xff0c;每次给某一行/列依次1,-1,1,-1…这样仍然符合要求。 让每一行/列错开&#xff0c;…

Recursive sequence HDU - 5950

Recursive sequence HDU - 5950 题意&#xff1a; 给你一个式子&#xff1a;f[n]2f[n-2]f[n-1]n4 给你f[1]和f[2]&#xff0c;给你一个n&#xff0c;求f[n] f[1],f[2],n<231 题解&#xff1a; 很明显&#xff0c;矩阵快速幂&#xff0c;但是太久没做这种题&#xff0c;我…

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

今天&#xff0c;Visual Studio中没有内置工具来测试WEB API。使用浏览器&#xff0c;只能测试http GET请求。您需要使用Postman&#xff0c;SoapUI&#xff0c;Fiddler或Swagger等第三方工具来执行WEB API的完整测试。在ASP.NET Core 2.2中&#xff0c;引入了一个名为“http-r…

洛谷P7518:宝石(倍增、可撤销并查集)

解析 算法一 定义 upx,kup_{x,k}upx,k​ 为节点 xxx 从自己的颜色所在位置在返祖链上往后跳 2k2^k2k 个颜色到达的节点。 可以像倍增一样的求解。 这样对于一次询问 (s,t)(s,t)(s,t) 我们就能求出 (s,lca)(s,lca)(s,lca) 这一段能取到哪里了。 对于向下的情况&#xff0c;再处…

E - Counting Cliques HDU - 5952

E - Counting Cliques HDU - 5952 题意&#xff1a; 给你n个点&#xff0c;m个边&#xff0c;还有一个s&#xff0c;问这个图中有多少个等于s的点集可以组成一个完全图 题解&#xff1a; 这题。。直接暴力搜索就行 分析复杂度的时候&#xff0c;应该考虑只有1000条边&#…

Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

本篇教程主要讲解基于容器服务搭建TeamCity服务&#xff0c;并且完成内部项目的CI流程配置。教程中也分享了一个简单的CI、CD流程&#xff0c;仅作探讨。不过由于篇幅有限&#xff0c;完整的DevOps&#xff0c;我们后续独立探讨。 为了降低容器的使用门槛以及便于大家将容器技…

2021牛客NOIP提高组第二场T2——方格计数(组合数计数)

方格计数descriptionsolutioncodedescription 在左下角是 (&#x1d7ce;, &#x1d7ce;)&#xff0c;右上角是 (W, H)的网格上&#xff0c;有 (W 1) (H 1) 个格点。 现在要在格点上找 N个不同的点&#xff0c;使得这些点在一条直线上。并且在这条直线上&#xff0c; 相邻…

Acwing 1085. 不要62

Acwing 1085. 不要62 题意&#xff1a; 问[n,m]这些数中有多少数不包含4&#xff0c;且不包含连续的62 题解&#xff1a; 经典数位dp&#xff0c;分析过程以前的数位dp博客有写 Acwing 1082. 数字游戏 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) …

ybtoj洛谷P4406三角形面积并(扫描线)

解析 暴力求出所有三角形之间的所有交点&#xff0c;提出所有的横坐标。 然后任意两个相邻的横坐标之间的面积都是若干个梯形。 那么就可以求出对于每一个横坐标截得的三角形长度的并的和&#xff0c;然后加在一起乘高除以二即可。 在这里插入代码片#include<bits/stdc.h&…

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj&#xff0c;不过全过程是手工进行的&#xff0c;而且到最后处理 XAML 问题也非常头疼。现在&#xff0c;我们可以利用工具自动地完成这个过程。…

[NowCoder牛客]2021NOIP提高组模拟赛第二场T3——树数树(启发式合并堆)

树数树descriptionsolutioncodedescription 【题目描述】 牛牛有一棵 n 个点的有根树&#xff0c;根为 1。 我们称一个长度为 m 的序列 a 是好的&#xff0c;当且仅当&#xff1a; • ∀&#x1d456;∈(1,&#x1d45a;]∀&#x1d456;∈(1, &#x1d45a;]∀i∈(1,m]&#…

Acwing1086. 恨7不成妻(未解决)

Acwing1086. 恨7不成妻 题意&#xff1a; 问一个区间内与7无关的整数的平方和 与7有关包括&#xff1a; 1.整数中某一位是 7&#xff1b; 2.整数的每一位加起来的和是 7 的整数倍&#xff1b; 3.这个整数是 7 的整数倍。 题解&#xff1a; 数位dp&#xff0c;有点难。。 这…

模板:拓展kmp(Z函数)

所谓拓展kmp&#xff0c;就是拓展的kmp &#xff08;逃&#xff09; 前言 小清新算法&#xff0c;更像一个trick。 exkmp能够在线性复杂度内求出字符串所有后缀与字符串本身的lcp。 个人感觉这个东西和kmp关系不大&#xff0c;反而有些像马拉车的思想。 之前学的东西&#xf…

牛客NOIP2021提高组OI赛前模拟赛第一场T3——与巨(数学)

与巨descriptionsolutioncodedescription 【题目描述】 定义无穷序列f:f11,fnfn−1∗21f:f_11,f_nf_{n-1}*21f:f1​1,fn​fn−1​∗21 定义函数G(x)min⁡fi≥x(fi)G(x)\min_{f_i\ge x}(f_i)G(x)minfi​≥x​(fi​) 定义dpc,00,dpc,imax⁡(dpc,i−1,[((i∗c)&G(i))i]∗i)…