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\),之后将所有颜色的 ...
随机推荐
- Serverless Kubernetes 和 Serverless on Kubernetes 的区别
什么是 Kubernetes? Kubernetes 是一个可移植的.可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化. 什么是 Serverless ? 无服务器是一种云原 ...
- Go语言核心36讲(Go语言进阶技术四)--学习笔记
10 | 通道的基本操作 作为 Go 语言最有特色的数据类型,通道(channel)完全可以与 goroutine(也可称为 go 程)并驾齐驱,共同代表 Go 语言独有的并发编程模式和编程哲学. D ...
- 【UE4 C++】抛物线路径、发射轨道相关
基于UGameplayStatics Blueprint_PredictProjectilePath_ByObjectType 根据 Object Type,算出抛物线的点集合和检测结果 static ...
- Java序列元素替换
1.数组 直接赋值. 2.String (1) String是不可变的,只能将新的字符串重新赋给String变量.可使用substring进行拼接: String s="hello" ...
- 浅析ReDoS的原理与实践
转载于http://www.freebuf.com/articles/network/124422.html ReDoS(Regular expression Denial of Service) 正 ...
- 2021.9.25考试总结[NOIP模拟61]
终于有点阳间题了然而挂了60pts 哈哈 T1 交通 类似简单题,限制看似很复杂,但不难发现当确定一条边是否被删后会产生裙带关系,很多边会跟着自动被确定是否被删. 仔细观察可以得出这种关系会构成偶环结 ...
- shell脚本自学笔记
一. 什么是Shell脚本 shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以称为shell脚本.事实上,shell脚本就是一些命令的集合. 假如完成某个需求需要一 ...
- Oracle 11g 新建用户
create user XXXuser identified by XXXpassword;--创建用户XXXuser,设置初始密码XXXpassword alter user XXXuser ide ...
- hdu 5057 Argestes and Sequence (数状数组+离线处理)
题意: 给N个数.a[1]....a[N]. M种操作: S X Y:令a[X]=Y Q L R D P:查询a[L]...a[R]中满足第D位上数字为P的数的个数 数据范围: 1<=T< ...
- 测试平台系列(71) Python定时任务方案
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 定时任务 定时任务,顾名思义: ...