第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] ...
随机推荐
- Java中的List集合
List集合继承自collection接口,他自己也是个接口,没有具体的结构,与Set集合不同,List集合允许重复的元素. List集合特有方法:(Collection中没有这些) 这些在Arral ...
- Java中基本类型的包装类
基本类型包装类: 项目中我们常常放弃基本类型,用基本类型的包装类 基本类型包装类有哪些: Int--Integer char--Character double--Double 以Intger为例讲述 ...
- php手册的一些思考
函数手册一定要认真看,很多用法都不太清楚: array array_merge ( array $array1 [, array $... ] ) array_merge() 将一个或多个数组的单 ...
- NX二次开发-使用MFC对话框不能用UF_UI_select等函数解决方法
VC/MFC调用UG Dialog要进入加锁状态 加锁 UF_UI_lock_ug_access ( UF_UI_FROM_CUSTOM ); 此处为UF_UI_select的函数 解锁 UF_UI_ ...
- Linux串口驱动程序(3)-打开设备
先来分析一下串口打开的过程: 1.用户调用open函数打开串口设备文件:2.在内核中通过tty子系统,把open操作层层传递到串口驱动程序中:3.在串口驱动程序中的xx_open最终实现这个操作.这里 ...
- C语言新手写扫雷攻略1
工欲善其事,必先利其器,首先要准备好开发环境,既然是C语言,那就不是WinAPI的扫雷,就是纯的C语言开发,但是以前的C都是TC开发的,现在用肯定是过时很久了,但是也是有解决办法的,某些大神开发出Ea ...
- PAT_A1103#Integer Factorization
Source: PAT A1103 Integer Factorization (30 分) Description: The K−P factorization of a positive inte ...
- iptables默认规则
iptables默认规则 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [34:4104] -A INPUT -m ...
- 2019年Pandas官方用户调研
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline plt.rcP ...
- json传参报错
restful接口报错: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('e' (code 101)): w ...