BZOJ3003 LED题解(状压DP+最短路+差分)

内网开发Maven离线仓库搭建:基于Nexus 3的完整解决方案 在软件工程实践中,依赖管理是构建自动化与团队协作的基础环节。Maven作为Java生态的主流构建工具,其核心原理是通过坐标从远程仓库解析和下载依赖,实现项目的可重复构建。对于金融、军工等安全敏感行业,内网隔离环境使得这一机制失效,严重阻碍开发效率。此时,搭建离线Maven仓库成为关键技术方案,它通过在内网部署完整的依赖供应体系,保障了开发流程的连续性与安全性。其核心价值在于为团队提供稳定、可控的依赖源,避免因网络隔离导致的构建中断。典型的应用场景包括企业级私有化部署、安全合规开发环境等。本文将深入解析如何利 阅读详情

题目:BZOJ3003.
题目大意:给定一个长度为 n n n序列 a i a_i ai​与给定 m m m种操作, a i a_i ai​初始全为 0 0 0,每种操作给定一个长度,表示可以对这个长度的区间取反.现在要你用一定次数的操作把整个序列变成只有 k k k个位置为 1 1 1,其余全为 0 0 0,求最少操作数.
数据组数 T ≤ 10 T\leq 10 T≤10, 1 ≤ n ≤ 1 0 4 , 1 ≤ m ≤ 100 , 1 ≤ k ≤ 10 1\leq n\leq 10^4,1\leq m\leq 100,1\leq k\leq 10 1≤n≤104,1≤m≤100,1≤k≤10.

对于这种区间染色的题,我们发现区间染色的操作非常麻烦,所以考虑把操作和序列都进行异或差分,现在操作变成相隔一定长度的两个位置取反,同时最终的序列变成了最多 2 k 2k 2k个位置为 1 1 1.

之后考虑把问题变为从终态到初态的最少步数,然后状压DP.设 f [ S ] f[S] f[S]表示集合 S S S中的位置为 1 1 1其它位置为 0 0 0需要的最少步数,那么可以列出转移:
f [ S ] = min ⁡ i , j ∉ S { f [ S ∪ { i , j } ] + g ( i , j ) } f[S]=\min_{i,j\notin S}\{f[S\cup\{i,j\}]+g(i,j)\} f[S]=i,j∈/​Smin​{f[S∪{i,j}]+g(i,j)}

其中 g ( i , j ) g(i,j) g(i,j)表示把位置 i i i和位置 j j j同时消掉需要的最少步数,但是这个东西并不好求.

考虑若当前用长度为 l e n 1 len_1 len1​的操作消掉了位置 i i i,则位置 i + l e n 1 i+len_1 i+len1​会变为 1 1 1,之后用长度为 l e n 2 len_2 len2​的操作消掉位置 i + l e n 1 i+len_1 i+len1​,则位置 i + l e n 1 i+len_1 i+len1​会变为 0 0 0且 i + l e n 1 + l e n 2 i+len_1+len_2 i+len1​+len2​变为 1 1 1…

我们会发现上述过程类似于一个最短路,对于每一个位置 i i i和每一个区间长度 j j j,则将位置 i i i和 i + j , i − j i+j,i-j i+j,i−j两个位置连接起来,跑个最短路就完事了.

一个小优化,容易发现每次转移的时候位置 ( i , j ) (i,j) (i,j)中有一个位置是可以钦定而不枚举的,这样就可以少 O ( k ) O(k) O(k)的时间复杂度了.

时间复杂度 O ( T ( n m + 2 2 k k ) ) O(T(nm+2^{2k}k)) O(T(nm+22kk)).

代码如下:

#include<bits/stdc++.h>
using namespace std;

#define Abigail inline void
typedef long long LL;

const int N=10000,M=100,K=10,INF=(1<<30)-1;

int num[(1<<K*2)+9];

void Get_num(){
  for (int i=0;i<=K*2;++i) num[1<<i]=i;
}

int n,m,sk,a[N+9],len[M+9];
int p[K*2+9],cp;

void Get_p(){
  cp=0;
  for (int i=1;i<=n;++i)
    if (a[i]) p[++cp]=i;
}

struct side{
  int y,next;
}e[N*M*2+9];
int lin[N+9],cs;

void Ins(int x,int y){e[++cs].y=y;e[cs].next=lin[x];lin[x]=cs;}
void Ins2(int x,int y){Ins(x,y);Ins(y,x);}

void Get_graph(){
  for (int i=1;i<=n;++i) lin[i]=0;
  cs=0;
  for (int i=1;i<=m;++i)
    for (int j=1;j<=n;++j){
      if (j-len[i]>=1) Ins(j,j-len[i]);
      if (j+len[i]<=n) Ins(j,j+len[i]);
    }
}

queue<int>q;
int dis[K*2+9][N+9],vis[N+9];

