当前位置: 首页 > news >正文

贪心找性质+dp表示+矩阵表示+线段树维护:CF573D

比较套路的题目

首先肯定贪心一波,两个都排序后尽量相连。我一开始猜最多跨1,但其实最多跨2,考虑3个人的情况:

在这里插入图片描述

我们发现第3个人没了,所以可以出现跨2的情况

然后直接上dp,由 i − 1 , i − 2 , i − 3 i-1,i-2,i-3 i1,i2,i3 转移过来。

然后这显然可以拿矩阵表示。

然后显然可以拿线段树维护。

后面三部分都是比较套路的。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//#define M
//#define mo
#define N 30010
int n, m, i, j, k, T;
int a[N], b[N], ia[N], ib[N], shu[N], pos[N], x, y, q, rt; int Not(int x, int y) { if(shu[ia[x]]!=ib[y]) return 1; return 0; }struct Martix {int c[3][3]; void mem() { memset(c, 0, sizeof(c)); }void init() { mem(); c[0][0]=c[1][1]=c[2][2]=1; }void min() { c[0][0]=c[0][1]=c[0][2]=c[1][0]=c[1][1]=c[1][2]=c[2][1]=c[2][2]=c[2][0]=-1e15;  }Martix operator *(const Martix A) const { //max+Martix B; B.min(); for(int i=0; i<3; ++i) for(int j=0; j<3; ++j) for(int k=0; k<3; ++k)  B.c[i][j]=max(B.c[i][j], c[i][k]+A.c[k][j]); return B; }void make(int x) {//生成在x位置的矩阵 min(); c[1][0]=c[2][1]=0; if(Not(x, x)) c[0][0]=a[x]*b[x]; 
//		if(x==1) return printf("# 1 : \n"), (*this).print(), void(); if(x==1) return ; if(Not(x, x-1) && Not(x-1, x)) c[0][1]=a[x]*b[x-1]+a[x-1]*b[x]; 
//		if(x==2) return printf("# 2: \n"), (*this).print(), void(); if(x==2) return ; if(Not(x, x-1) && Not(x-1, x-2) && Not(x-2, x)) c[0][2]=max(c[0][2], a[x]*b[x-1]+a[x-1]*b[x-2]+a[x-2]*b[x]); if(Not(x, x-2) && Not(x-1, x) && Not(x-2, x-1)) c[0][2]=max(c[0][2], a[x]*b[x-2]+a[x-1]*b[x]+a[x-2]*b[x-1]); if(Not(x, x-2) && Not(x-1, x-1) && Not(x-2, x)) c[0][2]=max(c[0][2], a[x]*b[x-2]+a[x-1]*b[x-1]+a[x-2]*b[x]); 
//		printf("# %lld : \n", x); (*this).print(); }int que() {
//		printf("RT : "); 
//		(*this).print(); Martix B; B.min(); B.c[0][0]=0; B=(*this)*B; return B.c[0][0]; }void print() {
		printf("---\n"); for(int i=0; i<3; ++i, printf("\n")) for(int j=0; j<3; ++j) printf("%lld ", c[i][j]); printf("\n"); }
};struct Segment_tree {int tot, ls[N<<2], rs[N<<2]; Martix s[N<<2]; void push_up(int k) { s[k]=s[rs[k]]*s[ls[k]]; }   //注意乘法顺序 void build(int &k, int l, int r) {if(!k) k=++tot; if(l==r) return s[k].make(l), void(); int mid=(l+r)>>1; build(ls[k], l, mid); build(rs[k], mid+1, r); push_up(k); }void modify(int k, int l, int r, int x) {if(l==r) return s[k].make(x), void(); int mid=(l+r)>>1; if(x<=mid) modify(ls[k], l, mid, x); else modify(rs[k], mid+1, r, x); push_up(k); 
//		printf("[%lld %lld] : \n", l, r); s[k].print(); }
}Seg;signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
//	srand(time(NULL));
//	T=read();
//	while(T--) {
//
//	}n=read(); q=read(); for(i=1; i<=n; ++i) a[i]=read(), ia[i]=i, shu[i]=i; //shu:第i个人马的编号 for(i=1; i<=n; ++i) b[i]=read(), ib[i]=i; sort(ia+1, ia+n+1, [] (int x, int y) { return a[x]>a[y]; }); sort(ib+1, ib+n+1, [] (int x, int y) { return b[x]>b[y]; }); sort(a+1, a+n+1); reverse(a+1, a+n+1); //按实力排好,则原顺序已经没必要了 sort(b+1, b+n+1); reverse(b+1, b+n+1); 
//	cout<<"ia : "; for(i=1; i<=n; ++i) printf("%lld ", ia[i]); puts(""); 
//	cout<<"ib : "; for(i=1; i<=n; ++i) printf("%lld ", ib[i]); puts(""); 
//	cout<<"a : "; for(i=1; i<=n; ++i) printf("%lld ", a[i]); puts(""); 
//	cout<<"b : "; for(i=1; i<=n; ++i) printf("%lld ", b[i]); puts(""); //ia, ib排序后排名第i对应的原编号 for(i=1; i<=n; ++i) pos[ia[i]]=i; //某编号对应的排名 
//	cout<<"pos : "; for(i=1; i<=n; ++i) printf("%lld ", pos[i]); puts(""); Seg.build(rt, 1, n); while(q--) {x=read(); y=read(); swap(shu[x], shu[y]);  //交换了马
//		cout<<"shu : "; for(i=1; i<=n; ++i) printf("%lld ", shu[i]); puts(""); for(i=max(1ll, pos[x]-3); i<=min(n, pos[x]+3); ++i) Seg.modify(1, 1, n, i); for(i=max(1ll, pos[y]-3); i<=min(n, pos[y]+3); ++i) Seg.modify(1, 1, n, i); printf("%lld\n", Seg.s[1].que()); }return 0;
}

