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.youkuaiyun.com/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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值