当前位置: 首页 > news >正文

Count 题解

时间限制:4s 空间限制:512MB

\(C\) 在上生物实验课上发现了一种独特的生物,出于生物第一的素养,小 \(C\) 决定研究一下这个独特的生物

这种生物只有两种形态,为了方便描述,小 \(C\) 将其标记为 \(0\)\(1\)

这种生物独特的地方在于它的分裂方式:

  • 对于每一个 \([0]\) 他会在原地分裂成 \(\begin{bmatrix} 0 & 0 \\ 1 & 0 \end{bmatrix}\)
  • 对于每一个 \([1]\) 他会在原地分裂成 \(\begin{bmatrix} 1 & 0 \\ 1 & 1 \end{bmatrix}\)

例如分裂 \(1\) 次就会形成 \(\begin{bmatrix} 0 & 0 \\ 1 & 0 \end{bmatrix}\)

例如分裂 \(2\) 次就会形成 \(\begin{bmatrix} 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 \\ 1 & 1 & 1 & 0 \end{bmatrix}\)

为了方便描述,小 \(C\) 将他们分裂后的排列情况看成一个二维矩阵,最左上角记为 \((0,0)\)

分裂 \(k\) 次就会形成一个 \(2^k * 2^k\) 的矩阵

刚开始小 \(C\) 只发现的了这种生物的基本单位 \([0]\) ,决定用显微镜观察它们

\(C\) 手上的显微镜看到的视野可以认为是一个矩阵,左上角是 \((x_1,y_1)\) ,右下角是 \((x_2,y_2)\) (相对与此生物形成的矩阵的坐标)

处于对数数的热爱,小C想知道在分裂 \(k\) 次后,他所观察到的范围内有多少个 \(1\)

\(C\) 发现这个问题太费时间了,以至于影响他去拿生物 \(rk1\) 了,所以想请你来帮他解决这个问题

\(C\) 做了很多次实验,所以共有 \(T\) 次询问

每次实验相互独立

输入格式

第一行一个数 \(T\) ,表示小 \(C\) 的询问次数
接下来 \(T\) 行,每行 \(5\) 个数,分别为 \(k,x_1,y_1,x_2,y_2\)
表示分裂 \(k\) 次时,小 \(C\) 的视野是一个左上角是 \((x_1,y_1)\) ,右下角是 \((x_2,y_2)\) 的矩形

输出格式

\(T\) 行,每行一个数,表示小 \(C\) 能看到的 \(1\) 的个数

样例

5
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 5 6 7 8
0
0
0
0
5

数据范围

本题采用子任务捆绑

\(1\le T\le 10^6\)

\(Sub1 : 30\%:0\le k \le 10\)

\(Sub2 : 100\% :0 \le k \le 20,0 \le x_1 \le x_2 < 2^k,0 \le y_1 \le y_2 < 2^k\)

这里的大样例从每个包里分别拿了一个点出来

题解

题目中的分裂规则可以看作是一个状态的转移矩阵:

  • 状态 0 分裂为:\(\begin{pmatrix} 0 & 0 \\ 1 & 0 \end{pmatrix}\)
  • 状态 1 分裂为:\(\begin{pmatrix} 1 & 0 \\ 1 & 1 \end{pmatrix}\)

如果我们将由 0 经过 \(k\) 次分裂生成的矩阵记为 \(M_k\),由 1 经过 \(k\) 次分裂生成的矩阵记为 \(N_k\),它们之间的递归结构如下:

\[M_{k+1} = \begin{pmatrix} M_k & M_k \\ N_k & M_k \end{pmatrix}, \quad N_{k+1} = \begin{pmatrix} N_k & M_k \\ N_k & N_k \end{pmatrix} \]

因为 \(x\)\(y\) 是子矩阵的范围,我们可以用二维前缀和来求解:

\[\text{Ans} = S(x_2+1, y_2+1) - S(x_1, y_2+1) - S(x_2+1, y_1) + S(x_1, y_1) \]

其中 \(S(X, Y)\) 表示以 \((0,0)\) 为左上角,长宽分别为 \(X, Y\) 的前缀矩阵中 \(01\) 数量。

我们不需要管 \(k\) 是多少(因为 \(M_k\) 永远是 \(M_{k+1}\) 的左上角)。我们只需根据 \(X\)\(Y\) 的二进制位,从低位到高位(自顶向下)三个维度的信息:

  1. R0 / R1:对应矩阵 \(M\)\(N\)\(x\) 行的全局前缀和(覆盖所有宽度)。
  2. C0 / C1:对应矩阵 \(M\)\(N\)\(y\) 列的全局前缀和(覆盖所有高度)。
  3. S0 / S1:对应矩阵 \(M\)\(N\) 严格在 \([0, x-1] \times [0, y-1]\) 范围内 \(01\) 的个数。

处理当前位时,根据 \(X\) 的第 \(i\) 位(决定上下半区)和 \(Y\) 的第 \(i\) 位(决定左右半区),用已经处理完的低位数据,和完整分形块的 \(01\) 总数 \(f_0[i-1]\)\(f_1[i-1]\) 实现 \(O(1)\) 的状态转移。