相关文章:

贪心找性质+dp表示+矩阵表示+线段树维护:CF573D

比较套路的题目 首先肯定贪心一波&#xff0c;两个都排序后尽量相连。我一开始猜最多跨1&#xff0c;但其实最多跨2&#xff0c;考虑3个人的情况&#xff1a; 我们发现第3个人没了&#xff0c;所以可以出现跨2的情况 然后直接上dp&#xff0c;由 i − 1 , i − 2 , i − 3 i…...

小谈设计模式(17)—状态模式

小谈设计模式&#xff08;17&#xff09;—状态模式 专栏介绍专栏地址专栏介绍 状态模式关键角色上下文(Context)抽象状态(State)具体状态(Concrete State) 核心思想Java程序实现首先&#xff0c;我们定义一个抽象状态类 State&#xff0c;其中包含一个处理请求的方法 handleRe…...

Arm64体系架构-MPIDR_EL1寄存器

背景 在Arm64多核处理器中, 各核间的关系可能不同. 比如1个16 core的cpu, 每4个core划分为1个cluster,共享L2 cache. 当我们需要从core 0将任务调度出来时,如果优先选择core 1~3, 那么性能明显时优于其他core的. 那么操作系统怎么知道core之间这样的拓扑信息呢? Arm提供了MPID…...

MySQL支持哪些存储引擎

mysql支持九大存储引擎&#xff1a; 1&#xff09;MYISAM存储引擎&#xff08;优点&#xff1a;可被转换为压缩、只读表来节省空间。&#xff09; 它管理的表具有以下特征&#xff1a; 使用三个文件表示每个表 格式文件-存储表结构的定义&#xff08;mytable.frm) 数据文件-存…...

ElementUI结合Vue完成主页的CUD(增删改)表单验证

目录 一、CUD ( 1 ) CU讲述 ( 2 ) 编写 1. CU 2. 删除 二、验证 前端整合代码 : 一、CUD 以下的代码基于我博客中的代码进行续写 : 使用ElementUI结合Vue导航菜单和后台数据分页查询 ( 1 ) CU讲述 在CRUD操作中&#xff0c;CU代表创建&#xff08;Create&#xff09…...

Flutter开发笔记 —— 语音消息功能实现

前言 最近在开发一款即时通讯(IM)的聊天App&#xff0c;在实现语音消息功能模块后&#xff0c;写下该文章以做记录。 注&#xff1a;本文不提供相关图片资源以及IM聊天中具体实现代码&#xff0c;单论语音功能实现思路 需求分析 比起上来直接贴代码&#xff0c;我们先来逐步…...

冒泡排序和选择排序

