2019华工校赛 B - 修仙时在做什么?有没有空?可以来炼丹吗?
题目链接:https://ac.nowcoder.com/acm/contest/625/B
解法:这题其实就是求2^18个点内最近的两个点的距离。我们可以容易想到朴素解法:把每个点作为源点跑最短路取最小值。也很容易想到这个做法严重超时。
对于这种构图,这里有一个比较套路的方法:枚举2进制位数k,按二进制k位的0/1分成两组跑最短路。为什么是正确的,因为一旦两个数不等,那么这两个数必定在至少一个二进制位上不同,我们枚举了所有的二进制位,那么任意两个数都会被至少一次分到不同组中,亦即所有情况的最短路都考虑到了,那么当然是正确的。
这道题能得到一个启发:像这种对于一个很大很大的图,但是其实只有很少点是我们要计算的,我们可以考虑想出一种分组方式能使得任两个数都至少一次分到不同组,这就能减少时间而且不遗漏。
细节详见代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const long long P=;
const long long INF=(long long)<<;
typedef long long LL;
const int N=2e5+;
const int M=;
typedef pair<int,int> pii;
int n,ans,a[N],cost[(<<M)+][M],d[(<<M)+],mark[(<<M)+];
bool vis[(<<M)+]; inline LL PowMod(LL a, LL b) { LL r=; while(b) { if(b&) r=r*a%P; a=a*a%P, b>>=; } return r; } void prework() {
for (int s = ; s < (<<); ++s) {
for(int i = ; i < ; ++i) {
cost[s][i] = PowMod( max(s,s^(<<i))%P, <<i ) % P + ;
}
}
} priority_queue<pii> q;
void Dijkstra(int k) {
while (!q.empty()) q.pop();
memset(d,0x3f,sizeof(d));
memset(vis,,sizeof(vis));
for (int i=;i<=n;i++)
if (a[i]>>k & ) { //把n个数字 分成2组 跑最短路
q.push(make_pair(,a[i]));
d[a[i]]=;
}
while (!q.empty()) {
pii x=q.top(); q.pop();
if (mark[x.second] && x.first!=) ans=min(ans,-x.first);
if (-x.first>=ans) return; //当前最短路都比答案大,后面的不用看
if (vis[x.second]) continue;
vis[x.second]=; for (int i=;i<;i++) {
int y=x.second^(<<i);
if (d[y]>d[x.second]+cost[x.second][i]) {
d[y]=d[x.second]+cost[x.second][i];
q.push(make_pair(-d[y],y));
}
}
}
} signed main()
{
prework(); scanf("%lld",&n);
for (int i=;i<=n;i++) scanf("%lld",&a[i]),mark[a[i]]=;
sort(a+,a+n+);
for (int i=;i<=n;i++)
if (a[i]==a[i-]) { puts(""); return ; } ans=INF;
for (int i=;i<;i++) Dijkstra(i);
cout<<ans<<endl;
return ;
}
2019华工校赛 B - 修仙时在做什么?有没有空?可以来炼丹吗?的更多相关文章
- 2019年华南理工大学程序设计竞赛(春季赛) B 修仙时在做什么?有没有空?可以来炼丹吗?(思维建图搜索)
https://ac.nowcoder.com/acm/contest/625/B 分析: 全部的状态只有1<<18 个 , 所以我们可以预处理 f[u][j] , 然后建立出全部的u可以 ...
- [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?
这道题真的超级...毒瘤 + 卡常 + 耗 RP 啊... 传送门 noteskey 题解看 shadowice 大仙 的 code 如果发现自己 T 掉了,别心急,洗把脸再交一遍试试... //by ...
- oo修仙之路
写在前面: 之前听说过oo这门课的威力,计院全体修仙现场的图也被转了不知多少遍,然而自己不亲身经历就不知这门课的难度所在.每次debug时耳边总会想起三国杀里面周瑜的话"挣扎吧,在血和暗的深 ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- ICPC 2019 徐州网络赛
ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...
- 《带你装B,带你飞》pytest修仙之路3 - setup/teardown
1. 简介 学过unittest的都知道里面用前置和后置setup和teardown非常好用,在每次用例开始前和结束后都去执行一次.当然还有更高级一点的setupClass和teardownClass ...
- 《带你装B,带你飞》pytest修仙之路5 - yield操作
1. 简介 上一篇中,我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要清除数据(或还原)操作,可以使用 yield 来实现.fixture通过scope参数控制setup级别,既然 ...
- ACM-ICPC 2019 山东省省赛总结
五题手快拿银,不然拿铜,甚至不拿,从结果上来看拿了铜牌对第一年的我们来说算好的,也不算太好. 从拿奖后的第一天,我想写这篇博客,但是我忍了下来,那时候被喜悦冲昏了头脑,当 冷静下来,我开始打算写这篇博 ...
随机推荐
- Linux上部署Springboot相关命令
ps -ef|grep java 看有关java的进程 ps -ef是显示所有进程信息 后面那个grep是匹配的意思 kill -9 123123 213231 后面两个数字是两个进程的进程号pid, ...
- 一、Gulp
开发和部署前端项目: 在开发Web应用中为加速客户端资源响应(js和css),减少对js和css的请求,通过bundles来实现. 在ASP.NET5中放弃该特性,被其他类似的组件所代替.比如使用Gu ...
- 入门GoldenGate总结
前言 GoldenGate 是oracle官方的一款数据同步产品,类似于msyql的主从复制,配置也稍稍复杂,其中概念一定要搞清楚,不然会被坑的爬不起. 坑 1.数据在线同步(不是指数据初始化),只能 ...
- Linux xargs 命令
xargs xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具. xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据. xargs 也可 ...
- python中函数用法
unique() numpy.tolist() collections.defaultdict() random.sample()[] 1. unique():返回参数数组中所有不同的值,并按照从小到 ...
- oracle 数据恢复
闪回表删除之前 flashback table t1 to before drop; 如果彻底删除表此方法无效 若要彻底删除表,则使用语句:drop table <table_name> ...
- ubuntu openssl 生成密钥对
一般情况下ubuntu和mac系统都会自带openssl,安装之前先测试一下,打开终端,输入openssl,如果出现以下画面,即已安装. root@jiang:/home/kevin/work/ope ...
- Python 获取当前文件所在路径
记录几个os获取路径的函数 1. os.path.realpath(__file__):获取文件的绝对路径,包括文件自己的名字 2.os.path.dirname(path):获取path路径的上级路 ...
- 四轴遥控器ADC部分
一.ADC参考手册学习 A/D转换可以按单次.连续设置采样:可以一一扫描或间断的对多个ADC通道进行采集. ADC的结果有左对齐和右对齐. ADC的输入时钟不得超过14Mhz,它是由PCLK2经分频产 ...
- 芒果学院Python高级开发课程