luogu#P15936. [TOPC 2021] A Hard Problem

[TOPC 2021] A Hard Problem

背景

滥用本题评测将被封号。

题目描述

给定一个由 nn 个节点和 mm 条边组成的简单无向图。节点编号为 11nn,边编号为 11mm。节点 ii 有一个非负整数值 ViV_i,边 {u,v}\{u, v\} 的权值 Wu,vW_{u,v} 定义为 VuVv\| V_u \oplus V_v \|,其中 \oplus 是异或运算符(等同于 C 语言中的 ^),x\| x \| 是非负整数 xx 的二进制表示中 1 的位数。

节点值 V1,V2,,VnV_1, V_2, \dots, V_n 必须满足 qq 个约束条件。每个约束条件可以表示为一个五元组 (t,u,i,v,j)(t, u, i, v, j)

  • t=0t = 0,则 getBit(Vu,i)=getBit(Vv,j)getBit(V_u, i) = getBit(V_v, j)
  • t=1t = 1,则 getBit(Vu,i)getBit(Vv,j)getBit(V_u, i) \neq getBit(V_v, j)

其中函数 getBit(x,i)getBit(x, i) 返回 xx 的第 (i+1)(i + 1) 个最低有效位。例如,getBit(11,0)getBit(11, 0) 为 1,getBit(11,2)getBit(11, 2) 为 0。在 C 语言中,若 xx 是 32 位无符号整数且 ii 是小于等于 31 的非负整数,则 getBit(x,i)getBit(x, i) 可通过 ((x >> i) & 1U) 计算。

不幸的是,当前某些节点的值缺失。你的任务是在不违反任何给定约束的条件下,为缺失的节点分配新的值,以最小化 {u,v}EWu,v\sum_{\{u,v\} \in E} W_{u,v}。请编写程序完成此任务。

输入格式

输入由五个部分组成。第一部分包含一行,该行包含两个正整数 nnmm,分别表示节点数和边数。第二部分包含 mm 行,每行包含两个整数 uuvv,表示给定图中的一条边 {u,v}\{u, v\}。第三部分包含一行,该行包含 nn 个空格分隔的整数 x1,x2,,xnx_1, x_2, \dots, x_n。对于任意 k{1,2,,n}k \in \{1, 2, \dots, n\},若节点值 VkV_k 缺失,则 xkx_k 为 -1;否则 VkV_k 等于 xkx_k。第四部分包含一个整数 qq,表示约束条件的个数。第五部分包含 qq 行,每行包含五个空格分隔的整数 t,u,i,v,jt, u, i, v, j,表示 (t,u,i,v,j)(t, u, i, v, j) 是一个约束条件。

输出格式

输出一个整数,表示在满足 qq 个约束条件下的最小值。若无法满足所有约束,则输出 -1。

4 4
1 3
1 2
3 2
0 3
-1 -1 60091 51514
2
1 2 0 1 5
0 2 6 0 15
13
3 2
0 1
1 2
-1 -1 -1
2
1 2 0 1 5
0 1 5 2 0
-1

提示

  • 1n10001 \leq n \leq 1000
  • 1m50001 \leq m \leq 5000
  • 1Vi<216-1 \leq V_i < 2^{16}
  • 0q80 \leq q \leq 8
  • t{0,1}t \in \{0, 1\}
  • 0u,v<n0 \leq u, v < n
  • 0i,j<160 \leq i, j < 16

翻译由 DeepSeek V3.2 完成