[BZOJ3636]教义问答手册

2024-03-16 23:08
文章标签 问答 手册 教义 bzoj3636

本文主要是介绍[BZOJ3636]教义问答手册,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

教义问答手册

题解

挺简单的一道二分。

首先看到题目首先应该很容易想到dp,毕竟用dp求这个最大值应该是很简单的。
但是由于询问太多,我们不可能对每个询问都做一次dp,考虑整体二分。
对于二分时,我们处理掉所有当前的过 m i d mid mid的询问。
可以通过分别求出左边的dp值与右边的dp值来计算。
由于涉及到合并的问题,我们的状态 d p i , j dp_{i,j} dpi,j分别要记录它到了哪个点与它在 m i d mid mid处连续选的点的数量,表示选到第 i i i个点, m i d mid mid处连续选了 j j j个,时的最大值。
合并的时候只需要从 0 0 0 L L L枚举两边的dp来合并即可。
dp转移也就是一个很常见方法, d p i , j = m a x ( d p i − 1 , j , d p i − L , j + ∑ j = i − L + 1 i a j ) dp_{i,j}=max(dp_{i-1,j},dp_{i-L,j}+\sum_{j=i-L+1}^{i}a_{j}) dpi,j=max(dpi1,j,dpiL,j+j=iL+1iaj)
后面的求和可以用前缀和预处理出来。
注意由于要求前面与后面两段,要做两次dp

总时间复杂度为 O ( ( n + q ) L l o g n ) O\left((n+q)Llog\, n\right) O((n+q)Llogn),还是可以过的。

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
#define MAXN 100005
#define lowbit(x) (x&-x)
#define reg register
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> pii;
const int mo=1e9+7;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
int n,L,q,a[MAXN],b[MAXN],c[MAXN],d[MAXN],pre[MAXN],suf[MAXN];
int f[MAXN][55],g[MAXN][55],sum[MAXN],ans[MAXN];
struct ming{int l,r;}s[MAXN];
void sakura(int l,int r,int al,int ar){int mid=l+r>>1;if(al>ar)return ;if(r-l+1<L){for(int i=al;i<=ar;i++)ans[b[i]]=0;return ;}if(l==r){for(int i=al;i<=ar;i++)ans[b[i]]=max(a[l],0);return ;}for(int i=0;i<=L;i++)f[mid][i]=sum[mid]-sum[mid-i];for(int i=mid-1;i>=l;i--)for(int j=0;j<=L;j++)if(i+L-1>mid-j)f[i][j]=f[i+1][j];else f[i][j]=max(f[i+1][j],f[i+L][j]+pre[i]);for(int i=mid;i>=max(mid-L+1,l);i--)for(int j=mid-i+2;j<=L;j++)f[i][j]=-INF;for(int i=0;i<=L;i++)g[mid+1][i]=sum[mid+i]-sum[mid];for(int i=mid+2;i<=r;i++)for(int j=0;j<=L;j++)if(i-L+1<=mid+j)g[i][j]=g[i-1][j];else g[i][j]=max(g[i-1][j],g[i-L][j]+suf[i]);for(int i=mid+1;i<=min(mid+L,r);i++)for(int j=i-mid+1;j<=L;j++)g[i][j]=-INF;for(int i=al;i<=ar;i++)if(s[b[i]].l<=mid&&mid<s[b[i]].r){int tmp=max(0,f[s[b[i]].l][0]+g[s[b[i]].r][0]);	for(int k=0;k<=L;k++)tmp=max(f[s[b[i]].l][k]+g[s[b[i]].r][L-k],tmp);ans[b[i]]=max(tmp,f[s[b[i]].l][L]+g[s[b[i]].r][L]);}int j=0,k=0;for(int i=al;i<=ar;i++){if(s[b[i]].r<=mid)c[++j]=b[i];if(s[b[i]].l>mid)d[++k]=b[i];}for(int i=al;i<al+j;i++)b[i]=c[i-al+1],c[i-al+1]=0;for(int i=ar;i>ar-k;i--)b[i]=d[ar-i+1],d[ar-i+1]=0;for(int i=l;i<=r;i++)for(int j=0;j<=L;j++)f[i][j]=g[i][j]=0;sakura(l,mid,al,al+j-1);sakura(mid+1,r,ar-k+1,ar);
}
signed main(){read(n);read(L);for(int i=1;i<=n;i++)read(a[i]),sum[i]=sum[i-1]+a[i];for(int i=1;i<=n;i++)pre[i]=sum[i+L-1]-sum[i-1],suf[i]=sum[i]-sum[i-L];read(q);for(int i=1;i<=q;i++)read(s[i].l),read(s[i].r),b[i]=i;sakura(1,n,1,q);for(int i=1;i<=q;i++)printf("%d\n",ans[i]);return 0;
}

