C - Balls and Bag Query题解
题意
没什么好说的,给出q次查询,进行求解
思路
很简单的一道题,但这篇题解的作用是引出unordered_set,这个东西的作用类似set,但没有排序,相当于哈希。
unordered_set有几种操作,接下来介绍三种
- insert,没什么可说的,普通的插入
- erase,进行弹出
- 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;
}
}
}
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