AtCoder Beginner Contest 366 C,D题解

C - Balls and Bag Query题解

题意

没什么好说的,给出q次查询,进行求解

思路

很简单的一道题,但这篇题解的作用是引出unordered_set,这个东西的作用类似set,但没有排序,相当于哈希。

unordered_set有几种操作,接下来介绍三种

  1. insert,没什么可说的,普通的插入
  2. erase,进行弹出
  3. size,返回大小

有了这个容器,解决这道题就很容易了

代码

#include <bits/stdc++.h>
using namespace std;
unordered_set<int> js;
int jss[1000006],q;
int main()
{
	cin >> q;
	for (int i=1; i<=q;i++)
	{
		int dj,x;
		cin >> dj;
		if (dj==1)
		{
			cin>>x;
			js.insert(x);
			jss[x]+=1;
		}
		else if (dj==2)
		{
			cin >> x;
			if (--jss[x]==0)
			{
				js.erase(x);
			}
		}
		else
		{
			cout << js.size()<<endl;
		}
	}
}

优化

1

我们可以注意到,空间复杂度是O(max(ai))的,关键是jss数组的使用,所以我们可以直接用一个pair把jss,js数组合为一体,把最差空间复杂度直接优化到O(N)

2

偶然间发现了一个容器unordered_multiset,这个东西类似unordered_set,但是他会把相同的内容重复放置,所以说用了优化2就不用要1,而且代码更简洁

优化吐槽

可还是那句话,这道题不需要进行优化,甚至不需要unordered_set,只需要模拟。

D - Cuboid Sum Query题解

前言

估计是我太弱了,一开始我居然想的是树状数组,快给我调死了,后来才发现是前缀和。(不小心误删一次,还没有保存,只能重写一遍,怒~~~)

题意

给定n^3个数,q次询问,每次询问查询前缀和。

思路

三维前缀和的板子

//预处理
s[i][j][k] = s[i-1][j][k] + s[i][j-1][k] + s[i][j][k-1] - s[i-1][j-1][k] - s[i-1][j][k-1] - s[i][j-1][k-1] + s[i-1][j-1][k-1] + a[i][j][k]
//求解
sum[x1:x2, y1:y2, z1:z2] = s[x2][y2][z2] - s[x1-1][y2][z2] - s[x2][y1-1][z2] - s[x2][y2][z1-1] + s[x1-1][y1-1][z2] + s[x1-1][y2][z1-1] + s[x2][y1-1][z1-1] - s[x1-1][y1-1][z1-1]

注意开long long

代码

#include <bits/stdc++.h>
using namespace std;
const int mxn=105;
long long a[mxn][mxn][mxn],s[mxn][mxn][mxn],n,q;
int main()
{
	cin >> n;
	for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			for (int k=1; k<=n; k++)
			{
				cin >> a[i][j][k];
				s[i][j][k] = s[i-1][j][k] + s[i][j-1][k] + s[i][j][k-1] - s[i-1][j-1][k] - s[i-1][j][k-1] - s[i][j-1][k-1] + s[i-1][j-1][k-1] + a[i][j][k];
			}
		}
	}
	cin >> q;
	for (int i=1; i<=q; i++)
	{
		int x1,x2,y1,y2,y3,z1,z2;
		cin >> x1>>x2>>y1>>y2>>z1>>z2;
		cout <<s[x2][y2][z2] - s[x1-1][y2][z2] - s[x2][y1-1][z2] - s[x2][y2][z1-1] + s[x1-1][y1-1][z2] + s[x1-1][y2][z1-1] + s[x2][y1-1][z1-1] - s[x1-1][y1-1][z1-1]<<endl;
	}
}

总结

很水的一道题,感觉只配T2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值