2025.11.19 D 题解

news/2025/11/20 21:48:28/文章来源:https://www.cnblogs.com/chang-an-22-lyh/p/19249664

好题好题,但是这个音标题目名还是太生艹了。


第一眼感觉很多,感觉能柯朵莉树,但是有专门卡的包。后来发现似乎是得 \(dp\) 一下再找性质,但是没 \(dp\) 出来。

考虑性质:

每个数只会被换一次。
证明:假如换两次,来回换肯定不优,向前/向后换没有本质区别,那么就剩下下述情况(一点解释:为什么 \(x\) 前面都是 \(y\) 呢?因为不是 \(y\) 劣得没边):
1. \(y,x,y,z\),将 \(x\) 向后换两次。换一次都不优。
2. \(y,x,y,x\),将 \(x\) 向后换两次。换两次显然不优。
3. \(y,x,y,y\),将 \(x\) 向后换两次。换两次显然不优。
\(Q.E.D.\)(略显草率)

那就很好 \(dp\) 了。设 \(f_{i,0/1}\) 表示第 \(i\) 个位置有没有和前一个位置交换,则有:

\[f_{i,0}=\min(f_{i-1,0}+[a_i\ne a_{i-1}],f_{i-1,1}+[a_i\ne a_{i-2}]) \]

\[f_{i,1}=\min(f_{i-2,0}+[a_i\ne a_{i-2}],f_{i-2,1}+[a_i\ne a_{i-3}])+[a_i\ne a_{i-1}]+1 \]

发现这个东西可以用 \(O(4^3)\) 矩阵乘法优化,考虑动态 \(dp\)。发现区间加只会改变 \(l,l+1,l+2,r+1,r+2,r+3\) 六个位置的矩阵;区间推平除了改变这六个位置,还会将 \([l+3,r]\) 内的矩阵修改成一模一样的,区间修改+打标记即可。由于 \(a_i\) 会动态变化,所以还需要用一个线段树记录当前的 \(a_i\)

