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

情书密码—树状数组

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

题目描述
有消息称:绝恋找到了自己的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。 
分别为矩形横坐标中的最小值和最大值,为矩形纵坐标中的最小值和最大值。

输出格式
对于每一个操作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

思路:

直接暴力枚举的呢毫无疑问是会T的,因此我们考虑用树状数组这一快捷方法

这题也是一个很明显的二维树状数组,但,不同的是:树状数组求前缀和,这里由于需要查找某个数的个数,因此我们把前缀和改为一个数组,令这个数组的第i项表示数字i的个数,那么,树状数组就变为了一个三维的数组;

AC code:

#include<bits/stdc++.h>
using namespace std;
const int N=310;
int m,n,a,s[N][N],f[N][N][N];
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<=m;j+=lowbit(j)){
			f[i][j][past]--;//记得原始数据减一
			f[i][j][now]++;
		}
}
int sum(int x,int y,int z){//求f个数
	int res=0;
	for(int i=x;i>0;i-=lowbit(i))
		for(int j=y;j>0;j-=lowbit(j)){
			res+=f[i][j][z];
		}
	return res;
}
int find(int x1,int x2,int y1,int y2,int z){
	int ans=0;
	ans=sum(x1-1,y1-1,z)+sum(x2,y2,z)-sum(x1-1,y2,z)-sum(x2,y1-1,z);//前缀和
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			scanf("%d",&s[i][j]);
			add(i,j,0,s[i][j]);
		}
	scanf("%d",&a);
	int k,c;
	for(int i=1;i<=a;i++){
		scanf("%d",&k);
		if(k==1){
			int x,y;
			scanf("%d%d%d",&x,&y,&c);
			int p=s[x][y];
			s[x][y]=c;
			add(x,y,p,c);
		}
		if(k==2){
			int x1,y1,x2,y2;
			scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c);
			int tot=find(x1,x2,y1,y2,c);
			printf("%d\n",tot);
		}
	}
	return 0;
}

如有错误,欢迎大佬们在评论区指正~

#一名爱玩狂铁的oier#

标签:树状,int,情书,密码,数组,绝恋
From: https://www.cnblogs.com/hzoiwzs/p/18023742

相关文章

  • golang数组&切片&map
    数组数组声明funcmain(){ /*语法一*///数组名字[数组长度]数组类型 //声明一个数组长度为3类型是int会初始化为int类型的零值,默认值是[000] //声明数组的时候指定长度是一个常量,数组的不可改变,超出长度会报错 vararr[3]int //数组赋值 arr[0]=1......
  • 代码随想录算法训练营第二十三天 | 538.把二叉搜索树转换为累加树, 108.将有序数组转
     669.修剪二叉搜索树 已解答中等 相关标签相关企业 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树 不应该 改变保留在树中的元素的相对结构(即,如果......
  • 【学习笔记】后缀数组(SA)
    前言先把SA给写出来,SAM暂时还没学会,学会了应该也不会写,因为构造过程过于繁琐。本文可能对SA的算法流程和代码实现上的介绍相对简略,主要介绍一些常见用途。约定无特殊说明字符串的下标从\(1\)开始。无特殊说明\(s\)表示字符串,\(n\)表示字符串长度。“后缀\(i\)”......
  • Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化
    全文链接:https://tecdat.cn/?p=33566原文出处:拓端数据部落公众号生成对抗网络(GAN)是一种神经网络,可以生成类似于人类产生的材料,如图像、音乐、语音或文本。最近我们被客户要求撰写关于GAN生成对抗性神经网络的研究报告,包括一些图形和统计输出。近年来,GAN一直是研究的热门话题。F......
  • 数组扁平化
    普通的递归实functionflatten(arr){letresult=[];for(leti=0;i<arr.length;i++){if(Array.isArray(arr[i])){result=result.concat(flatten(arr[i]));}else{result.push(arr[i]);}}returnresult;}reducefu......
  • 晚上调代码时写对拍程序之——为了不手写平衡树而乱搞的可支持随机访问、快速插入、快
    前言由于需要一个可支持随机访问、快速插入、快速删除的数据结构,但是我除了平衡树实在是想不到别的东西了,于是就乱搞出了一个这样的东西——abstract数组。但是,这玩意好像码量和平衡树差不多......不过!我认为她还是有优点的:相比起平衡树,她应该更不容易出锅?总之,不管怎么样,还是......
  • 树状数组
    树状数组区间查询,单点修改(主要求前缀和吧,改一改可以计数)单点查询,区间修改(维护差分数组)区间查询,区间修改(比较麻烦,两个树状数组维护)区间查询(基础)(看图)类似前缀和,(当成前缀和用),但是为了减少单点修改复杂度写成树状的,每点更新时向上找“根”。查询时找\(lowbit\)(二......
  • 循环可变化的集合 数组 datatable 等 || c# winfrom DataGridView 动态UI下载功能
    Gif演示   分解步骤1,使用组件DataGridView2,使用DataSource来控制表格展示的数据来源(注意:来源需要是DataTable类型)3,需要用到异步线程。如果是不控制数据源的话,需要使用UI安全线程;(使用Control.Invoke或Control.BeginInvoke方法)4,DataGridView的列如果设置图片,尽量代码......
  • 稀疏数组
    稀疏数组的一些常见问题1.什么是稀疏数组?1.1what?稀疏数组是一种针对大部分元素值为相同或者默认值的数组进行优化存储的方法。在稀疏数组中,只存储那些不同于默认值的元素及其对应的位置信息,从而节省存储空间。1.2why?稀疏数组通常用于处理大规模数组中大部分元素值相......
  • 树状数组及线段树详解
    本文章是作者调了3个多小时后,感触颇深,历经1个多小时写出来的,不喜勿喷相关内容可参考模板总结中的树状数组及线段树;进入正题树状数组所谓树状数组,即像树的数组,一般应用于求多次前缀和以及区间前缀和的问题中;其根据节点编号的二进制数的末尾0的个数划分层次,每个节点的管辖......