:::info[code]

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Fast_OI{char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++)#define putchar(x) (p3-obuf<1000000?*p3++=x:(fwrite(obuf,1,p3-obuf,stdout),p3=obuf,*p3++=x))int read(){int x=0;bool f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=0;c=getchar();}while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;}void puts(const char* str){while(*str!='\0')putchar(*str ++); putchar('\n'); }void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);}void flush(){fwrite(obuf,1,p3-obuf,stdout);}
}using namespace Fast_OI;
const int N=1<<21;
int n;
int f0[25],f1[25];
int query(int x,int y){if(x==0||y==0)	return 0;int r0=0,r1=0;int c0=0,c1=0;int s0=0,s1=0;int m=32-__builtin_clz(x|y);for(int i=1;i<=m;i++){int bx=(x>>(i-1))&1;int by=(y>>(i-1))&1;int nr0=0,nr1=0;int nc0=0,nc1=0;int ns0=0,ns1=0;if(bx==0){nr0=r0<<1;nr1=r0+r1;}if(bx==1){nr0=(f0[i-1]<<1)+r1+r0;nr1=f1[i-1]+f0[i-1]+(r1<<1);}if(by==0){nc1=c1<<1;nc0=c0+c1;}if(by==1){nc1=(f1[i-1]<<1)+c1+c0;nc0=f1[i-1]+f0[i-1]+(c0<<1);}if(bx==0&&by==0){ns0=s0;ns1=s1;}if(bx==0&&by==1){ns0=s0+r0;ns1=s0+r1;}if(bx==1&&by==0){ns0=s1+c0;ns1=s1+c1;}if(bx==1&&by==1){ns0=s0+c0+r1+f0[i-1];ns1=s1+c0+r1+f1[i-1];}r0=nr0,r1=nr1;c0=nc0,c1=nc1;s0=ns0,s1=ns1;}return s0;
}
signed main(){freopen("Count.in","r",stdin);freopen("Count.out","w",stdout);f0[0]=0;f1[0]=1;for(int i=1;i<=22;i++){f0[i]=3*f0[i-1]+f1[i-1];f1[i]=3*f1[i-1]+f0[i-1];}int T=read();while(T--){int k=read(),X1=read(),Y1=read(),X2=read(),Y2=read();int ans=query(X2+1,Y2+1)-query(X1,Y2+1)-query(X2+1,Y1)+query(X1,Y1);write(ans);putchar('\n');}flush();return 0;
}

:::

http://www.zskr.cn/news/1349883.html

相关文章:

  • 高速负离子吹风筒方案全解析:从原理到实战避坑指南
  • Burp Suite XSS实战:从上下文识别到Payload绕过全链路
  • 实时VLA到底值不值?从π0抓钢笔看推理速度优化与系统延迟补偿的代价
  • TCP RST (10054) 的根本原因分析:重复重传
  • Java 集合反序列化漏洞如何修复避免远程代码执行风险
  • Godot-MCP:编辑器内嵌的AI交互协议栈
  • Godot MCP协议实战:让AI真正理解你的游戏项目
  • Godot-MCP:用自然语言操控编辑器的AI工作流协议
  • 医院病历|基于Java+vue的医院病历管理系统(源码+数据库+文档)
  • 江苏话TTS上线倒计时72小时!ElevenLabs最新v3.2方言引擎实测对比:vs Azure Neural TTS 阿里云SSML方言支持度
  • 渗透测试学习路线:重建系统认知与信任模型
  • 对抗性深度强化学习在自动驾驶可靠性评估中的实践
  • Unity动态障碍物寻路:Recast+Detour实时导航落地实践
  • 掌握Windows Btrfs驱动:在Windows上体验Linux文件系统的强大功能
  • 模型即服务
  • 抖音视频批量下载终极指南:三步搞定高清无水印内容保存
  • 华为交换机VLAN通信原理与Hybrid端口实战配置详解
  • LwIP移植实战指南:从协议栈选型到内存调优的嵌入式网络开发
  • 大连合规有害生物消杀机构排行:资质与实效双维度评测
  • F-P微腔:从多光束干涉原理到光谱成像与传感的现代应用
  • 工业视觉系统设计:从像素当量到光学倍率的参数计算与选型指南
  • TrollInstallerX终极指南:iOS 14-16.6.1设备3分钟一键安装TrollStore
  • Linux LVM 终极实战指南:从 PV/VG/LV 到动态扩容、快照恢复全流程
  • UE中Alembic(ABC)导入原理与生产级管线实践
  • WrenAI:构建智能数据查询的AI代理上下文层终极指南
  • 通过TaotokenCLI工具一键配置多开发环境下的AI模型调用参数
  • 淘金币自动化脚本:5分钟解放双手,淘宝任务全自动执行终极指南
  • iOS自动化测试全链路实战:从WebDriverAgent签名到CI稳定运行
  • 在RISC-V架构芒果派上部署Node.js与EMQX物联网开发环境
  • 嵌入式工程师进阶指南:从C语言到系统架构的30万年薪技能图谱