IAEPC Preliminary Contest (Codeforces Round 999, Div. 1 + Div. 2)

B. Kevin and Geometry

  • vector的删除,无论是删除单个元素还是区间,一定是传入迭代器,而且区间一定是左闭右开区间
#include <bits/stdc++.h>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		vector<int>a(n);
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
		}
		sort(a.begin(),a.end());
		reverse(a.begin(),a.end());
		int maxn=0;
		for(int i=1;i<a.size();i++)
		{
			if(a[i]==a[i-1])
			{
				maxn=a[i];
				a.erase(a.begin()+i-1,a.begin()+i+1);
				break;
			}
		}
		bool f=false;
		for(int i=0;i+1<a.size();i++)
		{
			if(a[i]-a[i+1]<2*maxn)
			{
				f=true;
				cout<<maxn<<" "<<maxn<<" "<<a[i+1]<<" "<<a[i]<<"\n";
				break;
			}
		}
		if(f==false)
		{
			cout<<"-1\n";
		}
	}
	return 0;
}

C. Kevin and Puzzle

  • "no two liars can stand next to each other"意味着诚实者之前的另一个诚实者最多与其隔一个位置,提供了状态转移的可靠条件
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
int a[200005],b[200005];
int f[200005][2];
int n,ans;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			b[i]=i-a[i];
		}
		f[0][1]=1;
		for(int i=1;i<=n;i++)
		{
			f[i][0]=f[i-1][1];
			if(i==1)
			{
				f[i][1]=(b[i]==1);
			}
			else
			{
				f[i][1]=f[i-1][1]*(b[i-1]==b[i]-1)+f[i-1][0]*(b[i-2]==b[i]-1);
				f[i][1]%=mod;
			}
		}
		cout<<(f[n][0]+f[n][1])%mod<<"\n";
	}
	return 0;
}

D. Kevin and Numbers

  • 正难则反。合并缺乏目标,但拆分有
#include <bits/stdc++.h>
using namespace std;
int a[200005],b[200005];
map<int,int>q;
int n,m;
bool calc(int x)
{
	if(m>n||x==0)
	{
		return false;
	}
	auto it=q.find(x);
	if(it!=q.end())
	{
		q[x]--;
		if(q[x]==0)
		{
			q.erase(it);
		}
		return true;
	}
	else
	{
		m++;
		if(x%2==0)
		{
			return calc(x/2)&calc(x/2);
		}
		else
		{
			return calc(x/2)&calc((x+1)/2);
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		q.clear();
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			q[a[i]]++;
		}
		for(int i=1;i<=m;i++)
		{
			cin>>b[i];
		}
		int M=m;
		bool f=true;
		for(int i=1;i<=M;i++)
		{
			f=(f&calc(b[i]));
			if(f==false)
			{
				break;
			}
		}
		if(q.empty())
		{
			cout<<"Yes\n";
		}
		else
		{
			cout<<"No\n";
		}
	}
	return 0;
}

E. Kevin and And

  • 直接贪心是不对的。因为消2次的最优解未必包含消1次的最优解
  • C++ accumulate:对范围内的元素求和或折叠
  • int __builtin_ctz(unsigned int x) consecutive、tail、zero 可以辅助位运算递推
  • 自定义优先队列的比较函数,一定是lambda表达式!
#include <bits/stdc++.h>
using namespace std;
int a[100005];
int f[1030],g[100005][15],id[100005]; 
struct t
{
	int delta;
	int i;
};
auto cmp=[](t a,t b)
{
	if(a.delta!=b.delta)
	{
		return a.delta<b.delta;
	}
	return a.i<b.i;
};
priority_queue<t,vector<t>,decltype(cmp) >q(cmp);
int n,m,k;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>m>>k;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			for(int j=1;j<=m;j++)
			{
				g[i][j]=a[i];
			}
			id[i]=0;
		}
		long long sum=accumulate(a+1,a+n+1,0ll);
		vector<int>b(m);
		for(int i=0;i<m;i++)
		{
			cin>>b[i];
		}
		f[0]=INT_MAX;
		for(int i=1;i<(1<<m);i++)
		{
			int x=__builtin_ctz(i);
			f[i]=f[i^(1<<x)]&b[x];
			for(int j=1;j<=n;j++)
			{
				int cnt=__builtin_popcount(i);
				g[j][cnt]=min(g[j][cnt],a[j]&f[i]);
			}
		}
		for(int i=1;i<=n;i++)
		{
			q.push((t){a[i]-g[i][1],i});
		}
		while(k--&&q.size())
		{
			t n1=q.top();
			q.pop();
			int i=n1.i;
			id[i]++;
			sum=sum-n1.delta;
			a[i]=a[i]-n1.delta;
			if(id[i]<m)
			{
				q.push((t){a[i]-g[i][id[i]+1],i});
			}
		}
		while(q.size())
		{
			q.pop();
		}
		cout<<sum<<"\n";
	}
	return 0;
}

F1. Kevin and Binary String (Easy Version)

#include <bits/stdc++.h>
using namespace std;
string s,t;
int ans;
int tmp[400005];
int con(int p)
{
	for(int i=p;i<s.size();i++)
	{
		if(tmp[i])
		{
			i=i+tmp[i]-1;
			continue;
		}
		if(s[i]!=s[p])
		{
			return i-p;
		}
	}
	return s.size()-p;
}
bool solve(int p)
{
	if(p>=s.size())
	{
		return true;
	}
	if(s[p]==t[p])
	{
		return solve(p+1);
	}
	if(p>0&&s[p]==s[p-1])
	{
		return false;
	}
	int l=con(p);
	if(p+l==s.size())
	{
		return false;
	}
	int len=con(p+l);
	ans++;
	for(int j=p;j<p+len;j++)
	{
		if(t[j]!=t[p])
		{
			return false;
		}
	}
	for(int j=0;j<min(l,len);j++)
	{
		swap(s[p+j],s[p+len+l-1-j]);
	}
	tmp[p+len]=l;
	return solve(p+len);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>s>>t;
		for(int i=0;i<s.size();i++)
		{
			tmp[i]=0;
		}
		ans=0;
		if(!solve(0))
		{
			cout<<"-1\n";
		}
		else
		{
			cout<<ans<<"\n";
		}
	}
	return 0;
}
posted @   D06  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2024-01-21 [IOI2008] Island
2024-01-21 D.Operator Precedence
//雪花飘落效果
点击右上角即可分享
微信分享提示