AT_tkppc3_d 巨大チェスボード 题解

AT_tkppc3_d 巨大チェスボード 题解

题意简述

给定 H 行 W 列的不规则棋盘:

  • 格子 (i,j)(i,j)(i,j) 颜色为国际象棋样式,(1,1)(1,1)(1,1) 为黑色,相邻格子颜色不同。
  • 第 i 行高度为 aiaiai,第 j 列宽度为 bjbjbj,格子 (i,j)(i,j)(i,j) 面积 = ai×bjai \times bjai×bj
  • Q 次询问矩形 (px,py)(px,py)(px,py) 到 (qx,qy)(qx,qy)(qx,qy),求:黑格总面积 − 白格总面积。

数据范围:H,W,Q≤105H,W,Q \leq 10^5H,W,Q≤105,ai,bi≤104ai,bi \leq 10^4ai,bi≤104,要求 O(H+W+Q)O(H+W+Q)O(H+W+Q) 算法。

核心思路

1. 贡献符号化

黑格贡献 +aibj+aibj+aibj,白格贡献 −aibj-aibj−aibj,可统一表示为:
val(i,j)=(−1)i+j⋅ai⋅bjval(i,j) = (-1)^{i+j} \cdot ai \cdot bjval(i,j)=(−1)i+j⋅ai⋅bj

2. 二维和拆分为一维乘积

∑i=pxqx∑j=pyqy(−1)i+jaibj=(∑i=pxqx(−1)iai)⋅(∑j=pyqy(−1)jbj)\sum_{i=px}^{qx}\sum_{j=py}^{qy} (-1)^{i+j}aibj = \left(\sum_{i=px}^{qx} (-1)^i ai\right) \cdot \left(\sum_{j=py}^{qy} (-1)^j bj\right)∑i=pxqx∑j=pyqy(−1)i+jaibj=(∑i=pxqx(−1)iai)⋅(∑j=pyqy(−1)jbj)

3. 前缀和预处理

定义交替前缀和:

  • sa\[i\] = 前 i 行的交替和:奇数行 +ai+ai+ai,偶数行 −ai-ai−ai
  • sb\[i\] = 前 i 列的交替和:奇数列 +bi+bi+bi,偶数列 −bi-bi−bi

区间 L,RL,RL,R 和:
sumA=saR−saL−1sumA = saR - saL-1sumA=saR−saL−1
sumB=sbR−sbL−1sumB = sbR - sbL-1sumB=sbR−sbL−1

最终答案 = sumA×sumBsumA \times sumBsumA×sumB

算法流程

  1. 读入 H,W,QH, W, QH,W,Q
  2. 预处理 aaa 数组,计算 sasasa 前缀和
  3. 预处理 bbb 数组,计算 sbsbsb 前缀和
  4. 对每个询问:
    • 计算行区间 px,qxpx,qxpx,qx 的 sumAsumAsumA
    • 计算列区间 py,qypy,qypy,qy 的 sumBsumBsumB
    • 输出 sumA×sumBsumA \times sumBsumA×sumB

复杂度分析

  • 预处理:O(H+W)O(H + W)O(H+W)
  • 单次查询:O(1)O(1)O(1)
  • 总复杂度:O(H+W+Q)O(H + W + Q)O(H+W+Q),可通过 10510^5105 规模数据

样例1解释

输入中:
a=7,35,5a = 7,35,5a=7,35,5,计算得:
sa1=7sa1=7sa1=7,sa2=7−35=−28sa2=7-35=-28sa2=7−35=−28,sa3=−28+5=−23sa3=-28+5=-23sa3=−28+5=−23

b=14,9,50b = 14,9,50b=14,9,50,计算得:
sb1=14sb1=14sb1=14,sb2=14−9=5sb2=14-9=5sb2=14−9=5,sb3=5+50=55sb3=5+50=55sb3=5+50=55

询问1:(1,1)(1,1)(1,1) 到 (2,2)(2,2)(2,2)
sumA=sa2−sa0=−28sumA = sa2-sa0 = -28sumA=sa2−sa0=−28,sumB=sb2−sb0=5sumB = sb2-sb0 = 5sumB=sb2−sb0=5 → ans=−28×5=−140ans = -28 \times 5 = -140ans=−28×5=−140

询问2:(1,1)(1,1)(1,1) 到 (3,2)(3,2)(3,2)
sumA=sa3−sa0=−23sumA = sa3-sa0 = -23sumA=sa3−sa0=−23,sumB=5sumB = 5sumB=5 → ans=−23×5=−115ans = -23 \times 5 = -115ans=−23×5=−115

与样例输出完全一致。

完整 C++ 代码

cpp 复制代码
#include <iostream>
using namespace std;
typedef long long ll;
const int M=1e5+10;
ll sa[M],sb[M],a[M],b[M];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int H,W,Q;
    cin>>H>>W>>Q;
    for(int i=1;i<=H;++i){
        cin>>a[i];
        sa[i]=sa[i-1]+(i%2?a[i]:-a[i]);
    }
    for(int i=1;i<=W;++i){
        cin>>b[i];
        sb[i]=sb[i-1]+(i%2?b[i]:-b[i]);
    }
    while(Q--){
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        ll A=sa[x2]-sa[x1-1];
        ll B=sb[y2]-sb[y1-1];
        cout<<A*B<<'\n';
    }
    return 0;
}
相关推荐
June`16 小时前
warp shuffle指令
c++·人工智能·算法·cuda
乱七八糟的屋子16 小时前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray
choumin17 小时前
C程序能调用extern “C“声明的带默认参数的C++函数吗?
c语言·c++·extern c·默认参数
AmyLin_200117 小时前
PDF 色彩保真工程实践【3】上手实践:工程结构、依赖集成与一键构建运行
c++·visualstudio·pdf·zlib·vcpkg·libtiff·cmyk
并不喜欢吃鱼17 小时前
从零开始 C++------ 十六.深度拆解 C++ 智能指针:unique_ptr/shared_ptr/weak_ptr 底层模拟、内存泄漏根治
开发语言·c++
不相心 -w-17 小时前
Cmake的基础用法
linux·开发语言·c++
撑伞的鱼993717 小时前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor
j7~18 小时前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步
王老师青少年编程18 小时前
2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷3:文末附答案
c++·答案·模拟题·2026年·青少年信息素养大赛·算法应用主题赛·决赛
程序喵大人19 小时前
【C++进阶】STL容器与迭代器 - 10 把容器、迭代器和数据流串成一个小程序
开发语言·c++·容器·小程序·迭代器·stl