目录
目录
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();
}
总结:这次打的稀烂,很久没写代码手生了吧,而且水平本来就不高,唉。好好努力了!!!