void Bfs_dis(int id,int st){
  for (int i=1;i<=n;++i) dis[id][i]=INF,vis[i]=0;
  dis[id][st]=0;vis[st]=1;q.push(st);
  for (;!q.empty();){
  	int t=q.front();q.pop();
  	for (int i=lin[t];i;i=e[i].next)
  	  if (!vis[e[i].y]){
  	  	dis[id][e[i].y]=dis[id][t]+1;
  	  	vis[e[i].y]=1;
  	  	q.push(e[i].y);
  	  }
  }
  dis[id][st]=INF;
}

int dp[(1<<K*2)+9];

void Get_dp(){
  for (int g=0;g<1<<cp;++g) dp[g]=INF;
  dp[(1<<cp)-1]=0;
  for (int g=(1<<cp)-1;g>0;--g){
  	if (dp[g]==INF) continue;
  	int t0=g&-g;
  	if (g-t0==0) continue;
  	for (int i=g-t0;i;i-=i&-i){
  	  int t1=i&-i;
  	  dp[g^t0^t1]=min(dp[g^t0^t1],dp[g]+dis[num[t0]+1][p[num[t1]+1]]);
    }
  }
}

Abigail start(){
  Get_num();
}

Abigail into(){
  scanf("%d%d%d",&n,&sk,&m);++n;
  for (int i=1;i<=n;++i) a[i]=vis[i]=0;
  for (int i=1;i<=sk;++i){
  	int x;
	scanf("%d",&x);
	if (vis[x]) continue;
	vis[x]=1;
	a[x]^=1,a[x+1]^=1;
  }
  for (int i=1;i<=m;++i)
    scanf("%d",&len[i]);
}

Abigail work(){
  Get_p();
  Get_graph();
  for (int i=1;i<=cp;++i) Bfs_dis(i,p[i]);
  Get_dp();
}

Abigail outo(){
  printf("%d\n",dp[0]==INF?-1:dp[0]);
}

int main(){
  int T;
  start();
  scanf("%d",&T);
  while (T--){
    into();
    work();
    outo();
  }
  return 0;
}
宝塔面板Windows版避坑指南:解决外网访问404问题及安全入口配置 本文详细解析了宝塔面板Windows版外网访问404问题的解决方案,涵盖端口配置、安全入口机制和防火墙设置等关键步骤。特别针对外部访问需求,提供了内网穿透方案对比与安全加固实践,帮助用户高效部署并保障服务器安全。 阅读详情

相关推荐

Vue3结合vue-office实现Word文档上传与预览全流程解析

本文详细解析了如何在Vue3项目中集成vue-office插件实现Word文档上传与预览功能。从项目初始化、插件安装到文件上传处理(包括ArrayBuffer转换)、预览优化及常见问题解决方案,提供了一套完整的实现流程,帮助开发者快速实现高效的文档预览功能。

weixin_29001327的博客 464

BZOJ 3003: LED

3003: LED Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 88  Solved: 19 [Submit][Status][Discuss] Description LED屏是由一个庞大的点阵小灯泡组成的,一开始每个小灯泡都不发光。每一行一共有N个小灯泡,依次标号为1~n。现在给定K个点,要求这K个点发光,其余点必须保持熄

BlackJack 828

别再羡慕专业版!用这个批处理脚本,一键给Win11家庭版装上官方沙盒

本文详细介绍了如何通过批处理脚本在Windows 11家庭版上安装官方Windows沙盒(Windows Sandbox),无需复杂操作即可享受专业版功能。脚本自动激活系统内置组件,提供安全隔离的虚拟化环境,适用于软件测试、安全浏览等场景。

weixin_26757925的博客 495

『差分思想』BZOJ3003:LED

Problem\mathrm {Problem}Problem LED屏是由一个庞大的点阵小灯泡组成的,一开始每个小灯泡都不发光。 每一行一共有N个小灯泡,依次标号为1~n。现在给定K个点,要求这K个点发光,其余点必须保持熄灭状态。 而这块LED屏的操作方式各种奇葩,一共有L种操作方法,第i种表示你能将任意长度恰为A_i的连续一段灯泡的状态取反(灭变亮,亮变灭)。 已知LED屏一共有m行,为了节省...

Ronaldo7_ZYB的博客 372

科大讯飞(1): 环形6麦语音唤醒—驱动板上的接口

介绍环形麦阵列驱动板上的接口,及其疑问

bing_feilong的博客 1175

解决Cursor AI工具地域限制报错的方法与原理

地理围栏(GEO-fencing)是现代云服务常用的访问控制技术,通过IP地址库匹配、支付系统验证等方式实现区域限制。在AI编程工具领域,这种技术常导致类似Cursor出现的'unsupported country region'报错。从技术实现看,服务商会综合HTTP头信息、时区设置等多维度数据进行地理位置判断。开发者可通过调整网络出口、配置本地模型或使用企业版等方案解决。本文以Cursor为例,详细分析了AI工具地域限制的底层原理,并提供了包括Ollama本地部署在内的多种工程实践方案,特别适合需要稳定