谢谢!!!

这篇关于[BZOJ3636]教义问答手册的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817024

相关文章

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

linux dlopen手册翻译

名称 dlclose, dlopen, dlmopen 打开和关闭一个共享对象 简介 #include <dlfcn.h>void *dlopen(const char*filename, int flags);int dlclose(void *handle);#define _GNU_SOURCE#include <dlfcn.h>void *dlmoopen(Lmid_t lm

Git命令文本手册

git init # 初始化本地git仓库(创建新仓库)git config --global user.name "xxx" # 配置用户名git config --global user.email "xxx@xxx.com"

SMIDI-SAP接口配置手册

目录 一、 SAPERP相关接口配置(必要条件) 1. SAP ERP 配置 1.1 配置

五一假期出行必备的高科技手册

今天小编看了眼朋友圈,发现无节操的同学真是太多了,你们出去玩就好了,为啥要发图呢……各种晒,简直要虐死上班狗啊。 不过掐指一算,小编期盼已久的五一马上就要来了。抱着拯救同样期待假期出行同胞们的想法,小编给大家准备了一份出行旅游必备的高科技手册,助大家防火防水防(yi)搭(yue)讪( pao),下面将会开启高(zhuang)冷(BI)模式,如有雷同,纯属故意。 攻略篇 攻略在手,说走就走。

合宙Air780E硬件设计手册02

上文文主要介绍了Air780E的硬件设计中的的应用接口部分。 上文链接:Air780E低功耗4G模组硬件设计手册01-CSDN博客 在本文我们会继续介绍Air780E的硬件设计介绍。  二、应用接口 2.10  SIM卡接口 Air780E支持2路SIM卡接口,支持ETSI和IMT-2000卡规范,支持1.8V和3.0VUSIM卡。 以满足双SIM 卡切换的需求。 2.10.1. S

Java Spring Boot 项目中的密码加密与验证开发案例手册

本手册主要针对Java项目中的账号密码加密与验证进行详细的步骤讲解和代码示例。适用于开发登录认证、用户管理等功能的场景。文档包含工具类的创建、数据库配置、服务层和控制器层的集成等常见操作。 1. 常用加密操作 在实现安全的登录功能时,密码加密与验证是不可或缺的一部分。常用的加密流程如下: 1.1 密码加密 在用户注册或修改密码时,应该对密码进行加密。常用的加密方法有: MD5:已不建议使

jmeter压力测试,通过LLM利用RAG实现知识库问答,NEO4J部署,GraphRAG以知识图谱在查询时增强提示实现更准确的知识库问答(9/7)

前言         这周也是杂七杂八的一天(高情商:我是一块砖,哪里需要往哪里搬),首先是接触了jemter这个压力测试工具,然后帮公司的AIGC项目编写使用手册和问答手册的第一版,并通过这个平台的智能体实现知识库问答的功能展示,以及部分个人扩展和思考(NEO4J创建知识图谱的GraphRAG)。 Jmeter         Jmeter是一个压力测试工具,一开始导师叫我熟悉的时候我还说

Makefile问答之02 预处理器与宏

GCC Makefile中,怎样设定预处理器名称 在 GCC 的 Makefile 中,预处理器(preprocessor)的名称通常是 cpp(C PreProcessor),但在实际的 Makefile 中,我们一般是通过 gcc 命令来调用预处理器,而不是直接调用 cpp。不过,你可以通过设置 CPP 变量来显式指定预处理器名称和选项。以下是如何在 Makefile 中进行设置和使用的

一键部署Phi 3.5 mini+vision!多模态阅读基准数据集MRR-Benchmark上线,含550个问答对

小模型又又又卷起来了!微软开源三连发!一口气发布了 Phi 3.5 针对不同任务的 3 个模型,并在多个基准上超越了其他同类模型。 其中 Phi-3.5-mini-instruct 专为内存或算力受限的设备推出,小参数也能展现出强大的推理能力,代码生成、多语言理解等任务信手拈来。而 Phi-3.5-vision-instruct 则是多模态领域的翘楚,能同时处理文本和视觉信息,图像理解、视频摘要