Codeforces Round #839 (Div. 3)(A-F)

目录

目录

A:A+B

B. Matrix Rotation

C. Different Differences

D. Absolute Sorting

E. Permutation Game

F. Copy of a Copy of a Copy



A:A+B

题意:给出A+B,算出答案

B. Matrix Rotation

题意,给出2X2矩阵,检查最大值和最小值是不是对角分布

#include <bits/stdc++.h>
#define int long long

using  namespace std;
const int N=5e5+10;
int p[N];

void sove()
{
	vector<int>s(4);
	cin>>s[0]>>s[1]>>s[3]>>s[2];
	int t=min_element(s.begin(),s.end())-s.begin();
	int m=max_element(s.begin(),s.end())-s.begin();
	//cout<<t<<" "<<m<<endl;
	if(abs(m-t)!=2)puts("NO");
	else puts("YES");
}

signed main()
{

   int t;
   cin>>t;
   while(t--)sove();	
}

C. Different Differences

#include <bits/stdc++.h>
#define int long long

using  namespace std;
const int N=5e5+10;
int p[N];

void sove()
{
	int n,k;
	cin>>k>>n;
	n-=k-1;
	int sum=1;
	for(int i=1;i<=k;i++)
	{
		cout<<sum<<" ";
		sum=min(sum+i,++n);
	}
	cout<<endl;
}

signed main()
{

   int t;
   cin>>t;
   while(t--)sove();	
}

D. Absolute Sorting

题意:给你一个序列,询问是否存在一个数X,序列中的数减上X后的绝对值,形成非单调序列,如果不存在输出-1;

分析:假设X的范围为(L,R);

序列S中存在Si<S(i+1),R<=min(R,(Si+(S(i+1))/2);原因是如果这个数比(Si+(S(i+1))/2大的话,那么Si>S(i+1);

同理如果S中存在Si>S(i+1)L=max(L,(Si+(S(i+1)+1)/2);原因和上边的类似

那么根据这个性质就可以得出答案

#include <bits/stdc++.h>
#define int long long
 
using  namespace std;
const int N=5e5+10;
int p[N];
 
void sove()
{
	int n;
	cin>>n;
	vector<int>v(n);
	int ll=0,rr=0x3f3f3f3f;
  for(int i=0;i<n;i++)
  {
  	cin>>v[i];
  	if(i==0||v[i]==v[i-1])continue;
  	if(v[i]>v[i-1])
  	{
	  	rr=min(rr,(v[i]+v[i-1])/2);
	  }
	  else {
	  	ll=max(ll,(v[i]+v[i-1]+1)/2);
	  }
  }
  if(ll<=rr)cout<<ll<<endl;
  else puts("-1");
}
 
signed main()
{
 
   int t;
   cin>>t;
   while(t--)sove();	
}

E. Permutation Game

题意,在一个序列S中,甲乙两人轮流操作,每次的操作选择

1.将S中的某个数变为可调换位置的

2.重新排列,但只能调动可变换位置的

3.跳过回合

如果最后形成上升序列甲赢,递减序列乙赢,否则平局

分析:

如果某个人想要赢的话,那么这个人以最少的步数动完所有想动的数字,而另一个人还有固定不对的数字,否则就是平局

因此如果我当前需要移动的步数<我对手需要移动的步数-我们两个共同需要移动的步数,就会出现胜负,否则平局;

注意:甲如果想赢是可以相等的

#include <bits/stdc++.h>
#define int long long

using  namespace std;
const int N=5e5+10;
int p[N];

void sove()
{
	int n;
	cin>>n;
	vector<int>v(n);
	for(int i=0;i<n;i++)cin>>v[i];
	int ss=0,tt=0,sum=0;
	for(int i=0;i<n;i++)
	{
	if(v[i]!=i+1)ss++;
	if(v[i]!=n-i)tt++;
	if(v[i]!=i+1&&v[i]!=n-i)sum++;
		
	}
  if(ss+sum<=tt)
  {
  	cout<<"First";
  }
  else if(tt+sum<ss)
  {
  	cout<<"Second";
  }
  else cout<<"Fie";
  cout<<endl;
}

signed main()
{

   int t;
   cin>>t;
   while(t--)sove();	
}

F. Copy of a Copy of a Copy

题意:给你一些01的图片,打印他变化过程;

解析:通过并查集找到初始照片中的一个。根据变化的情况创建一个树,然后通过深搜把每个图的变化过程写出来就行了。

ps:我代码写得有点乱

#include <bits/stdc++.h>
#define int long long

using  namespace std;
const int N=5e5+10;
typedef pair<int,int>PII;
vector<string>s;
typedef struct G{
	int a;
	int x,y;
}G;
vector<G>g;
int n,m,k;
int son[N];
int h[N],e[N],ne[N],idx,w[N];
int st[N];
void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void query(string a,string b)
{
	int x=1,y=0;
	for(int i=0;i<a.size();i++)
	{
		y++;
		if(y>m)x++,y=1;
		if(a[i]!=b[i])g.push_back({1,x,y});
	}
}

void bfs(int a)
{
	st[a]=1;
//	sort(s[a].begin(),s[a].end());
    int t=-1;
//	int sum=0;
    for(int i=h[a];i!=-1;i=ne[i])
    {
		int j=e[i],l=w[i];
		if(!st[j]&&(t==-1||l<w[t]))t=i;
	}
	if(t==-1)return ;
	if(w[t])query(s[a],s[e[t]]);
	g.push_back({2,e[t]});
	bfs(e[t]);
}

string add()
{
	string a,b;
	for(int i=1;i<=n;i++)cin>>b,a+=b;
	return a;
}

int find(int a)
{
	if(a!=son[a])son[a]=find(son[a]);
	return son[a];
}

 void query(int a,int b,int &l)
{
	l=0;
	int k;
	for(int i=0;i<s[a].size();i++)
	if(s[a][i]!=s[b][i])l++,k=i;
	if(s[a][k]==s[a][k+1])son[a]=find(son[b]);
	else son[b]=find(son[a]);
}

void sove()
{
	memset(h,-1,sizeof h);
	cin>>n>>m>>k;
	for(int i=1;i<=k+1;i++)son[i]=i;
	s.push_back("????");
	for(int i=0;i<=k;i++)
	{
		s.push_back(add());
	}
	for(int i=1;i<=k+1;i++)
	{
		for(int j=i+1;j<=k+1;j++)
		{
		int l;
		query(i,j,l);
		add(i,j,l);
		add(j,i,l);
		}
	}
	//cout<<"????";
	int t=find(1);
     bfs(t);
	cout<<t<<endl;
	cout<<g.size()<<endl;
	for(auto it:g)
	{
		if(it.a==1)printf("%lld %lld %lld\n",it.a,it.x,it.y);
		else printf("%lld %lld\n",it.a,it.x);
	}
}

signed main()
{

   int t=1;
//   cin>>t;
   while(t--)sove();	
}

总结:这次打的稀烂,很久没写代码手生了吧,而且水平本来就不高,唉。好好努力了!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值