首页 > 其他分享 >CF249E Endless Matrix 题解

CF249E Endless Matrix 题解

时间:2023-09-25 10:55:17浏览次数:45  
标签:dots cnt le Matrix int 题解 bmatrix ans CF249E

@

目录

Description

构造一类矩形:

先构造矩形 \(M_1=\begin{bmatrix}1\end{bmatrix}\)。

对于 \(i\geq1\),\(T_{i+1}\) 从 \(T_i\) 构造而来,方法为在最右侧和最下侧插入新的一行一列,自右上到左下 \(2i+1\) 个数分别填入 \(i^2+1,i^2+2\dots(i+1)^2\)。

比如:

  • \(M_2=\begin{bmatrix}1&2\\4&3\end{bmatrix}\)
  • \(M_3=\begin{bmatrix}1&2&5\\4&3&6\\9&8&7\end{bmatrix}\)
  • \(M_4=\begin{bmatrix}1&2&5&10\\4&3&6&11\\9&8&7&12\\16&15&14&13\end{bmatrix}\)

令左上角坐标为 \((1,1)\),从上至下第 \(i\) 行,从左至右第 \(j\) 个数的坐标为 \(i,j\)。

共 \(T\) 组询问,每次询问 \(x_1,y_1,x_2,y_2\),求 \(\sum_{x_1\le i\le x_2,y_1\le j\le y_2}M_\infty [i][j]\)。

如果答案在十位数以上,只输出答案的最后十位,前面的数位用 ...代替。

否则输出完整的答案。

前置芝士

两个公式,可以了解一下相关证明:

\(1^2+2^2+\dots+n^2=\dfrac{n\times(n+1)\times(2\times n+1)}{6}\)

\(1+2+\dots+n=\dfrac{(n+1)\times n}{2}\)

Solution

对于求一个矩形内所有数值的和,通常运用容斥来转换。

在此题上,设 \(S_{x,y}\) 为 \(\sum_{1\le i\le x,1\le j\le y}M_\infty [i][j]\)。

利用容斥:\(ans=S_{x_2,y_2}-S_{x_1-1,y_2}-S_{x_2,y_1-1}+S_{x_1-1,y_1-1}\)。

所以只要会求 \(S_{x,y}\) 就好了。

钦定 \(y\le x\)。

对于一个左上角的矩形,其一定包含一个边长为 \(y\) 的正方形。

而正方形的和就是 \(1+2+\dots+y^2\),利用等差数列求和公式得出。

剩下的一部分分类讨论。

第一种情况,红色部分为 \(((y+1)^2+(y+2)^2+\dots+x^2)\times y-(1+2+\dots+y-1)\)。

第二种情况,红色部分为 \(((y^2+(y+1)^2+\dots+(x-1)^2)+(x-y))\times y+(1+2+\dots+y-1)\)。

很明显,对于 \(S_{a,b}\),当 \(a>b\) 时为第一种情况,当 \(a\le b\) 时为第二种情况。

Code

