第k小团+bitset优化——牛客多校第2场D
模拟bfs,以空团为起点,用堆维护当前最小的团,然后进行加点更新
在加入新点时要注意判重,并且用bitset来加速判断和转移构造
#include<bits/stdc++.h>
#include<bitset>
#include<queue>
using namespace std;
#define ll long long
char mp[][];
int n,k;
ll a[];
bitset<>bit[];
struct Node{
ll w;
bitset<>b;//团内点的状态
Node(){w=;b.reset();}
Node(ll w,bitset<>b):w(w),b(b){}
};
bool operator<(Node a,Node b){
return a.w>b.w;
}
priority_queue<Node> pq;//团按权值升序排列 int main(){
cin>>n>>k;
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
for(int i=;i<=n;i++)scanf("%s",mp[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
if(mp[i][j]=='')bit[i][j]=;
else bit[i][j]=;
}
pq.push(Node());
int cnt=;ll ans=;
while(pq.size()){
Node cur=pq.top();pq.pop();
//for(int i=1;i<=n;i++)cout<<cur.b[i];
//puts(""); cnt++;
if(cnt==k){
ans=cur.w;
break;
}
//要保证所有在pq里出现过的团都是唯一的,即不能重复加入状态相同的团,
//更新时只加比当前团最大的点编号大的点
int start=;
for(int i=n;i>=;i--)if(cur.b[i]){
start=i+;break;
} for(int i=start;i<=n;i++)if(!cur.b[i]){//第i个点没在团里
//for(int j=1;j<=n;j++)cout<<bit[i][j];
//puts("");
if((cur.b&bit[i])==cur.b){
Node tmp=cur;
tmp.w+=a[i];
tmp.b[i]=;
pq.push(tmp);
}
}
} if(cnt==k)cout<<ans<<endl;
else cout<<-<<endl;
}
第k小团+bitset优化——牛客多校第2场D的更多相关文章
- 2020牛客多校第八场K题
__int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- Kth Minimum Clique(2019年牛客多校第二场D题+k小团+bitset)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 找第\(k\)小团. 思路 用\(bitset\)来标记每个结点与哪些结点直接有边,然后进行\(bfs\),在判断新加入的点与现在有的点是否都 ...
- 牛客多校第七场 C Bit Compression 思维
链接:https://www.nowcoder.com/acm/contest/145/C来源:牛客网 A binary string s of length N = 2n is given. You ...
- 牛客多校第五场 F take
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...
随机推荐
- io.File+递归
import java.io.File ; import java.io.IOException ; public class FileDemo11{ public static void main( ...
- Restrictions----用法
----------------------------------------方法说明 --------------------------QBC常用限定方法-------------------- ...
- 计算机网络之IP地址与MAC地址
IP地址 IP地址(Internet Protocol Address): 缩写为IP Adress,是一种在Internet上的给主机统一编址的地址格式,也称为网络协议(IP协议)地址. 它为互联网 ...
- 聊一聊JavaScript中的事件循环
一.概念:事件循环 JavaScript是单线程的 1.整片 script 整体代码(第一个宏任务)放到执行栈中,执行之后,会触发很多方法 这些方法只能一个个的顺序执行,不能并发 2.这些要执行的方法 ...
- Android中的Service 与 Thread 的区别
很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...
- 自己写的一些Delphi常用函数
今天在整理以前写过的代码,发现有些函数还是挺实用的,决定将其贴到Blog上,与众多好友一起分享.{*************************************************** ...
- Less 和 Sass
LESS SASS sass 与 less 的区别与学习 : https://www.cnblogs.com/roashley/p/7731865.html 或 https://www.c ...
- sublime text3 nodejs控制台输出结果中文乱码
在sublime text3安装完nodejs的插件后,运行console.log("你好"),发现控制台出现中文乱码,解决办法:Preferences-> Browser ...
- (转)NAT与NAT穿越学习总结--ICE过程讲的不错
转:http://cgs1999.iteye.com/blog/1994072 1.引言网络地址转换(Network Address Translation,简称NAT)是一种在IP分组通过路由器或防 ...
- html+css判断各个IE浏览器版本
html+css判断各个IE浏览器版本 在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了. 在HT ...