因为一些原因(开黑)周赛给忘了,所以只能补题了,总的这次来说这次题并不难,可以说是手速场,唯一卡住我的只有b题,思维这方面太差了,应该多刷刷。
比赛链接:这里
A:签到,直接暴力搞就好了。
#include<bits/stdc++.h>
#define ll long long
#define pr pair<ll,ll>
#define ios ios::sync_with_stdio(false)
#define CRL(a) memset(a,0,sizeof a)
using namespace std;
const int maxn = 1e6 + 5;
int x[maxn];
int y[maxn];
int z[maxn];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n;i++)
{
cin >> x[i];
z[x[i]]++;
}
int m;
cin >> m;
for (int i = 1; i <= m;i++)
{
cin >> y[i];
z[y[i]]++;
}
for (int i = 1; i <= n;i++)
{
for (int j = 1; j <= m;j++)
{
if(!z[x[i]+y[j]])
{
cout << x[i] << " " << y[j];
return 0;
}
}
}
}
B:卡了我大概有十几分钟把。我们首先应该注意到n是个奇数,而且我们对前半段进行操作是不会对结果有任何影响的,所以前半段我们可以直接不管,而且我们可到一个结论,只有从中位数这儿往后遍历递增,才会最大化中位数的值,因为不这样的做的话,我们会浪费操作机会而且对我们中位数的大小没有任何提升,那么这样这道题就很好写了。
#include<bits/stdc++.h>
#define ll long long
#define pr pair<ll,ll>
#define ios ios::sync_with_stdio(false)
#define CRL(a) memset(a,0,sizeof a)
using namespace std;
const int maxn = 1e6 + 5;
ll x[maxn];
ll y[maxn];
ll z[maxn];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n;i++)
{
cin >> x[i];
}
sort(x + 1, x + 1 + n);
ll ans = 1;
for (int i = n / 2 + 1; i < n;i++)
{
ll a = x[i + 1] - x[i];
if(ans*a<=m)
{
m -= ans * a;
ans++;
}
else
{
m /= ans;
cout << x[i] + m;
return 0;
}
}
m /= ans;
cout<<x[n]+m;
}
C:显而易见,这道题我们要找一个环,这个环上的所以数操作次数都是这个环上元素的个数,我们用并查集来找这个环,然后就可以解决这道题了。
#include<bits/stdc++.h>
#define ll long long
#define pr pair<ll,ll>
#define ios ios::sync_with_stdio(false)
#define CRL(a) memset(a,0,sizeof a)
using namespace std;
const int maxn = 2e5 + 5;
int f[maxn];
int x[maxn];
int s[maxn];
bool z[maxn];
int get(int t)
{
if(t==f[t])
return f[t];
return f[t] = get(f[t]);
}
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
for (int i = 1; i <= n;i++)
{
f[i] = i;
s[i] = 1;
z[i] = 0;
cin >> x[i];
}
for (int i = 1; i <= n;i++)
{
if(z[i])
continue;
int a = i;
while(a)
{
int b = get(x[a]);
int c = get(a);
if(c==b)
break;
f[b] = c;
s[c]++;
a = x[a];
}
}
for (int i = 1; i <= n;i++)
{
int a = get(x[i]);
cout << s[a] << " ";
}
cout << endl;
}
}