题库练习 「NOI2022」二次整数规划问题
← 上一题 下一题 →

A6724 | 「NOI2022」二次整数规划问题

来源NOI
时间限制2s
内存限制1024MB
通过 / 提交0/0

题目描述

本题中,你需要解决一个著名的 NP 问题——二次整数规划问题。

二次整数规划问题要有变量:你需要给出一个长度为 $n$ 的**整数**序列 $(x_1, x_2, \ldots, x_n)$,满足下文中的所有条件。

二次整数规划问题要有约束:你给出的整数序列需要满足以下两类约束:

1. 一类约束是单个变量取值的约束:给出正整数 $k$($3 \leq k \leq 5$)和 $n$ 个区间 $[l_i, r_i]$($1 \leq i \leq n$),其中 $1 \leq l_i \leq r_i \leq k$,你给出的序列需要满足 $\forall 1 \leq i \leq n$,$l_i \leq x_i \leq r_i$;
2. 另一类约束是变量之间取值的约束:给出 $m$ 个三元组 $(p_i, q_i, b_i)$,你给出的序列需要满足 $\forall 1 \leq j \leq m$,$\lvert x_{p_j} - x_{q_j} \rvert \leq b_j$。

二次整数规划问题要有目标函数:在给出 $k-2$ 个目标参数 $v_2,v_3,\dots,v_{k-1}$(**注意下标范围为 $\boldsymbol{2}$ 至 $\boldsymbol{k-1}$**)的前提下,对于一个值域为 $[1,k]$ 的整数数列 $\{p_1,p_2,\dots,p_n\}$,设 $c_i$ 为该序列中取值为 $i$ 的元素个数,$G$ 为满足 $1 \leq i,j \leq n$ 且 $|p_i-p_j|\leq 1$ 的整数二元组 $(i, j)$ 个数,**注意当 $\boldsymbol{i \neq j}$ 时,$\boldsymbol{(i, j)}$ 与 $\boldsymbol{(j, i)}$ 是不同的二元组**。定义该序列的**权值**为

$$ W(p_1, p_2, \ldots, p_n) = 10^6 G+\sum_{i=2}^{k-1} c_i v_i \text{。} $$

你的序列需要在满足以上两类约束的情况下,最大化其权值。在给出的约束下,保证存在满足约束的序列。

二次整数规划问题不一定要有多组询问,但是我们会给出 $q$ 次询问,每次询问给出不同的权值参数 $v_2, v_3, \ldots, v_{k-1}$,对于每组询问你需要找到满足约束的最大化权值的序列。为了减少输出量,你只需要输出这个序列的权值。

输入格式

从文件 qip.in 中读入数据。

**本题有多组测试数据。**

第一行一个非负整数和一个正整数 $C, T$,分别表示测试点编号和测试数据数量。$C = 0$ 表示该组数据为样例。

对于每组测试数据,第一行四个整数 $k, n, m, q$,描述序列值域、序列长度、变量之间约束的个数和询问次数。

接下来 $n$ 行每行两个整数 $l_i, r_i$,描述序列中每个元素对应的取值区间。

接下来 $m$ 行每行三个整数 $p_j, q_j, b_j$,描述一个变量之间的约束。

接下来 $q$ 行每行 $k - 2$ 个非负整数 $v_2, v_3, \ldots, v_{k - 1}$ 描述一组询问的权值参数。

输出格式

输出到文件 qip.out 中。

对于每组数据的每组询问输出一行一个整数,表示序列权值的最大值。
C++ 编辑器
输入
输出