AtCoder Beginner Contest 213

这篇博客包含了三道编程竞赛题目ABC213的解决方案。第一题涉及位运算,求两个整数的异或结果;第二题要求对一组数对进行排序,输出最后一个数对的第一个元素;第三题是图的简化问题,通过离散化处理删除无点行或列。博主分享了如何使用C++进行离散化操作,并提供了相关教程链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A - Bitwise Exclusive Or

水的过分了..

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}		
int n,m;
int main()
{
	ios
	cin>>n>>m;
	cout<<(n^m)<<endl;
	return 0;
}

https://atcoder.jp/contests/abc213/tasks/abc213_b

大水漫灌

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}		
const int maxn=2e5+5;
int n;pair<int,int>num[maxn];
bool cmp(pair<int,int> a, pair<int,int> b)
{
	return a.second<b.second;
}
int main()
{
	ios
	cin>>n;
	rep(i,1,n)
	{
		cin>>num[i].second;
		num[i].first=i;
	}
	sort(num+1,num+1+n,cmp);
	cout<<num[n-1].first<<endl;
	return 0;
}

https://atcoder.jp/contests/abc213/tasks/abc213_c

给你n,m,t,nm为图的范围,t为点的数量。

接下来输入点的位置。

如果一行全部没有点或者一列全部没有点,这行就可以删掉。

最后输出化简后的点的位置。

把x和y分别离散化,输出即可。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}		
const int maxn=2e5+5;
struct node
{
	int x,y,id;
}p[maxn];
int lshx[maxn]={0},lshy[maxn]={0};
int n,m,t;
int main()
{
	ios
	cin>>n>>m>>t;
	rep(i,1,t)
	{
		cin>>p[i].x>>p[i].y;
		lshx[i]=p[i].x;lshy[i]=p[i].y;
		p[i].id=i;
	}
	int reu=0;
	
	sort(lshx+1,lshx+1+t);
	reu=unique(lshx+1,lshx+1+t)-lshx-1;
	for(int i=1;i<=t;i++)
		p[i].x=lower_bound(lshx+1,lshx+1+reu,p[i].x)-lshx;
		
	//cout<<"lshx"<<' ';rep(i,1,t)cout<<lshx[i]<<' ';cout<<endl;
	sort(lshy+1,lshy+1+t);
	reu=unique(lshy+1,lshy+1+t)-lshy-1;
	for(int i=1;i<=t;i++)
		p[i].y=lower_bound(lshy+1,lshy+1+reu,p[i].y)-lshy;
		
	//cout<<"lshy"<<' ';rep(i,1,t)cout<<lshy[i]<<' ';cout<<endl;
	for(int i=1;i<=t;i++)
		cout<<p[i].x<<' '<<p[i].y<<endl;
	return 0;
}

离散化教程是参考的这个。

https://blog.csdn.net/weixin_43061009/article/details/82083983 

https://atcoder.jp/contests/abc213/tasks/abc213_d

emmm,dfs序?

欧拉序,建图dfs就行。

以后不能再迷信前向星了。。有些时候对边顺序有要求的时候不能前向星。

还有n个点,n-1条边,排序的时候要对个点排序

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}	
int n,a,b;
const int maxn=3e5+5;
int vis[maxn];
vector<int>e[maxn];	
void dfs(int u)
{
	printf("%d ",u);
	vis[u]=1;
	int a=e[u].size();
	for(int i=0;i<a;i++)
	{
		int v=e[u][i];
		if(vis[v]==1)continue;
		dfs(v);
		printf("%d ",u);
	}
}
int main()
{
	ios
	cin>>n;
	n--;
	rep(i,1,n)
	{
		cin>>a>>b;
		e[b].push_back(a);
		e[a].push_back(b);
	}
	for(int i=1;i<=n+1;i++)sort(e[i].begin(),e[i].end());
	dfs(1);
	return 0;
}

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在编程领域,排列和组合是两种重要的数学概念,被广泛应用于算法设计,尤其是在解决计数问题和遍历所有可能性时。C语言作为一种高效且底层的编程语言,常被用来实现这些算法,以提升效率和灵活性。接下来,我们将深入探讨如何使用C语言实现排列和组合算法。 排列是指有限集合中元素的一种有序排列方式。在C语言中,可以通过递归方法实现排列算法。核心思路是:对于当前位置,依次尝试将未使用的元素放置于此,并对剩余元素递归生成排列。当所有可能的元素都尝试过后,返回上一层,选择下一个未使用的元素。 组合则是不考虑顺序的元素集合。在C语言中,可以通过计算组合数或直接生成所有可能的组合来实现。组合数通常使用公式C(n, k) = n! / [k!(n-k)!]计算,其中n是总元素数量,k是选择的元素数量,!表示阶乘。生成组合可以采用回溯法,从第一个元素开始,依次选择k个元素。每一步有多个选择,但在回溯时需跳过已选择的元素。 通常情况下,实现这些算法的源代码会包含一个或多个函数,例如permute用于生成排列,combine用于生成组合。这些函数可能采用递归结构,也可能使用非递归的栈或队列来存储中间状态。此外,源代码还可能包含一些辅助函数,如检查元素是否已被使用、交换数组中的两个元素等。 为了更好地理解这些算法,需要仔细阅读并分析源代码,重点关注以下几个关键部分: 初始化:定义数组或数据结构来存储元素和已选择的元素。 递归函数:定义递归生成排列或组合的主函数。 回溯逻辑:在递归过程中,当无法继续生成新的排列或组合时,回溯到上一层。 循环和条件判断:控制元素的选择和回溯。 输出或统计:根据需求,将生成的排列或组合输出或进行计数。 学习C语言实现的排列组合算法,有助于理解递归思想,提升处理组合数学问题的能力,并在实际编程中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值