weixin_30820077的博客 945

【BZOJ3003】LED BFS+状压DP

【BZOJ3003】LED Description LED屏是由一个庞大的点阵小灯泡组成的,一开始每个小灯泡都不发光。每一行一共有N个小灯泡,依次标号为1~n。现在给定K个点,要求这K个点发光,其余点必须保持熄灭状态。而这块LED屏的操作方式各种奇葩,一共有L种操作方法,第i种表示你能将任意长度恰为A_i的连续一段灯泡的状态取反(灭变亮,亮变灭)。 已知LED屏一共有m行,为...

aodanchui1057的博客 284

openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用openclaw-cn的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 10万+

BZOJ3003 差分+状压

给定一个长度为n的01序列以及L个整数a[i]a[i]。每次可以选择连续的长度为a[i]a[i]的一段取反,给出末状态。求最少操作的次数。首先,这类选择一段区间操作的题可以把序列差分。于是我们把给出的末状态差分,然后考虑把每次操作也差分,于是每次操作就是选择两个位置差为a[i]a[i]的数对取反。然后我们对所有的a[i]a[i]跑一遍背包(即取正也取负),这样就得到了把任意位置差的两个点取反的最小代

Devil_Gary的博客 869

Neo4j:入门基础(二)之导入CSV文件

导入CSV文件的方式  主要的两种方式如下:   1、使用 Cypher 命令LOAD CSV,这种方式可以处理中小型数据(可达10 million条记录)   2、使用批量导入工具neo4j-admin ,用来直接导入大数据集 三、上述方式具体导入过程   1、Cypher 命令LOAD CSV 参数 1、USING PERIODIC COMMIT 300 使用批量提交,每满300条提交一次,防止内存溢出 2、WITH HEADERS 从文件中读取第一行作为参数名,...

Puzzle的博客 3万+

2026最新版OpenClaw安装:Windows WSL2从零到跑通

Windows WSL2安装OpenClaw指南 本文详细介绍了在Windows系统上通过WSL2部署OpenClaw AI助理的完整流程。WSL2结合了Windows易用性和Linux高性能,特别适合Windows用户、开发者、学生和技术爱好者。文章涵盖硬件要求(推荐i5/16GB/SSD)、系统准备(Windows 10/11+WSL2)、环境部署(Python/Node.js/Redis)和OpenClaw配置(克隆/编译/初始化)等关键步骤。通过WSL2,用户可在保留Windows操作习惯的同

一键难忘的博客 2345

#12【BZOJ3003】LED BFS+状压DP

题解: 看到区间修改先想一下差分 这题用差分是为了分析问题 现在的问题就变成了 原序列全为0,要使得特定的k个点变为1,每个操作改变x,y+1 然后我们会发现 对于二元组a,b我们要修改它,实际上是在找连续的区间相连,所以实质上是最短路 为什么要差分了才能这么做呢 因为原来的区间修改可能中间涉及了有效点而变得复杂 现在每次有效操作不会影响到中间的有效点 接下来状压dp这是显然的...

weixin_30362083的博客 152

OpenClaw入门必装Skills(附使用场景)

很多同学安装了OpenClaw后,但却不会使用,就相当于你只是拥有了一副强大的躯干,却没有给它装上能够灵活执行任务的“手脚”和负责思考决策的“大脑插件”——Skills。没有这些核心能力的支撑,OpenClaw只是一个“空壳”,无法真正应用到实际业务场景中,更谈不上提升效率或解决复杂问题。所以,安装只是第一步,要真正让OpenClaw“活”起来,为我们所用,就需要给OpenClaw安装各种Skills,这个过程就是养虾的过程。

十二测试录 3224

【BZOJ1087】状压dp

题意十分好懂 分析 看到题目,上来敲了个爆搜,结果样例都过不去…dfs水平有待提高… 仔细分析之后发现,虽然棋盘看起来很小,只有9*9,但是状态数目极多,所以暴力是不可能过的。 所以这个题目应该是个dp题。 dp应该怎么dp呢? 如果我们知道了上一行是怎么摆放的,我们也就知道了前i行一共有多少个棋子。那么下一行我们就可以推出来了。 这就是本题的dp的转移。 于是,我们来到了本篇文章的重点部分:状态...

KIKO_caoyue的博客 332

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

BZOJ 3812: 主旋律 状压dp 容斥原理

3812: 主旋律Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 332  Solved: 269[Submit][Status][Discuss]Description响应主旋律的号召,大家决定让这个班级充满爱,现在班级里面有 n 个男生。如果 a 爱着 b,那么就相当于 a 和 b 之间有一条 a→b 的有向边。如果这 n 个点的图是强联通的,那...