#include<bits/stdc++.h>
using namespace std;
int t;
#define _int __int128  //不能取模,所以开__int128
_int read(){
	_int x=0,f=1;
	char ch=getchar();
	while(ch<'0'&&ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
_int calc(_int x){
	if(x==0) return 0;
	return x*(x+1)*(2*x+1)/6;  //平方和公式 
}
_int get(_int x,_int y){
	_int ans=0;
	if(x>y){
		ans+=(y*y+1)*y*y/2;  //正方形 
		_int cnt=calc(x)-calc(y);                
		ans+=cnt*y;
		ans=ans-(x-y)*y*(y-1)/2;
	}else{
		ans+=(x*x+1)*x*x/2;  //正方形 
		_int cnt=calc(y-1)-calc(x-1)+y-x;
		ans+=cnt*x;
		ans=ans+(y-x)*x*(x-1)/2;
	}
	return ans;
}
void print(_int x,int cnt){
	if(cnt==11) return;
	print(x/10,++cnt);
	putchar(x%10+'0');
	
}
void print2(_int x,bool f){
	if(x){
		print2(x/10,0);
		putchar(x%10+'0');
	}else if(f){
		putchar('0');
	}
}
void solve(){
	_int a=read(),b=read(),c=read(),d=read();
	_int ans=((get(c,d)-get(a-1,d))-get(c,b-1))+get(a-1,b-1); //容斥 
	if(ans>=10000000000){
		printf("...");
		print(ans,1);
	}else print2(ans,1);
	printf("\n");
}
int main(){
	t=read();
	while(t--){
		solve();
	}
	return 0;
}

标签:dots,cnt,le,Matrix,int,题解,bmatrix,ans,CF249E
From: https://www.cnblogs.com/larryyu/p/17727415.html

相关文章

  • nacos注册服务时网卡选择错误的问题解决方案
    nacos注册服务时网卡选择错误的问题解决方案如果本地或者服务器有安装虚拟机或者虚拟网卡,会导致应用注册nacos注册中心,导致ip错误的问题,解决方案就是在应用中增加对应配置spring:cloud:inetutils:preferredNetworks:-192.168......
  • CF1106D Lunar New Year and a Wander 题解
    CF1106D题解暑期学校军训第一天模拟赛的题,相对而言比较简单题意:题意其实很简单,就是有一个无向图,需要你从\(1\)号节点出发,然后一次遍历所有的点,输出其中字典序最小的遍历思路说说思路吧,这题既然要遍历图上所有点,那首先就会想到\(\texttt{BFS}\)或\(\texttt{DFS}\),可本题还......
  • ciscn_2019_c_1 题解
    main函数如下:int__cdeclmain(intargc,constchar**argv,constchar**envp){intv4;//[rsp+Ch][rbp-4h]BYREFinit(argc,argv,envp);puts("EEEEEEEhhiii");puts("EEmmmmmmm......
  • [JOISC 2014] 電圧 题解
    [JOISC2014]電圧题解赛时都想到了我也不知道为啥自己没敢写首先题意可以转化为,我们去掉一个边后,剩下的图可以黑白染色,同时保证去掉的边两端的点颜色相同,问这样的边数。换句话说,去掉一条边后,剩下的图应该是一个二分图。然后我们很容易想到线段树分治来处理这种问题。每次只有......
  • 题解
    题目大意有\(n\)个杯子,第\(i\)个杯子里装有\(W_i\)升水,且有\(n\)对正整数\(l_i,r_i\)。Yuri和Muri两人在玩一个游戏:两人轮流进行操作,最先不能进行操作者输。一次操作定义为:操作者选择一个杯子\(i\),从中喝掉\(x_i\)升水。对于两个人,都要满足\(x_i\in[l_i,\min(r_......
  • 【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)
    农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。FJ伤心地......
  • S16.23.12.2. 集合论 题解
    原题连接可以发现集合对称差就是异或运算。每个点都记一个长度为值域的bitset,每一位都表示根到他有没有奇数个这个数字。那么\(a_x\)改为\(v\)的修改就变成了修改子树的所有点的bitset,每次将子树中所有点的第\(a_x\)位取反,再将第\(v\)位取反。查询就是\(u\)的\(b......
  • springBoot上传文件时MultipartFile报空问题解决方法
    1.问题描述:之前用springMVC,转成springboot之后发现上传不能用。网上参考说是springboot已经有CommonsMultipartResolver了,但是我的上传后台接收的还是null。2.解决方法加入配置类importorg.springframework.context.annotation.Bean;importorg.springframework.context......
  • AT_abc321_f [ABC321F] #(subset sum = K) with Add and Erase 题解
    AT_abc321_f[ABC321F]#(subsetsum=K)withAddandErase题解题目大意现在有一个空箱子。给你两个数\(Q,K\),然后给你\(Q\)行,每一行代表一个操作:\(+x\),即向箱子里加一个权值为\(x\)的小球。\(-x\),即从箱子里把权值为\(x\)的小球拿一个出来。保证合法,即箱子......
  • CF877F 题解
    CF877F题解更好的阅读体验提供一个扫描线+根号分治做法。首先,可以把题目的条件转化成求$sum_r-sum_{l-1}=k$的区间数。考虑扫描线,当区间的右端点从$r-1$移动到$r$时,新增的区间的左端点就是所有满足$sum_{l-1}=sum_r-k,l\ler$的$l$。这时我们对$sum_{l-1}$......