【题解】2019,7.14 模拟赛(阿鲁巴)
Description
就是给出一个数 \(k\),再给出一个边长为 \(n=2^{k}\) 的矩阵每个元素是 \(w_{i,j}\),然后要求我们求出一个 \([0,n-1]\) 序列 \(p\) 使 他的\(\sum_{i=1}^{n-1} w_{p_{i-1},p_i}\) 最小,同时这个序列要满足对于 一个小于等于 \(k\) 的 \(j\) 满足分成 \(2^{k-j}\) 块,并且这些块内的 \(p_i\)的第 \(j\) 位都相同。
Solution
前两天模拟赛做到一道特别厉害的题,来的分享想一下
其实这题是司机出的T3,照理说应该是没人切得动的,但是“大海”不但切了,还把司机的标算吊打了一发。
标算复杂度: \(O(N^3)\)
大海复杂度: \(O(N^2k)\)
\(k\) 的范围和 \(log\) 同阶。
那么我们还研究司机的算法搞个鸡毛,看“大海”啊。
我们先拿样例来找找规律:
1 0 3 2
我们把他二进制分解:
01 00 11 10
我们发现分个组:
01 00 | 11 10
他们的第一位的数是不同的(左边是0,右边是1)。
这个根据题目要求其实可以简单发现。
因为前一段是第一位是0,如果后一段和前一段的第一位相同的话就会重复,同时之后还要保证他们的第2位相同那么就会重复,那就非常尴尬了(我连我自己)。
所以要从最小的长度 \(2\) 开始,保证这种尴尬情况不出现。
所以我们发现一个确定下一个数填什么的一个方法,但是具体怎么确定把那一位取个反让他们不同捏?
我们对他的编号观察一下:
0 1 2 3
我们这样看不出什么鬼东西,我们对他二进制分解一下:
00 01 10 11
欧,好像有点东西?我们发现好像在编号为 \(2\) 的时候发生了取反,并且取反位置好像和这个东西的后面有几个 \(0\) 有关系,不错,好像有点进展。\(0\) 根 \(lowbit\) 有点关系。
但是我们还是不知道确定下一位那个位取反之后怎么知道后一位到底会是多少。
我们动了动脑yy了一下,好像又有点眉目了?
好像不能直接求出下一个,因为要取 \(min\) 所以这就很显然了,我们得枚举。
但是直接枚举的话好像对我们刚才得出的信息没什么用,我们可以利用一下题目,如果我们已经确定了前一位是啥,那不是我们对想应位置取反之后就可以推出这一位序列里选什么。
但是还是要枚举那些前面相同那些从 \(lowbit\) 开始不一样的那些编号。
那么我们基本确定了一个方案:
设 \(f[k][num]\) 表示前 \(k\) 个,上一个填了 \(num\) 的最小序列值。
那么我们大力枚举下一个数取反后 \(lowbi\) 后面有几个 \(1\) ,随便一坨转移一下就好了。。。
滑稽。。。其实代码还是很好理解的:
#include<bits/stdc++.h>
using namespace std;int BIT,n;
const int N=(1<<9)+5,K=10,INF=1E9;
int a[N][N],f[N][N];// f[i][j]表示前k-1位已经放好,上一位编号是j的最小花费 inline int dfs(int k,int num){if(k==n) return 0;if(f[k][num]!=-1) return f[k][num];int bit=0,p=k;while(bit<BIT && !(p&1)){bit++;p>>=1;}int tmp=(1<<bit);int tmp_r=(((num^tmp)>>bit)<<bit);f[k][num]=INF;for(int i=0;i<tmp;++i)f[k][num]=min(f[k][num],a[num][tmp_r+i]+dfs(k+1,tmp_r+i));return f[k][num];
}int main(){memset(f,-1,sizeof(f));scanf("%d",&BIT);n=(1<<BIT);for(int i=0;i<n;++i) for(int j=0;j<n;++j)scanf("%d",&a[i][j]);printf("%d\n",dfs(0,n));// 0,n方便处理 return 0;
}
转载于:https://www.cnblogs.com/JCNL666/p/11186147.html
【题解】2019,7.14 模拟赛(阿鲁巴)相关推荐
- [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结
t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...
- 【原创】2019.10.26模拟赛 Adore Confess Repulsed
大佬Alster 水 0 说在前面 1 Adore 1.1 问题描述 1.2 输入格式 1.3 输出格式 1.4 样例输入 1.5 样例输出 1.6 数据规模与约定 1.7 分析咕咕咕,只有吐槽 1. ...
- 小乐乐与二段数(2019哈理工新生赛第20题)
链接:2019哈理工新生赛题解 2019哈理工新生赛第20题 T题: 链接:https://ac.nowcoder.com/acm/contest/1877/T 来源:牛客网 题目描述 小乐乐从老师口 ...
- 【计蒜客模拟赛系列】-计蒜客2021年8月普及组模拟赛
提前:本文中部分代码和思路有借鉴或摘抄计蒜客官方题解 赛后总结 本次模拟赛的难度总算正常了些 个人战绩: 220/400,排名61 ,太弱了,一大堆AK爷 题目质量评价: 题目相比CSP-J还是简单了 ...
- 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)
时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...
- 第一届『Citric杯』NOIP提高组模拟赛 题解
[官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...
- 2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)
Begin (题目的排序方式:Unkown其实是按心情排的) 异或:(摘自百度百科) 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为"⊕",计算机符号为&quo ...
- 2019.01.22【NOIP普及组】模拟赛C组总结
总结 这次模拟赛拿到了100+100+100+60=360的分数 第1,2题不怎么难,快速解决,第3题看到之后马上想到了混合背包,打了大概半小时解决了,最后一道题想来想去,想了一堆没用的东西,最后打了 ...
- [NOIP10.6模拟赛]2.equation题解--DFS序+线段树
题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...
- 第十三届蓝桥杯模拟赛第二期JAVA组个人题解
第十三届蓝桥杯模拟赛第二期JAVA组个人题解 文章目录 第十三届蓝桥杯模拟赛第二期JAVA组个人题解 题目1 题目2 题目3 题目4 题目5 题目6 题目7 题目8 题目9 题目10 题目1 小蓝的I ...
最新文章
- eclipse插件 android模拟器,关于eclipse:ADT插件中的android模拟器没有运行
- 我的Android笔记--我对安卓系统的一些了解
- 数据仓库专题(23):总线矩阵的另类应用-Drill Down into a More Detailed Bus Matrix
- 数列分块入门3(查询前驱)
- android 打开系统相机,
- 协鑫集成“熄灯工厂”装上ET工业大脑,验证订单命中率可提高3.99%
- java 判断季节,Java-用switch判断季节
- Android Fragment功能的例子
- 阿里有php的研发团队么,【阿里巴巴】阿里集团-MMC技术部-研发工程师JAVA
- 最大子矩阵(前缀和+贪心)
- java zoneid_java – ZoneId和LocalDateTime
- html里面怎么引入swiper,JavaScript库——使用swiper.js创建嵌套的swiper
- 【ETL工具】-Kettle详细教程
- mobi格式电子书_没有Kindle,如何看Kindle电子书?
- sketch软件_Sketch制作交互流程图,哪种工具最高效?
- 物联网边缘-物联网准入或接入安全防护产品及解决方案
- SEGGER System View - J-Link Library not found
- 业务系统安全工程在阿里的实践|阿里巴巴DevOps实践指南
- PaddlePaddle入门整理十:PaddlePaddle训练自己的数据集
- 网站卡死服务器2008,winserver2008r2频繁卡死?