Codeforces Round 899 (Div. 2) 记录

发布时间 2023-09-26 22:13:46作者: shyiaw

Codeforces Round 899 (Div. 2)

A. Increasing Sequence

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int t,n;
//map<int,bool> mp;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		//mp.clear();
		int a,x=1;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a);
			if(x==a) x++;
			x++;
		}
		printf("%d\n",x-1);
	}
}

*B. Sets and Union

点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=55;
vector<int> num[maxn],s[maxn],st;
bool book[maxn];
int main()
{
	
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,sz;
		scanf("%d",&n);
		for(int i=1;i<maxn;i++)
			num[i].clear(),s[i].clear();
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&sz); int x;
			for(int j=1;j<=sz;j++)
			{
				scanf("%d",&x);
				num[x].push_back(i);
				s[i].push_back(x);
			}
		}
		int ans=0;
		for(int i=1;i<maxn;i++)
		{
			if(num[i].size()==0) continue;
			st.clear(); int x=1;
			for(int i=1;i<maxn;i++) book[i]=false;
			for(int j=0;j<num[i].size();j++)
			{
				while(x!=num[i][j]&&x<=n) st.push_back(x),x++;
				x++;
			}
			while(x<=n) st.push_back(x),x++;
			int ansi=0;
			for(int j=0;j<st.size();j++)
			{
				for(int k=0;k<s[st[j]].size();k++)
				{
					if(book[s[st[j]][k]]) continue;
					else book[s[st[j]][k]]=true,ansi++;
				}
			}
			ans=max(ansi,ans);
		}
		printf("%d\n",ans);
	}
	return 0;
}
/*
// 错在:除了序列值完全相同的 Hash 值被删除,完全包含在被删除序列中的子序列对应的值也应被删除。
// 但只在序列长度最小的值中删值是错误的,因为我可能可以通过删除某些序列长度更大的值来得到答案。 
const int base=353,MOD=998244353;
const int basei=1e6+7,MODI=1e9+7;
struct Hash_Table
{
	ll xhash,hashi;
	Hash_Table()
	{
		xhash=hashi=0;
	}
	bool operator == (Hash_Table a) const
	{return a.xhash==xhash&&a.hashi==hashi;}
	bool operator < (Hash_Table a) const
	{return a.xhash+(ll)(1e9)*a.hashi<xhash+(ll)(1e9)*hashi;}
	void init(vector<int> x)
	{
		ll cbase=base,cbasei=basei;
		for(int i=0;i<x.size();i++)
			xhash=(xhash+1ll*x[i]*cbase%MOD)%MOD,
			hashi=(hashi+1ll*x[i]*cbasei%MODI)%MODI,
			cbase=cbase*base%MOD,cbasei=cbasei*basei%MODI;
	}
} Hash[maxn];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int ai,n,a,p=0,tot=0;
		scanf("%d",&n);
		for(int i=1;i<maxn;i++)
			num[i].clear();
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&ai);
			for(int j=1;j<=ai;j++)
				scanf("%d",&a),
				num[a].push_back(i);
		}
		memset(Hash,0,sizeof(Hash));
		int minsize=maxn;
		for(int i=1;i<maxn;i++)
			if(num[i].size()==0) continue;
			else ai=num[i].size(),minsize=min(minsize,ai);
		for(int i=1;i<maxn;i++)
		{
			if(num[i].size()==0&&num[i].size()!=minsize) continue;
			tot++,Hash[++p].init(num[i]);
		}
		sort(Hash+1,Hash+p+1);
		int pi=1,delt=maxn;
		while(pi<=p)
		{
			int pii=pi,x=0;
			while(pii<=p&&Hash[pii]==Hash[pi])
				x++,pii++;
			delt=min(x,delt);
			pi=pii;
		}
		printf("%d\n",tot-delt);
	}
	return 0;	
}
*/