时间复杂度 \(O(4^3q\log n)\)。注意前三个位置实际上无法用常规的矩阵表示,所以先大力 \(dp\) 出来这三个位置再说。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,a[N],dp[5][2],zb;
int num[N<<2],tag[N<<2];
inline void buildd(int x,int l,int r){tag[x]=-1;if(l==r){num[x]=a[l];return;}int mid=(l+r)>>1;buildd(x<<1,l,mid);buildd(x<<1|1,mid+1,r);
}inline void downn(int x,int v){if(~tag[x]) tag[x]+=v;num[x]+=v;
}inline void downt(int x,int v){num[x]=tag[x]=v;}
inline void pushdown(int x){if(~tag[x]) downt(x<<1,tag[x]),downt(x<<1|1,tag[x]),tag[x]=-1;else downn(x<<1,num[x]),downn(x<<1|1,num[x]);num[x]=0;
}inline void add(int x,int l,int r,int L,int R,int v){if(L<=l&&r<=R) return downn(x,v);int mid=(l+r)>>1;pushdown(x);if(L<=mid) add(x<<1,l,mid,L,R,v);if(R>mid) add(x<<1|1,mid+1,r,L,R,v);
}inline void assign(int x,int l,int r,int L,int R,int v){if(L<=l&&r<=R) return downt(x,v);int mid=(l+r)>>1;pushdown(x);if(L<=mid) assign(x<<1,l,mid,L,R,v);if(R>mid) assign(x<<1|1,mid+1,r,L,R,v);
}inline int find(int x,int l,int r,int k){if(l==r) return num[x];int mid=(l+r)>>1;pushdown(x);if(k<=mid) return find(x<<1,l,mid,k);return find(x<<1|1,mid+1,r,k);
}inline int fd(int x){return x>=zb?find(1,1,n,x):-1;}
inline void solve(int l,int r){dp[0][0]=0,dp[0][1]=1e9,zb=l;for(int i=1;i+l-1<=r;i++){dp[i][0]=dp[i-1][0]+(fd(i+l-1)!=fd(i+l-2)),dp[i][1]=1e9;if(i>1) dp[i][0]=min(dp[i][0],dp[i-1][1]+(fd(i+l-1)!=fd(i+l-3)));if(i>2) dp[i][1]=dp[i-2][0]+(fd(i+l-1)!=fd(i+l-2))+(fd(i+l-1)!=fd(i+l-3))+1;if(i>3) dp[i][1]=min(dp[i][1],dp[i-2][1]+(fd(i+l-1)!=fd(i+l-2))+(fd(i+l-1)!=fd(i+l-4))+1);}
}struct matrix{int z[4][4];}sg[N<<2],zt[N],cc;int tg[N<<2];
inline matrix operator*(matrix x,matrix y){matrix z;memset(z.z,0x3f,sizeof(z.z));for(int i=0;i<4;i++) for(int j=0;j<4;j++)for(int k=0;k<4;k++) z.z[i][k]=min(z.z[i][k],x.z[i][j]+y.z[j][k]);return z;
}inline void gets(int id,int x){memset(sg[x].z,0x3f,sizeof(sg[x].z)),zb=0;int lsz=fd(id),lso=fd(id-1),lst=fd(id-2),lsh=fd(id-3);sg[x].z[0][0]=(lso!=lsz),sg[x].z[1][0]=(lst!=lsz);sg[x].z[2][1]=(lso!=lsz)+(lst!=lsz)+1,sg[x].z[0][2]=0;sg[x].z[3][1]=(lso!=lsz)+(lsh!=lsz)+1,sg[x].z[1][3]=0;
}inline void build(int x,int l,int r){if(l==r) return gets(l,x);int mid=(l+r)>>1;build(x<<1|1,mid+1,r);build(x<<1,l,mid),sg[x]=sg[x<<1]*sg[x<<1|1];
}inline void down(int x,int l,int r){tg[x]=1;sg[x]=zt[r-l];} 
inline void push_down(int x,int l,int r,int mid){if(tg[x]) down(x<<1,l,mid),down(x<<1|1,mid+1,r),tg[x]=0; 
}inline void ass(int x,int l,int r,int L,int R){if(L<=l&&r<=R) return down(x,l,r);int mid=(l+r)>>1;push_down(x,l,r,mid);if(L<=mid) ass(x<<1,l,mid,L,R);if(R>mid) ass(x<<1|1,mid+1,r,L,R);sg[x]=sg[x<<1]*sg[x<<1|1];
}inline void chg(int x,int l,int r,int k){if(k<4||k>n) return;if(l==r) return gets(l,x);int mid=(l+r)>>1;push_down(x,l,r,mid);if(k<=mid) chg(x<<1,l,mid,k);else chg(x<<1|1,mid+1,r,k);sg[x]=sg[x<<1]*sg[x<<1|1]; 
}inline void sum(int x,int l,int r,int L,int R,matrix &mt){if(L<=l&&r<=R){mt=mt*sg[x];return;}int mid=(l+r)>>1;push_down(x,l,r,mid);if(L<=mid) sum(x<<1,l,mid,L,R,mt);if(R>mid) sum(x<<1|1,mid+1,r,L,R,mt);
}int main(){freopen("swap.in","r",stdin);freopen("swap.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>q,dp[0][0]=0,dp[0][1]=1e9,a[0]=-1;for(int i=1;i<=n;i++) cin>>a[i];buildd(1,1,n);if(n>3) build(1,4,n);memset(zt[0].z,0x3f,sizeof(zt[0].z));zt[0].z[0][0]=zt[0].z[1][0]=0;zt[0].z[2][1]=zt[0].z[3][1]=1;zt[0].z[1][3]=zt[0].z[0][2]=0;for(int i=1;i<=n;i++) zt[i]=zt[i-1]*zt[0];memset(cc.z,0x3f,sizeof(cc.z));while(q--){int op,l,r,v;cin>>op>>l>>r;if(op==1){cin>>v,add(1,1,n,l,r,v);chg(1,4,n,l),chg(1,4,n,l+1),chg(1,4,n,l+2);chg(1,4,n,r+1),chg(1,4,n,r+2),chg(1,4,n,r+3);}else if(op==2){cin>>v,assign(1,1,n,l,r,v);if(r-l>=3) ass(1,4,n,l+3,r);chg(1,4,n,l),chg(1,4,n,l+1),chg(1,4,n,l+2);chg(1,4,n,r+1),chg(1,4,n,r+2),chg(1,4,n,r+3);}else{if(r-l>2){solve(l,l+2),cc.z[0][0]=dp[3][0],cc.z[0][1]=dp[3][1];cc.z[0][2]=dp[2][0],cc.z[0][3]=dp[2][1],sum(1,4,n,l+3,r,cc);cout<<min(cc.z[0][0],cc.z[0][1])<<"\n";}else solve(l,r),cout<<min(dp[r-l+1][0],dp[r-l+1][1])<<"\n";}}return 0;
}

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

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

相关文章

P11626 [迷宫寻路 Round 3] 七连击 分析

题目概述 有一个长度为 \(n\) 的序列,将这个序列砍 \(7\) 刀,分成了 \(8\) 个部分,取前 \(7\) 个部分进行讨论。 对于每个部分,贡献为这一段的最大公约数。 求所有情况的贡献和并对 \(998244353\) 取模。 数据范围…

芯谷科技--高性能电动工具直流调速电路GS069 - 指南

芯谷科技--高性能电动工具直流调速电路GS069 - 指南2025-11-20 21:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

【个人成长笔记】在本地Windows系统中如何正确使用adb pull命令,把Linux环境中的记录或文件夹复制到本地中(亲测有效)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

钩子

钩子(Hook)的核心概念是:在特定时刻被自动调用的函数,允许你在“某个流程”中插入自定义代码。 具体来说有两种层面的理解:框架层面的生命周期钩子:这是 Vue 框架为组件生命周期中固定节点(如创建、挂载、更新、…

IOI 2026 中国国家集训队作业(试题泛做)记录

IOI 2026 中国国家集训队作业(试题泛做)跟着学长做。可能不是很详细。 qoj1875 Nein link qoj970 Best Subsequence 考虑单次询问怎么做。二分,设 \(\le W\) 的为一类数,其余为二类数,显然二类数不能相邻,则肯定…

洛谷 B4411:[GESP202509 二级] 优美的数字 ← 嵌套循环

​【题目来源】https://www.luogu.com.cn/problem/B4411【题目描述】如果一个正整数在十进制下的所有数位都相同,小 A 就会觉得这个正整数很优美。例如,正整数 6 的数位都是 6,所以 6 是优美的。正整数 99 的数位都…

2025年门窗十大品牌专业选购手册:行业评估报告 + 白皮书指引,选窗更安心!

2025 年度门窗十大品牌的筛选与推荐,以中国建筑金属结构协会重磅发布的《2025 年度建筑门窗行业发展评估报告》为核心依据,深度拆解报告中关于行业技术革新趋势、品牌综合实力排名、产品核心性能基准值等关键内容,将…

文字识别系统

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset import os from PIL import Image import torchvision.transforms as transforms import numpy …

2025 门窗十大品牌精准选购指南:行业评估报告 + 白皮书护航,选窗不踩坑!

2025 年度门窗十大品牌的筛选工作,以中国建筑金属结构协会正式发布的《2025 年度建筑门窗行业发展评估报告》为核心根基,深度挖掘报告中关于行业技术迭代方向、品牌综合竞争力评级、产品核心性能基准参数等关键信息,…

写的都对_第二次软件工程作业

第二次软件工程作业 一、格式描述作业所属课程 软件工程 班级的链接 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering作业要求 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homewor…

深入解析:spark组件-spark core(批处理)-rdd血缘

深入解析:spark组件-spark core(批处理)-rdd血缘pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

深入解析:开源 Linux 服务器与中间件(十二)FRP内网穿透应用

深入解析:开源 Linux 服务器与中间件(十二)FRP内网穿透应用2025-11-20 21:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

CF1542E1 Abnormal Permutation Pairs (easy version)

我们不妨想一个简单的问题,如何计算一个长度为 \(n\) 的排列且逆序对个数为 \(m\) 的方案数。 令 \(f_{i, j}\) 为长度为 \(i\) 的排列逆序对个数为 \(j\) 的方案数。 我们转移的时候,本质上可以任选最后一个数到底增…

网络流建模

网络流建模 最大流 多源多汇 如果一道题中有多个可行的源点 \(s_1,\ldots,s_a\) 和多个可行的汇点 \(t_1,\ldots,t_b\),那么可以建立超级源汇 \(S,T\),从 \(S\) 向 \(s_i\) 连容量无穷的边,\(t_i\) 向 \(T\) 连容量…

实用指南:GLM 智能助力・Trae 跨端个人任务清单

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AT_agc050 总结

久违地发一次考试总结。因为这次写的比较详细,勉强能拿出来看看。 A 第一反应是线段树。(其实按位考虑说不定对于某些题也是一种突破口) 正解是连 \((2*p)-1\bmod n+1)\) 和 \((2*p+1)-1\bmod n+1\) 然后发现对于每…

补 二分法与图

题目:洛谷p1462 只要某个性质具有单调性,就必然可以二分。 以最短路为判断条件,二分费用,只允许使用费用小于等于目前费用的节点,求最短路,看是否可行,再根据可行性二分费用,最后求出费用的最小值 K 越大,可行…

SpringSecurity 集成 CAS Client 处理单点登录 - Higurashi

推荐阅读:CAS 单点登录详细流程背景 当前业务系统基于 Spring Security,现在需要集成 CAS,当用户访问业务系统时,如果用户没有登录,则跳转到 CAS Server 统一登录页面完成登录。 而当用户从 CAS Server 退出登录后…

NOIP2025模拟赛12(炼石计划NOIP模拟赛第 19 套题目)

赤了这口魔拟赛的石!写在前面: 我艹了何意味啊何意味T1放依托定理的板子题然后我还没听过这个定理(虽然据说是数论基础四大定理之一,但是好像学习数论基础的时候根本没看到过这个定理也没做过相关的题😡😡😡…

[nanoGPT] GPT模型架构 | `LayerNorm` | `CausalSelfAttention` |`MLP` | `Block` - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …