首页 > 其他分享 >情书密码 (树状数组)

情书密码 (树状数组)

时间:2024-02-18 20:11:46浏览次数:27  
标签:树状 int 情书 cin 密码 数组 绝恋

题目

问题描述

有消息称:绝恋找到了自己的Miss Right,正准备自己的表白。绝恋已经写好了情书,但为了避免其它人截获,他对情书进行加密。
为了打探绝恋的私密,你冒着生命危险终于搞到了这封情书。原以为可以轻易将情书解密,结果竟然发现聪明的绝恋并没有直接写出加密用的密码,而是在那粉红色的信纸背面写着“T=你的幸运数字”。
就这么放弃了吗?不,作为一个高智商的OIer,你决不轻言放弃。你还搞到了绝恋做密码时的草稿,通过一定的分析,你发现草稿中隐藏了绝恋的密码,具体规则如下:
草稿纸上写着一个N*M 的矩阵,每个位置都有一个数字C,绝恋对该矩阵不断进行操作,有时会修改某一位置的值,还不时计算出一个矩形内特定数字的个数作为密码的一部分,绝恋十分聪明,他进行了许多次这样的操作,因此密码也异常复杂,但是你已经下定决心要算出密码了,所以你一定要算出来!!

输入格式:

第一行有两个数字N,M
接下来N 行,每行M 个数,第i+1 行第j 个数表示格子(i,j)的初始值。
接下来一个整数Q
接下来Q 行,每行描述一个操作
操作1:1 X Y C,表示将格子(X,Y)的权值改为C
操作2:2 X1 X2 Y1 Y2 C,表示询问矩形内有多少个位置的权值为C。X1 X2分别为矩形横坐标中的最小值和最大值,Y1 Y2为矩形纵坐标中的最小值和最大值。

输出格式:

对于每一个操作2,输出一个整数表示答案,每数一行。

样例输入:

3 3
1 2 3
3 2 1
2 1 3
3
2 1 2 1 2 1
1 2 3 2
2 2 3 2 3 2

样例输出:

1
2

数据范围:

对于30%的数据:1<=N,M<=30,Q<=50000
对于100%的数据:1<=N,M<=300,Q<=200000,C<=100
对于所有操作1:1<=X<=N,1<=Y<=M
对于所有操作2:1<=X1<=X2<=N,1<=Y1<=Y2<=M

思路

