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\),之后将所有颜色的 ...
随机推荐
- django-admin和django-admin.py的区别
问题 django初学者在使用django-admin创建项目时容易出现无法创建的错误,这是因为网上很多教程用的都是django-admin.py创建的项目,不出意外的话,你输入相同的命令会发现项目没 ...
- MacOS安装使用Kettle
一.环境说明 操作系统版本:macOS Big Sur 11.6.1 机型:Intel版本 JDK版本:Amazon Corretto-openjdk8 Kettle版本:Kettle8.9 二.问题 ...
- [对对子队]发布声明Beta
Beta版本的新功能 新增的游戏内容 循环部分关卡 Beta阶段我们制作了游戏的第4-6关,为循环部分关卡.这一部分的关卡设计以编程的循环思想为基础,在流水线中加入了新的命令--循环语句,并以此为核心 ...
- logstash multi pipeline的使用
logstash multi pipeline的使用 一.背景 二.解决方案 1.方案一: 2.方案二: 3.方案三: 三.实现步骤 1.编写 pipeline 文件 1.从文件收集,输出到控制台 2 ...
- Noip模拟50 2021.9.10
已经好长时间没有考试不挂分的良好体验了... T1 第零题 开场数据结构,真爽 对于这道题首先要理解对于一条链从上向下和从下向上走复活次数相等 (这可能需要晚上躺在被窝里面脑摸几种情况的样例) 然后就 ...
- lib库无法加载的情况分析
最近升级vs2017的时候遇到无法加载库的问题,在网上查找问题,网上给出可能有三种情况导致该问题:路径是否正确:库依赖是否齐全:库版本是否正确.最直接的方法就是用depends软件去查询,是否有模块有 ...
- Linux基础是零基础必须要过的关,你懂了多少
#LINUX基础学习 ##命令行下的基础知识 Linux区分英文的大小写. date :查看时间 cal:查看日历 [Tab] 热键 :可以自动补全命令名和文件名 [Ctrl]+C 热键 :可以中断正 ...
- Spring Security 的注册登录流程
Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...
- 图像原始格式(YUV444 YUV422 YUV420)一探究竟
前段时间搞x264编码测试,传参的时候需要告诉编码器我的原始数据格式是什么,其中在x264.h头文件中定义了如下一堆类型. /* Colorspace type */ #define X264_CSP ...
- 第09课 OpenGL 移动图像
3D空间中移动图像: 你想知道如何在3D空间中移动物体,你想知道如何在屏幕上绘制一个图像,而让图像的背景色变为透明,你希望有一个简单的动画.这一课将教会你所有的一切.前面的课程涵盖了基础的OpenGL ...