Codeforces Round 865 (Div. 2) A-C

文章包含三道编程竞赛题目,涉及路径规划、网格重建和数组排序问题。第一题中,给出了从(0,0)到(x,y)的路径;第二题介绍了如何构建特定的网格布局;第三题讨论了数组排序的条件分析。每题都提供了C++代码实现。
摘要由CSDN通过智能技术生成

被队友push了,放下计组书刷刷题

A. Ian Visits Mary

显然,我们可以从(0,0)到(x-1,1),再到(x,y)

因为一行以内必然无顶点

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define fir for(int i=1;i<=n;i++)
#define rif for(int i=n;i>=1;i--)

#define AC return
#define pleaseqwq 0
using namespace std;

const int N=2e5+10;
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
unordered_map<int,int>ii;
unordered_map<string,int>si;

void solve(){
	int a,b;
	cin>>a>>b;
	cout<<2<<endl;
	cout<<a-1<<' '<<1<<endl;
	cout<<a<<' '<<b<<endl;
	return ;
}

signed main(){
	cin.tie(0),cout.tie(0);
	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	while(T--) solve();
	
	
	AC pleaseqwq;
}

B. Grid Reconstruction

通过手写,发现必然在斜着对角加减,即:

+ - + -

- + - +

于是,我们参照样例,把最大的两个放在两边

剩下的填数字即可,然后根据样例检查,保证放入顺序。

样例也提示了奇数尽可能和奇数一行,偶数同理

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define fir for(int i=1;i<=n;i++)
#define rif for(int i=n;i>=1;i--)

#define AC return
#define pleaseqwq 0
using namespace std;

const int N=2e5+10;
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
unordered_map<int,int>ii;
unordered_map<string,int>si;

int a[3][N];

void solve(){
	int n;
	cin>>n;
	int cnt=2*n-1;
	int beg=1;
	for(int i=0;i<n;i+=2){
		a[i&1][i]=cnt--;
		a[i&1][i+1]=beg++;
		a[(i+1)&1][i]=beg++;
		a[(i+1)&1][i+1]=cnt--;
	}
	a[(n-1)&1][n-1]=2*n;
	for(int i=0;i<n;i++) cout<<a[0][i]<<' ';
	cout<<endl;
	for(int i=0;i<n;i++) cout<<a[1][i]<<' ';
	cout<<endl;
	return ;
}

signed main(){
	cin.tie(0),cout.tie(0);
	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	while(T--) solve();
	
	
	AC pleaseqwq;
}

C. Ian and Array Sorting

先考虑中间情况,对任意ai,ai+1进行加减操作。

ai -1 ai+1 -1 ai+1 +1 ai+2 +1

可得对于任意奇偶性相同的,其可以任意变换,即a1,a3,a5可以任意变换

考虑边界情况,此时a1会让a2变换,an会让an-1变换

考虑将其两边界先变为合适的数字,根据任意变换,则中间可以任意变换,且a2和an-1可以作适当变换使得a1和an满足条件。但此时若为奇数个,则a1与an可以加到一块;若为偶数个,则加不到一块。

于是n为奇数必然成立,而n为偶数需要额外讨论。根据上述条件,此时变换前面除最后一个奇数和偶数以外的数字,将其+1或者-1,对应往后传递,将影响变换到最后两位,考虑最后两位大小关系即可。

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define fir for(int i=1;i<=n;i++)
#define rif for(int i=n;i>=1;i--)

#define AC return
#define pleaseqwq 0
using namespace std;

const int N=3e5+10;
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
unordered_map<int,int>ii;
unordered_map<string,int>si;

int a[N],b[N];

void solve(){
	int n;
	cin>>n;
	int even=0,odd=0;
	fir{
		int k;
		cin>>k;
		if(i&1) odd+=k;
		else even+=k;
	}
	if(n&1||odd<=even) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	return ;
}

signed main(){
	cin.tie(0),cout.tie(0);
	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	while(T--) solve();
	
	
	AC pleaseqwq;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值