直接暴力枚举显然是不可能得满分的,因此我们可以换个思路:树状数组(如果你连树状数组都不知道是什么,那么打暴力当然是最明智的选择~(≧▽≦))
以下是暴力代码(引用自某位OIer

代码君
#include<bits/stdc++.h>
using namespace std;
const int N=300+5;
int n,m,q,a[N][N];
int x,y,xx,yy,z,f;
int main(){
//    freopen("test.in","r",stdin);
//    freopen("test2.out","w",stdout);
    cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	cin>>q;
	while(q--){
		cin>>f;
		if(f==1){
			cin>>x>>y>>z;
			a[x][y]=z;
		}
		else{
			cin>>x>>xx>>y>>yy>>z;
			int ans=0;
			for(int i=x;i<=xx;i++){
				for(int j=y;j<=yy;j++){
					if(a[i][j]==z)ans++;
				}
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}

由于是一个矩阵,所以不难想到是一个二维树状数组。但不同的是,树状数组求的是前缀和,而本题需要查找某个指定数的个数,因此我们可以令加一个维度用来记录个数。
代码有注释哦~(^_−)☆

ACcode

代码君
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x3f3f3f3f
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
const int N=305;
int a[N][N],c[N][N][N],n,m;//a[][]代表矩阵,存储原数据,c[][][]代表树状数组
int lowbit(int x){
	return x&(-x);
} 
void add(int x,int y,int past,int now){
	for(int i=x;i<=N;i+=lowbit(i)){
		for(int j=y;j<=N;j+=lowbit(j)){
			c[i][j][past]--;//减去原数据
			c[i][j][now]++;//加上现更新的数据
		}
	}
}
int getsum(int x,int y,int z){//指定数的个数
	int sum=0;
	for(int i=x;i>0;i-=lowbit(i)){
		for(int j=y;j>0;j-=lowbit(j)){
			sum+=c[i][j][z];
		}
	}
	return sum;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=n;j++){
    		cin>>a[i][j];
			add(i,j,0,a[i][j]);//将0改为输入数据
		}
	}
	int t=0;
	cin>>t;
	while(t--){
		int K;
		cin>>K;
		if(K==1){
			int x,y,z;
			cin>>x>>y>>z;
			add(x,y,a[x][y],z);//将原数据改为更新的数据
			a[x][y]=z;//原数组也要更新
		}
		if(K==2){
			int x1,x2,y1,y2,z,sum=0;
			cin>>x1>>x2>>y1>>y2>>z;
			sum=getsum(x2,y2,z)-getsum(x1-1,y2,z)-getsum(x2,y1-1,z)+getsum(x1-1,y1-1,z);//二维前缀和计算公式
			cout<<sum<<"\n";
		}
	}
    return Elaina;
}

都看到这了,真的不点个赞吗(>ω<*)

标签:树状,int,情书,cin,密码,数组,绝恋
From: https://www.cnblogs.com/Elaina-0/p/18019893

相关文章

  • 学习笔记#4:树状数组和 LIS
    学习笔记#4:树状数组和LIS前言:树状数组是和线段树类似的数据结构,更确切的说,树状数组能解决的问题,线段树都能解决,而线段树还能解决一些树状数组所不能解决的问题。因此线段树的应用范围比树状数组更广泛。但是,树状数组的常数更小,在同样的\(\text{O}(n\logn)\)复杂度下,树状数......
  • 用好内存从数组开始
    数组就是将相同数据的多个数据连续排列在内存中的一个元素序列。数组是使用内存的基础,数组之所以是使用内存的基础,是因为它反映的就是内存的物理结构本身,使用数组可以提高编程效率,在循环中使用数组可以用很短的代码按顺序读取或写入数组元素。栈和队列都是无需指定地址和下标就可......
  • 树状数组
    HH的项链看到这题,我首先想到了用flag[]数组标记,很明显这是必需的。但随着代码进行,又会遇到一个问题:如1212,如果按照正常标记后面两个就不会被标记,那遍历3到4时,结果为0。顺着思路想,如果我们在用完一次后把它丢掉,重新遍历,这也就导致我们必须要采用一种有序遍历,从而让后面的更......
  • 请编写函数fun,它的功能是:求出1到100之内能被7或者11整除, 但不能同时被7和11整除的所有
    /2.请编写函数fun,它的功能是:求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整数,并将他们放在a所指的数组中,通过n返回这些数的个数/#include<stdio.h>#include<string.h>intfun(int*buf){inti=1,j=0;for(i=1;i<100;i++){if(i%7==......
  • 1.m个人的成绩存放在score数组中,请编写函数fun, 它的功能是:将低于平均分的人数作为函
    /1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指1定的数组中。/#include<stdio.h>#include<string.h>intfun(int*buf,int*buff,intnum){inti=0,j=0,sum=0;for(i=......
  • 1.1 - numpy数组的属性和创建
    1.1.1numpy数组Numpy(NumberPython)是Python进行科学计算的一个扩展库,提供了大量的函数和操作,主要用于对多维数组执行计算。Numpy数组中的每个元素都有相同的类型;并且数组大小是不可变的,修改数组大小将会创建新的数组。而python的列表类型list则会动态的扩展长度。1.1.......
  • 树状数组
    从这边抄(借鉴)的这是一个完整的二叉树把它变成直角三角形下面用一维数组对应删掉多余的叶子这个就是树状数组......
  • 数据结构【树状数组】
    树状数组是线段树的衍生产物,牺牲了部分通用性,节约了空间,且大大减少了手写码量。借助树状数组,我们可以用O(logN)的时间复杂度来实现给定序列中长度为n的区间中元素和的计算。https://www.bilibili.com/video/BV1ce411u7qP/?spm_id_from=333.337.search-card.all.click&vd_source......
  • 字符串、向量和数组
    一、字符串1.引入库include<string>usingstd::string;2.初始化strings(10,'c');//直接初始化strings1("hello");//直接初始化strings2="hello";//拷贝初始化3.操作(1)s+="world"//左值引用(返回值),避免拷贝(2)st......
  • 树状DP心得
    说一下近日所学的主要两种题型,一个是分叉情况问题,一种是树上背包问题。分叉情况问题具体的题可以参考小胖守皇宫和三色二叉树。点击查看代码小胖守皇宫#include<bits/stdc++.h>usingnamespacestd;constintN=2000;vector<int>son[N];intfa[N],h[N],f[N][3];//f[0]......