热门标签 | 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部分。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
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社区 版权所有