Codeforces 809C - Find a car(找性质)
首先拿到这类题第一步肯定要分析题目给出的矩阵有什么性质。稍微打个表即可发现题目要求的矩形是一个分形。形式化地说,该矩形可以通过以下方式生成:\(A_n\) 为一个 \(2^n\times 2^n\) 的矩阵,\(A_0=[1]\),\(A_i=\begin{bmatrix}A_{i-1}&A'_{i-1}\\A'_{i-1}&A_{i-1}\end{bmatrix}\),其中 \(A'_{i}\) 也是一个 \(2^i\times 2^i\) 的矩阵,其第 \(x\) 行 \(y\) 列的元素为 \(A_i\) 第 \(x\) 行 \(y\) 列的元素加上 \(2^i\)。
接下来就是我想不到的地方了,碰到这类生成方式与二进制联系异常紧密的矩阵,我们要尝试将其与位运算建立联系。这里就有一个性质,那就是该矩阵第 \(x\) 行第 \(y\) 列的数为 \((x-1)\oplus(y-1)+1\),证明可以大力归纳,应该不难,这里就不再赘述了。要说怎么发现的我也不知道,反正对于我这类没脑子选手肯定是想不到的咯。
于是此题可以转化为求 \(\sum\limits_{i=l_1}^{r_1}\sum\limits_{j=l_2}^{r_2}(i-1)\oplus(j-1)+1[(i-1)\oplus(j-1)+1\le k]\)。看到这类矩形求和的问题首先将其差分拆成四个形如 \(\sum\limits_{i=0}^{x-1}\sum\limits_{j=0}^{y-1}i\oplus j+1[i\oplus j+1\le k]\) 的部分。于是现在问题转化为怎么求左边这坨东西。这里又有一个我想不到的套路,发现这东西长得挺像二维树状数组,因此我们可以将这个矩阵拆成 \(\log^2n\) 个形如 \([x-\text{lowbit}(x),x),[y-\text{lowbit}(y),y)\) 的子矩阵,不妨假设 \(\text{lowbit}(x)\ge \text{lowbit}(y)\),记 \(t=(x-\text{lowbit}(x))\oplus (y-\text{lowbit}(y))\),那么显然 \([x-\text{lowbit}(x),x),[y-\text{lowbit}(y),y)\) 中任意两数异或起来的值刚好是 \([t,t+\text{lowbit}(x))\) 中每个数恰好出现 \(\text{lowbit}(y)\) 次,因为 \(\forall v\in[t,t+\text{lowbit}(x)),j\in [y-\text{lowbit}(y),y)\) 都有 \(v\oplus j\in[x-\text{lowbit}(x),x)\),这个稍微想想就能想明白,因此对于所有形如 \([x-\text{lowbit}(x),x),[y-\text{lowbit}(y),y)\) 可以 \(\mathcal O(1)\) 计算贡献。因此单次时间复杂度 \(\log^2n\),总复杂度 \(T\log^2n\)。
可能有几个地方讲得不是太明白,具体看代码罢。
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define y0 y101010101010
#define y1 y010101010101
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
const int MOD=1e9+7;
const int INV2=5e8+4;
int sum(int l,int r){return 1ll*(l+r)*(r-l+1)%MOD*INV2%MOD;}
int calc(int l1,int r1,int l2,int r2,int k){
if((r1-l1+1)<(r2-l2+1)) l1^=l2^=l1^=l2,r1^=r2^=r1^=r2;
int tl=(l1^l2)&~(r1-l1),tr=min(tl+r1-l1,k-1);
if(tl>k-1) return 0;return 1ll*(r2-l2+1)*sum(tl+1,tr+1)%MOD;
}
int solve(int x,int y,int k){
int ans=0;
for(int i=x;i;i&=(i-1)) for(int j=y;j;j&=(j-1))
ans=(ans+calc(i&(i-1),i-1,j&(j-1),j-1,k))%MOD;
// printf("%d %d %d %d\n",x,y,k,ans);
return ans;
}
int main(){
int qu;scanf("%d",&qu);
while(qu--){
int x1,y1,x2,y2,k;scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&k);
printf("%d\n",((solve(x2,y2,k)-solve(x2,y1-1,k)-solve(x1-1,y2,k)+solve(x1-1,y1-1,k))%MOD+MOD)%MOD);
}
return 0;
}
/*
1
6 3 9 5 1
*/
Codeforces 809C - Find a car(找性质)的更多相关文章
- Codeforces 698F - Coprime Permutation(找性质)
Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这个 D1F 比某道 jxd 作业里的 D1F 质量高多了啊,为啥这场的 D 进了 jxd 作业而这道题没进/yun 首先这 ...
- Codeforces 1408I - Bitwise Magic(找性质+集合幂级数)
Codeforces 题面传送门 & 洛谷题面传送门 Yet another immortal D1+D2 I %%%%%% 首先直接统计肯定是非常不容易的,不过注意到这个 \(k\) 非常小 ...
- Codeforces 1442D - Sum(找性质+分治+背包)
Codeforces 题面传送门 & 洛谷题面传送门 智商掉线/ll 本来以为是个奇怪的反悔贪心,然后便一直往反悔贪心的方向想就没想出来,看了题解才发现是个 nb 结论题. Conclusio ...
- codeforces 809C Find a car
codeforces 809C Find a car 题意 有个\(1e9*1e9\)的矩阵,行 \(x\) 从上到下递增,列 \(y\) 从左到右递增.每个格子有一个正值.\((x, y)\) 的值 ...
- Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)
Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...
- Codeforces 1264F - Beautiful Fibonacci Problem(猜结论+找性质)
Codeforces 题面传送门 & 洛谷题面传送门 一道名副其实(beautiful)的结论题. 首先看到这道设问方式我们可以很自然地想到套用斐波那契数列的恒等式,注意到这里涉及到 \(F_ ...
- Codeforces 1413F - Roads and Ramen(树的直径+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 其实是一道还算一般的题罢--大概是最近刷长链剖分,被某道长链剖分与直径结合的题爆踩之后就点开了这题. 本题的难点就在于看出一个性质:最长路 ...
- Codeforces 526G - Spiders Evil Plan(长链剖分+直径+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 %%%%% 这题也太神了吧 storz 57072 %%%%% 首先容易注意到我们选择的这 \(y\) 条路径的端点一定是叶子节点,否则我 ...
- Codeforces 1188E - Problem from Red Panda(找性质+组合数学)
Codeforces 题面传送门 & 洛谷题面传送门 咦,题解搬运人竟是我? 一道很毒的计数题. 先转化下题意,每一次操作我们可以视作选择一种颜色并将其出现次数 \(+k\),之后将所有颜色的 ...
随机推荐
- Seata分布式事务失败通知
一.背景 在我们使用Seata作为分布式事务时,有些时候我们的分布式时候并不是每次都可以成功的,而对于这些失败的分布式事务就需要进行通知.这篇文章简单记录一下如何实现通知. 二.功能实现 此处模拟邮件 ...
- Spring Cloud Alibaba整合Sentinel
Spring Cloud Alibaba 整合 Sentinel 一.需求 二.实现步骤 1.下载 sentinel dashboard 2.服务提供者和消费者引入sentinel依赖 3.配置控制台 ...
- 简明教程 | Docker篇 · 其一:基础入门
了解Docker Docker是什么 Docker是指容器化技术,用于支持创建和使用 Linux 容器,同时Docker也是软件容器平台. 什么是容器(container) 容器是主机上与其他进程隔离 ...
- 单片机stm32零基础入门之--初识STM32 标准库
CMSIS 标准及库层次关系 因为基于Cortex 系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难.为了解决不同的芯片厂商生产的Co ...
- (转载)关于Linux C函数strtok的使用要点
今天遇到了处理字符串的问题,比如分割问题,但是一时间想不起来什么方法,也不想手写一个类似java String中的split函数,于是百度了一下,发现了strtok这个好用的方法,以此作为总结. st ...
- linux基本命令二
组管理与权限管理 文件/目录所有者 修改文件所有者 chown 用户名 文件名 创建文件所在组 groupadd 修改文件所在组 chgrp 组名 文件名 其他组:除文件的所有者和所在组的用 ...
- OpenAPITools 实践
OpenAPITools 可以依据 REST API 描述文件,自动生成服务端桩(Stub)代码.客户端 SDK 代码,及文档等.其是社区版的 Swagger ,差异可见:OpenAPI Genera ...
- 南大《软件分析》课程笔记——Data Flow Analysis
南大<软件分析>--Data Flow Analysis @(静态分析) 目录 数据流分析概述 数据流分析应用 Reaching Definitions Analysis(may anal ...
- Vue3学习(十一)之 table表格组件的使用
一.前言 大约有两周没学习更文,不是懒,而是没心情,相亲路屡战屡败,着实很影响心情. 我想这世上对我而言,最难的事,莫过于恋爱结婚了,再一次经历了见光死的高光时刻. 二.又见Ant Design Vu ...
- 我罗斯方块最终篇(Block类)
负责的任务 完善Block类的相关函数及变量: 对Block类中函数进行调整改进,并于其他人负责的类相互配合: 对Block类的函数功能进行调试: github项目地址. 效果图 具体可见总篇,一下仅 ...