悬赏令
  • 板块灌水区
  • 楼主Ice_function
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/20 17:40
  • 上次更新2024/9/20 19:28:16
查看原帖
悬赏令
550471
Ice_function楼主2024/9/20 17:40

https://www.luogu.com.cn/problem/P5123

https://www.luogu.com.cn/record/177570261

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e4+10;

int a[N][6],f[6],n;string s[6][200000];int tail[6];

map <string,int> tr[6];

vector <int> S[6];

string str(int x)
{
	int y=x;
	string st="",temp="";
	while (y)
	{
		int u=y/10;u*=10;
		char t=(y-u)+'0';
		st+=t;
		y/=10; 
	}
	for (int i=st.size()-1;i>=0;i--) temp+=st[i];
	return temp;
}

signed main()
{
	scanf("%lld",&n);
	for (int i=1;i<=n;i++) scanf("%lld %lld %lld %lld %lld",&a[i][1],&a[i][2],&a[i][3],&a[i][4],&a[i][5]);
	for (int i=1;i<=n;i++) sort(a[i]+1,a[i]+6);
	for (int i=1;i<=n;i++) for (int j=2;j<=5;j++) if (a[i][j]==a[i][j-1]) a[i][j]=-1;
	
	for (int i=1;i<(1<<5);i++) S[__builtin_popcount(i)].push_back(i);
	
	f[0]=1ll*(n-1)*n/2;
	for (int p=1;p<=5;p++)
	{
		for (int e : S[p])
		{
			for (int i=1;i<=n;i++)
			{
				int x=e,q=5;
				string st="";
				while (x)
				{
					if (x & 1) st+=(" "+str(a[i][q]));
					x>>=1;
					q--;
				}
				tr[p][st]++;
				if (tr[p][st]==1) s[p][++tail[p]]=st;//;cout<<"PP"<<p<<"    "<<st<<endl;
			}
		}
	}
	
	for (int p=1;p<=5;p++)
	{
		for (int i=1;i<=tail[p];i++)
		{
			int x=tr[p][s[p][i]];
			f[p]+=(x*(x-1)/2);
		}
	}
	
	cout<<f[0]-f[1]+f[2]-f[3]+f[4]-f[5]<<endl;
	
	return 0;
}

第一个给出hack根据 nn 的规模给 20n(20-n) RMB

2024/9/20 17:40
加载中...