热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gym102222KVertexCovers(高维前缀和,meetinthemiddle)相关的知识介绍及解题思路

本文主要介绍了gym102222KVertexCovers(高维前缀和,meetinthemiddle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,希望对你有一定的参考价值。


题意:给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,问所有点覆盖的权值之和膜q

n<=36, 1<=a[i]<=1e9,1e8<=q<=1e9

思路:n<=36,考虑middle in the middle分成两个点数接近的点集L和R

对于L,枚举其子集S,判断S能否覆盖所有L内部的边,预处理出所有合法的S的超集的贡献

对于R,枚举其子集T,判断T能否覆盖所有R内部的边,如果可以则可以推出L,R之间在确定R中选T的前提下左边至少需要选点集T’,答案即为T的点权之积*T’的超集的点权积之和

对于判断覆盖和根据T推T‘使用了大量位运算加速

需要注意的是如果二进制左右移位可能超边界则要使用ull


1 #include
2 using namespace std;
3 typedef long long ll;
4 typedef unsigned int uint;
5 typedef unsigned long long ull;
6 typedef pair<int,int> PII;
7 typedef pair Pll;
8 typedef vector<int> VI;
9 typedef vector VII;
10 //typedef pairP;
11 #define N 300010
12 #define M 2000010
13 #define fi first
14 #define se second
15 #define MP make_pair
16 #define pb push_back
17 #define pi acos(-1)
18 #define mem(a,b) memset(a,b,sizeof(a))
19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
21 #define lowbit(x) x&(-x)
22 #define Rand (rand()*(1<<16)+rand())
23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
24 #define ls p<<1
25 #define rs p<<1|1
26
27 const //ll MOD=1e9+7,inv2=(MOD+1)/2;
28 double eps=1e-6;
29 int INF=1e9;
30 int dx[4]={-1,1,0,0};
31 int dy[4]={0,0,-1,1};
32
33 ull s[M];
34 ll a[N],f[N];
35
36 int read()
37 {
38 int v=0,f=1;
39 char c=getchar();
40 while(c<48||57if(c==-) f=-1; c=getchar();}
41 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
42 return v*f;
43 }
44
45 int isok1(int S,int l,int r)
46 {
47 rep(i,l,r)
48 if(!(S>>i&1))
49 {
50 ull now=((s[i]<<(63-r))>>(63-r));
51 if((now&S)!=now) return 0;
52 }
53 return 1;
54 }
55
56 int isok2(int S,int l,int r,int mid)
57 {
58 rep(i,l,r)
59 if(!(S>>i&1))
60 {
61 ll now=(s[i+mid]>>mid);
62 if((now&S)!=now) return 0;
63 }
64 return 1;
65 }
66
67 int main()
68 {
69 int cas=read();
70 rep(v,1,cas)
71 {
72 int n=read(),m=read();
73 ll MOD;
74 scanf("%I64d",&MOD);
75 int mid=n/2;
76 rep(i,0,n-1) scanf("%I64d",&a[i]);
77 mem(s,0);
78 rep(i,1,m)
79 {
80 int x=read(),y=read();
81 x--; y--;
82 s[x]|=1ll<<y;
83 s[y]|=1ll<<x;
84 }
85 int S1=(1<1;
86 rep(i,0,S1) f[i]=0;
87 rep(i,0,S1)
88 {
89 ll t=1;
90 rep(j,0,mid-1)
91 if(i>>j&1) t=t*a[j]%MOD;
92 if(isok1(i,0,mid-1)) f[i]=t;
93 }
94
95 rep(i,0,mid-1)
96 rep(j,0,S1)
97 if(!(j>>i&1)) f[j]=(f[j]+f[j^(1<MOD;
98
99 int S2=(1<<(n-mid))-1;
100 ll ans=0;
101 rep(i,0,S2)
102 {
103 ll t=1;
104 rep(j,0,n-mid-1)
105 if(i>>j&1) t=t*a[j+mid]%MOD;
106 if(isok2(i,0,n-mid-1,mid))
107 {
108 ll base=0;
109 rep(j,0,mid-1)
110 {
111 ull now=(s[j]>>mid);
112 if((now&i)!=now) base|=1<<j;
113 }
114 ans=(ans+t*f[base]%MOD)%MOD;
115 }
116 }
117 printf("Case #%d: ",v);
118 printf("%I64d
",ans);
119 }
120 return 0;
121 }

 


推荐阅读
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
author-avatar
崔显莉京_716
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有