社区讨论
Unknown Error问题
P14933[北大集训 2025] 解开尘封的序列(暂无数据)参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mkj71al3
- 此快照首次捕获于
- 2026/01/18 11:45 上个月
- 此快照最后确认于
- 2026/01/21 18:45 4 周前
代码:
CPPimport java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
// 模2^32的掩码,用于截断无符号32位整数
private static final long MASK_32 = 0xFFFFFFFFL;
public static void main(String[] args) throws IOException {
// 快速读入配置:使用StringTokenizer逐词读取,避免大数组拆分异常
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(System.out);
StringTokenizer st = new StringTokenizer(br.readLine());
// 读取基础参数
int n = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int p = Integer.parseInt(st.nextToken());
// 读取a数组
st = new StringTokenizer(br.readLine());
long[] a = new long[n];
for (int i = 0; i < n; i++) {
a[i] = Long.parseLong(st.nextToken());
}
// 读取w数组(w_i < 2^32,用long存储避免溢出,保留原数组顺序)
st = new StringTokenizer(br.readLine());
long[] w = new long[n];
for (int i = 0; i < n; i++) {
w[i] = Long.parseLong(st.nextToken()) & MASK_32;
}
// 计算M = p^d,处理d=0的情况(p^0=1),避免溢出
int M = 1;
for (int i = 0; i < d; i++) {
M *= p;
// 防护:避免极端情况(题目保证d≤12,此处仅为兼容)
if (M > 1 << 20) break;
}
// 读取z数组
st = new StringTokenizer(br.readLine());
long[] z = new long[M];
for (int i = 0; i < M; i++) {
if (st.hasMoreTokens()) {
z[i] = Long.parseLong(st.nextToken()) & MASK_32;
} else {
z[i] = 0;
}
}
// 读取询问次数q
int q = Integer.parseInt(br.readLine());
// 预处理:aDigits[i][k] 表示a[i]的第k位p进制数(低位在前,补前导0)
int[][] aDigits = new int[n][d];
for (int i = 0; i < n; i++) {
long num = a[i];
for (int k = 0; k < d; k++) {
aDigits[i][k] = (int) (num % p);
num = num / p;
}
}
// 预处理:uDigits[u][k] 表示u的第k位p进制数(低位在前,补前导0)
int[][] uDigits = new int[M][d];
for (int u = 0; u < M; u++) {
int num = u;
for (int k = 0; k < d; k++) {
uDigits[u][k] = num % p;
num = num / p;
}
}
// 复用b数组,避免频繁创建ArrayList,减少内存波动
long[] bArr = new long[n];
// 处理每个询问
while (q-- > 0) {
st = new StringTokenizer(br.readLine());
long A = Long.parseLong(st.nextToken());
long B = Long.parseLong(st.nextToken());
long C = Long.parseLong(st.nextToken());
int l1 = Integer.parseInt(st.nextToken());
int r1 = Integer.parseInt(st.nextToken());
int l2 = Integer.parseInt(st.nextToken()); // 保留1索引
int r2 = Integer.parseInt(st.nextToken());
// 步骤1:预计算wTable[aVal][uVal],存储单步贡献
long[][] wTable = new long[p][p];
for (int aVal = 0; aVal < p; aVal++) {
for (int uVal = 0; uVal < p; uVal++) {
int c1 = (Math.min(aVal, uVal) > 0) ? 1 : 0;
int c2 = (Math.max(aVal, uVal) > 0) ? 1 : 0;
int c3 = ((aVal + uVal) % p > 0) ? 1 : 0;
wTable[aVal][uVal] = (A * c1 + B * c2 + C * c3);
}
}
// 步骤2:遍历u∈[l1, r1],计算总贡献
long ans = 0;
for (int u = l1; u <= r1; u++) {
// 步骤2.1:计算所有b_i(u),复用全局数组,避免创建新集合
for (int i = 0; i < n; i++) {
long bi = 0;
for (int k = 0; k < d; k++) {
int aVal = aDigits[i][k];
int uVal = uDigits[u][k];
bi += wTable[aVal][uVal];
}
bArr[i] = bi;
}
// 步骤2.2:对bArr单独排序,得到F(u)(符合题目定义)
Arrays.sort(bArr);
// 步骤2.3:计算j∈[l2, r2]的和:∑(w[j-1] * F(u)[j-1])(转为0索引)
long intervalSum = 0;
for (int j = l2; j <= r2; j++) {
int idx = j - 1; // 1索引转0索引,避免越界
if (idx < 0 || idx >= n) continue; // 边界防护,洛谷评测环境友好
long fj = bArr[idx] & MASK_32; // F(u)_j
long wj = w[idx]; // 原数组第j位w(不随b排序变化)
long product = (fj * wj) & MASK_32;
intervalSum = (intervalSum + product) & MASK_32;
}
// 步骤2.4:计算当前u的贡献,累加至总答案
long zu = z[u] & MASK_32;
long uContribution = (zu * intervalSum) & MASK_32;
ans = (ans + uContribution) & MASK_32;
}
// 步骤3:输出结果,直接println,依赖PrintWriter缓冲区
pw.println(ans & MASK_32);
}
// 强制刷新缓冲区,确保所有输出写入标准输出
pw.flush();
pw.close();
br.close();
}
}
我的账号没有问题,自己运行乃至cmd都可以正常运行,结果也正确,可是就是在提交后
Unknown Error
求问题
回复
共 3 条回复,欢迎继续交流。
正在加载回复...