当前位置: 首页 > 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.jsqmd.com/news/866771/

相关文章:

  • Burp Suite XSS实战:从上下文识别到Payload绕过全链路
  • 题解:P15220 [SWERC 2017] Macarons
  • 通过TaotokenCLI工具一键配置多开发环境下的AI模型调用参数
  • Go语言Web应用部署与运维实战
  • 收藏 | 程序员小白必看:解码Transformer核心模块,轻松入门大模型底层逻辑
  • 2026年全屋定制厂家推荐排行榜:电视柜、餐边柜、鞋柜等各类定制柜,专业生产与品质之选! - 资讯纵览
  • 你的知识库还在用关键词搜索?2026年必须升级的3类向量-图-推理混合引擎(附迁移成本测算表)
  • 2026做GEO优化必避的行业乱象!专业平台剪流GEO规避所有风险 - 资讯纵览
  • Java 集合反序列化漏洞如何修复避免远程代码执行风险
  • Paladin Anim Set深度调优:Unity战斗系统动画集成指南
  • Unity版本降级实战:跨版本兼容性修复指南
  • 十大排序算法Python实现与可视化:从原理到工程实践
  • 工厂数据看板是什么?有什么推荐?
  • Agent Skills 到底解决了什么,又没解决什么?
  • 2026年报考指南:重庆工程学院的校园环境及设施怎么样? - 品牌2025
  • 题解:P15402 [NOISG 2026 Prelim] Digits
  • 大型SaaS系统数据范围权限设计:从RBAC到动态数据域的实战解析
  • 论服务网格(Istio/Linkerd)在微服务治理中的应用
  • AI经济学:倒置的价值链
  • 2026年CNAS资质咨询机构推荐:专业CNAS资质辅导机构实力解析 - 资讯纵览
  • RISC-V开发板GPIO点灯实战:从环境搭建到RT-Thread驱动编程
  • Go Web中间件机制深度剖析与实战
  • 2026失效分析:解读制造业三大核心趋势 - 资讯纵览
  • Wren AI革新:让AI智能体成为世界级数据分析师的开放上下文层
  • 对抗性深度强化学习在自动驾驶可靠性评估中的实践
  • Quark卡片电脑:极致迷你的Linux系统与嵌入式开发实战
  • SaaS系统数据范围权限设计:从RBAC/ABAC到高性能实现
  • 现在不部署DeepSeek到百度智能云,3个月后将无法接入文心一言生态?深度解析BFE网关策略变更倒计时
  • 无锡中小型企业抖音运营服务实测:三家本土机构能力解析 - 资讯纵览
  • 大模型岗位傻傻分不清?收藏这份指南,小白也能轻松入行!