目录 一、冒泡排序 1.冒泡排序的原理 2.实现冒泡排序 1.交换函数 2.单躺排序 3.冒泡排序实现 4.测试 5.升级冒泡排序 6.升级版代码 7.升级版测试 二、选择排序 1.选择排序的原理 2.实现选择排序 1.单躺排序 2.选择排序实现 3.测试 ​4.修改 5.测试 一、冒泡排序…...

【深度学习】UNIT-DDPM核心讲解

文章目录 大致介绍&#xff1a;扩散损失&#xff1a;转换损失&#xff1a;循环一致性损失&#xff1a;推理过程&#xff1a;优缺点&#xff1a; 参考文章&#xff1a; https://blog.csdn.net/ssshyeong/article/details/127210086 这篇文章对整个文章 UNIT-DDPM: UNpaired Imag…...

Java 线程的优先级

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…...

金融数学方法:牛顿法

目录 1.牛顿法1.1 牛顿法介绍1.2 算法步骤 2. 具体算例3.总结 1.牛顿法 1.1 牛顿法介绍 牛顿法&#xff08;Newton’s method&#xff09;&#xff0c;也被称为牛顿-拉夫森方法&#xff08;Newton-Raphson method&#xff09;&#xff0c;是一种用于数值逼近根的迭代方法。它是…...

MongoTemplate | 多条件查询