BlackJack 742

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

bzoj 4057(状压dp)

传送门 题解:设f[i](bool)表示能否出现状态i,二进制i的1表示破产,0表示幸存#include<bits/stdc++.h> using namespace std; int n,a[22][22],ans[22],cnt; bool f[1050000]; int main() { // freopen("bzoj 4057.in","r",stdin); int kase;

KGV093的博客 646

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

bzoj 1087(状压dp)

传送门 题意: 给你一个\(n*n\)的格子,如果第\(i\)个格子放入了棋子,则八联通方向都不能放置棋子,问放置\(k\)个棋子的方案数。 分析: 很明显可以进行\(dp\),又因为\(n\)非常的小,因此我们可以采用状态压缩的方法。设\(dp[i][state][k]\)为当前第\(i\)行的状态为\(state\)时,放置了\(k\)个棋子的方案数。 当前第i行的状态,显然可以由第\(i-1...

weixin_30895603的博客 176

BZOJ1879bill的挑战——状压DP

Description Input 本题包含多组数据。 第一行:一个整数T,表示数据的个数。 对于每组数据: 第一行:两个整数,N和K(含义如题目表述)。 接下来N行:每行一个字符串。 T ≤ 5,M ≤ 15,字符串长度≤ 50。 Output 如题 Sample Input 5 3 3 ???r??? ??????? ??????? 3 4 ???...

stevensonson的博客 285

BZOJ2595(状压dp)

要点 设\(f[i][j][k]\)为经过点\((i,j)\)且包含点集\(k\)的最小代价,其中k是指景点集合的枚举。 考虑有两种情况:1.点\((i,j)\)作为关键点连接了两个子集时\(f[i][j][k]\)可以得到最小,有\(f[i][j][k]=f[i][j][k_1]+f[i][j][k_2]-a[i][j],\ k_1|k_2=k\);2.点\((i,j)\)作为主干道...

252

[bzoj3590]Quare——状压DP

题目大意: 给定一个图,求一个边的子集,使得整张图为边双连通并且边的权值和最小。 思路: 数据范围这么小,考虑状压DP。 题目要求子图为边双连通,边双连通可以表示成若干个环套在一起,但是这样并不方便我们表示状态。 思考一下,不难发现一个边双可以这样组成:一个边双不断地添加一条链并且使这条链首尾都和边双里的任意一个点相连。 于是转移的大致思路便出来了,枚举一条链并且将这一条链接入目前的集合中,每一次...

ylsoi的博客 326

【dp 状态压缩 单调栈】bzoj3591: 最长上升子序列

奇妙的单调栈状压dp Description 给出1~n的一个排列的一个最长上升子序列,求原排列可能的种类数。 Input 第一行一个整数n。 第二行一个整数k,表示最长上升子序列的长度。 第三行k个整数,表示这个最长上升子序列。 Output 第一行一个整数,表示原排列可能的种类数。 Sample Input 5 3 1 3 4 Sa...

weixin_30808253的博客 260

BZOJ 1079 着色方案 (状压dp)

1079: [SCOI2008]着色方案Time Limit: 10 Sec Memory Limit: 162 MB Description  有n个木块排成一行,从左到右依次编号为1~n。你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块。 所有油漆刚好足够涂满所有木块,即c1+c2+…+ck=n。相邻两个木块涂相同色显得很难看,所以你希望统计任意两 个相邻木块颜色不同的着色方案。

w4149 416

bzoj 3195 奇怪的道路 题解

题目 知识点: 状压DP 讲解: 这一题很有难度,是状压DP不错的提升题,为什么说他难呢?难就难在状态,对于这个状态我们很难定义出来。 对于这一题首先想到的就是有两维,一维i是我们已经计算到了哪个点,还有j就是我们已经用了多少条边,可是我们发现,题目说每个点连的边必须是偶数个,所以我们再加一维,我们状压i-K(K是题目给的)到i+K这17个点的奇偶数的状态,我们用0表示为偶数,1表示奇数,这样我们...

八月炊火的博客 306

刷题总结——bzoj1725(状压dp)

题目: 题目描述 FarmerJohn新买了一块长方形的牧场,这块牧场被划分成N行M列(1<=M<=12;1<=N<=12),每一格都是一块正方形的土地。 FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用。遗憾的是,有些土地相当的贫瘠,不能用来放牧。并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是...

banzhangzhi8819的博客 231

BZOJ3590【状压DP】

/* I will wait for you*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define make make_pair #define fi

Lethelody的专栏 1634
上一篇: 【NOIP2017】洛谷3959 宝藏题解(状压DP)
下一篇: Codeforces 559 C Gerald and Giant Chess题解(计数DP)
hezlik
博客等级 码龄9年 111粉丝 241原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值