第一篇ABC题解

开始时间:\(2024/8/10\)

A:

模拟即可

B:

模拟即可

C:

不是,哥们。

这不就是纯纯的唐氏 set 板子吗?

对于指令一,我们将 \(x\) 放入 \(set\) 中,并维护一个桶,统计该元素的个数。

对于指令二,判断桶中该元素减一后是否不为零,否则就要把 \(set\) 中的元素弹出。

最后一个就直接输出 set.size() 就行了。

// LUOGU_RID: 172115170
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
const int mod=1;
int ksm(int x,int k)
{
	int ans=1,base=x;
	while(k)
	{
		if(k&1) ans=1ll*ans*base%mod;
		base=1ll*base*base%mod; k>>=1;
	}
	return ans;
}
int read()
{
	int f=1,x=0;char ch;
	do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
	do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
	return f*x;
}
int n;
set<int>s;
int t[N];
signed main()
{
	n=read();
	while(n--)
	{
		int opt,x;
		opt=read();
		if(opt==1)
		{
			x=read();
			s.insert(x);
			t[x]++;
		}
		else if(opt==2)
		{
			x=read();
			if(t[x])
			{
				t[x]--;
				if(!t[x])
					s.erase(x);
			}	
			
		}
		else
		{
			cout<<s.size()<<'\n';
		}
	}
	return 0;
}

D:

省流:三位前缀和。

了解二维的前缀和就可以刀这道题了。

对于三位前缀和,我们就用数组输入的每一个值记录来预处理。式子为:

\[f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]+f[i][j][k-1]-f[i-1][j-1][k]-f[i][j-1][k-1]+f[i-1][j][k-1]+f[i-1][j-1][k-1]+a[i][j][k] \]

然后在输出时照着上述式子稍作改动即可。

输出的式子为:

\[f[r1][r2][r3]-f[l1-1][r2][r3]-f[r1][l2-1][r3]-f[r1][r2][l3-1]+f[l1-1][l2-1][r3]+f[r1][l2-1][l3-1]+f[l1-1][r2][l3-1]-f[l1-1][l2-1][l3-1] \]

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=114514;
const int mod=1;
int ksm(int x,int k)
{
	int ans=1,base=x;
	while(k)
	{
		if(k&1) ans=1ll*ans*base%mod;
		base=1ll*base*base%mod; k>>=1;
	}
	return ans;
}
int read()
{
	int f=1,x=0;char ch;
	do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
	do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
	return f*x;
}
int n,q;
int a[105][105][105];
int f[105][105][105];
signed main()
{
	n=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
			{
				a[i][j][k]=read();
				f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]+f[i][j][k-1]-f[i-1][j-1][k]-f[i][j-1][k-1]-f[i-1][j][k-1]+f[i-1][j-1][k-1]+a[i][j][k];
			}
	q=read();
	while(q--)
	{
		int l1,r1,l2,r2,l3,r3;
		l1=read();
		r1=read();
		l2=read();
		r2=read();
		l3=read();
		r3=read();
		cout<<f[r1][r2][r3]-f[l1-1][r2][r3]-f[r1][l2-1][r3]-f[r1][r2][l3-1]+f[l1-1][l2-1][r3]+f[r1][l2-1][l3-1]+f[l1-1][r2][l3-1]-f[l1-1][l2-1][l3-1]<<'\n';
	}
	return 0;
}
posted @ 2024-08-10 14:50  yegengghost  阅读(21)  评论(0)    收藏  举报