MongoTemplate查询 Resource private MongoTemplate mongoTemplate;public <T> List<T> getDataList(String param1, Long param2, Class<T> clazz) {// 构建queryQuery query constructQuery(param1, param2);// 查询return mongoTemplate.find(query, cl…...

优秀程序员是怎么思考的?

首发日更公 Z 号&#xff1a;十二又十三 作为一名优秀的程序员&#xff0c;思考是我们工作中最重要的一部分。它不仅能够帮助我们解决问题&#xff0c;还能够提升我们的技术水平和职业发展。那么&#xff0c;优秀程序员是如何思考的呢&#xff1f;本文将为您介绍一个思考框架和…...

【juc】countdownlatch实现游戏进度

目录 一、截图示例二、代码示例 一、截图示例 二、代码示例 package com.learning.countdownlatch;import java.util.Arrays; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurr…...

Spring Webflux HttpHandler源码整理

HttpHandler的构造 自动启动配置类&#xff1a;HttpHandlerAutoConfigurationBean public HttpHandler httpHandler(ObjectProvider<WebFluxProperties> propsProvider) {HttpHandler httpHandler WebHttpHandlerBuilder.applicationContext(this.applicationContext).…...

Qt扩展-Advanced-Docking 简介及配置

Advanced-Docking 简介及配置 一、概述二、项目结构三、安装配置四、代码测试 一、概述 Advanced-Docking 是类似QDockWidget 功能的多窗口停靠功能的库。很像visual stdio 的 停靠功能&#xff0c;这个库对于停靠使用的比较完善。很多的软件都使用了这个框架。 项目源地址&a…...

Decorator

Decorator 动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c; 由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b; 并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的组合&#xff…...

分布式文件系统HDFS(林子雨慕课课程)

文章目录 3. 分布式文件系统HDFS3.1 分布式文件系统HDFS简介3.2 HDFS相关概念3.3 HDFS的体系结构3.4 HDFS的存储原理3.5 HDFS数据读写3.5.1 HDFS的读数据过程3.5.2 HDFS的写数据过程 3.6 HDFS编程实战 3. 分布式文件系统HDFS 3.1 分布式文件系统HDFS简介 HDFS就是解决海量数据…...

CSS中:root伪类的使用

在CSS中&#xff0c;:root是一个伪类选择器&#xff0c;它选择的是文档树的根元素。在HTML文档中&#xff0c;这个根元素通常是<html>。:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。 例如&#xff0c;你可以使用:root来定义一个全局的字体大小&a…...

VulnHub JANGOW

提示&#xff08;主机ip分配问题&#xff09; 因为直接在VulnHub上下载的盒子&#xff0c;在VMware上打开&#xff0c;默认是不分配主机的 所以我们可以在VirtualBox上打开 一、信息收集 发现开放了21和80端口&#xff0c;查看一下80端口 80端口&#xff1a; 检查页面后发现…...

OpenMesh 获取网格面片各个顶点

文章目录 一、简介二、实现代码三、实现效果一、简介 OpenMesh中有很多循环器,这里便是其中一种面顶点循环器,以此来获得面片的各个顶点。 二、实现代码 #define _USE_MATH_DEFINES #include <iostream> #include <unordered_map>...

Zotero Duplicates Merger终极指南:3步告别文献重复困扰

Zotero Duplicates Merger终极指南&#xff1a;3步告别文献重复困扰 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 还在为Zotero文献库中堆积…...

基于Git与Markdown的文档即代码协作平台CORP实践指南

1. 项目概述&#xff1a;一个面向未来的开源协作平台 最近在开源社区里&#xff0c;一个名为“CORP”的项目引起了我的注意。这个项目全称是“CORP-md/CORP”&#xff0c;从名字上看&#xff0c;它似乎是一个与Markdown文档和协作相关的工具。作为一个长期在开源项目和团队协作…...

GIS制图必备:GlobalMapper 20制作1:100万标准图幅的完整指南与命名规则详解

GIS制图实战&#xff1a;GlobalMapper 20标准图幅生成与命名规范全解析 在测绘与地理信息行业&#xff0c;标准图幅不仅是数据管理的基石&#xff0c;更是跨部门协作的通用语言。当我们面对1:100万比例尺的地形图分幅时&#xff0c;每一个经纬网格的划分、每一组编号的生成&…...

短视频矩阵运营方法论——不同平台多账号协同的底层逻辑与避坑指南

短视频矩阵运营已成为品牌获取规模化流量的核心手段&#xff0c;但多账号协同背后的平台算法逻辑、账号关联风险、内容差异化策略等复杂问题&#xff0c;常常导致运营者踩入“雷区”。本文基于抖音、微信视频号、小红书三大主流平台官方规则与公开算法解读&#xff0c;系统梳理…...

3个关键策略:qmcdump如何高效解密QQ音乐加密音频文件

3个关键策略&#xff1a;qmcdump如何高效解密QQ音乐加密音频文件 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否…...

别再复制粘贴了!手把手教你为51单片机LCD12864制作自定义中文字库(Keil C51环境)

从零构建51单片机LCD12864自定义中文字库的完整实战指南 在嵌入式显示领域&#xff0c;标准字库往往无法满足个性化需求。当我们需要在LCD12864屏幕上显示特殊符号、品牌LOGO或艺术字体时&#xff0c;自定义字库技术就成为关键突破点。本文将彻底解析从字模提取到ROM优化的全流…...

免费一键去图片水印的App有哪些?免费去图片水印软件推荐,2026实测好用工具盘点

免费一键去图片水印的App有哪些&#xff1f;免费去图片水印软件推荐&#xff0c;2026实测好用工具盘点 在日常用图的过程中&#xff0c;水印几乎是绕不开的麻烦——从网络下载的素材到平台截图&#xff0c;从拍摄叠加的文字标注到品牌Logo&#xff0c;各种形式的水印让图片用起…...

交完Essay才发现Turnitin更新了AI检测?我是这么应对的

上学期我的一个朋友被约谈了。 教授发邮件说&#xff1a;"你的Essay和AI生成文本相似度过高&#xff0c;请来办公室解释。" 他确实用了AI——谁没用呢——但他也认真改写了好几遍。问题是&#xff0c;Turnitin在2025年更新了AI检测模型&#xff0c;现在它不只看词汇…...

构建离线文档ETL管道:用Python实现PDF/Word智能转Markdown优化LLM输入

1. 项目概述&#xff1a;为什么我们需要一个离线的文档转换工具&#xff1f;如果你和我一样&#xff0c;经常需要把一堆PDF、Word文档甚至扫描件喂给本地的大语言模型&#xff08;比如Ollama、LM Studio&#xff09;&#xff0c;那你肯定遇到过这个痛点&#xff1a;模型宝贵的上…...

Prisma与GraphQL游标分页实战:基于Relay规范的高性能实现

1. 项目概述与核心价值如果你正在用 Prisma 和 GraphQL 构建后端服务&#xff0c;并且需要实现一个高性能、体验流畅的分页功能&#xff0c;那么zoontek/prisma-cursor-pagination这个库很可能就是你一直在找的“瑞士军刀”。分页&#xff0c;尤其是基于游标的分页&#xff0c;…...