哇塞,究极构造场,abcd四道构造可真行
A. SSeeeeiinngg DDoouubbllee
题意
给一个字符串,将字符串的每个字母变成两个(codeforce --> ccooddeeffoorrccee),随后重新排列该字符串,构成一个回文串,输出这个回文串。
思路
一遍正的一遍反的不就好了。。 反正是随便排列。。。
Code
#include<bits/stdc++.h>
using namespace std;
void solve()
{
string s;
cin >> s;
string t = s;
reverse(s.begin(),s.end());
cout << t + s << endl;
}
int main()
{
int tt;
cin >> tt;
while(tt --)
solve();
system("pause");
}
B. XOR = Average
题意
构造一个长度为n的数组,使得该数组的异或和等于该数组的平均数
思路
首先想到奇数个相同的数异或起来还是这个数,而一个数组如果所有数都相同那平均数也等于这个数,奇数的情况就非常ez。
接下来沿用这个思路去构造偶数,能否使得偶数个数的异或和等于奇数个相同数的异或和呢,想到1异或3 = 2,我们可以构造一个数组为1 3 2 2 2 2....,刚好这个数组的平均数也等于2,over。
Code
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n;
cin >> n;
if(n % 2 == 0)
{
if(n == 1) cout << 1 << endl;
else
{
cout << 1 << " " << 3 << " ";
for(int i = 1;i <= n - 2;i ++)
cout << 2 << " \n"[i == n - 2];
}
}
else
for(int i = 1;i <= n;i ++)
cout << 2 << " \n"[i == n];
}
int main()
{
int tt;
cin >> tt;
while(tt --)
solve();
system("pause");
}
C. Almost All Multiples
题意
构造一个长度为n的序列p,满足p1 = x,pn = 1,且对于所有的i(1< i < n)满足i | pi,输出构造的序列,无法构造输出 -1
思路
哪来那么多构造题啊(恼)
手模几组,会发现我们实际上是在第x位放x的倍数,在x的倍数位放x的倍数的倍数,直到把n放下来,也就是说n必须整除x,同时去找一个最长的序列a,满足n | a1 | a2 | a3...,为了构造这个序列我们分解n / x的质因数作为倍数,然后模拟即可。
Code
#include <bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);std::cin.tie(0);
#define ll long long
#define db double
#define PII pair<int, int>
#define ALL(x) x.begin(), x.end()
#define debug(x) cerr<<#x<<"->"<<x<<endl
using namespace std;
const int maxn=1e6+10;
const int INF=0x3f3f3f3f;
const db esp=1e-12;
void solve()
{
int n,x;
cin >> n >> x;
if(n % x)
{
puts("-1");
return ;
}
int info = n/x,t = n;
if(x == n)
{
cout << x << " ";
for(int i = 2;i <= n - 1;i ++) cout << i << " ";
cout << 1 << endl;
return ;
}
vector<int>p;
for(int i = 2;i <= info;i ++)
{
while(info % i == 0)
{
info /= i;
p.push_back(i);
}
}
if(info) p.push_back(info);
vector<int>ans(n + 10);
for(int i = 2;i <= n - 1;i ++) ans[i] = i;
for(int i = p.size() - 1;i >= 0;i --)
{
ans[t / p[i]] = t;
t /= p[i];
}
cout << x << " ";
for(int i = 2;i <= n - 1;i ++) cout << ans[i] << " ";
cout << 1 << endl;
}
int main()
{
int tt;
cin >> tt;
while(tt --)
solve();
return 0;
}
D. Range = √Sum
题意
构造一个长度为n的数组,数组中数字各不相同,满足这个数组的最大值 - 最小值(极差) = 数组和的平方根。
思路
快把构造端下去吧,已经品鉴的够多了(大悲
我们要构造的这个数组的数组和是一个完全平方数,我们还是分奇数偶数考虑
n为偶数:这种情况比较好考率,考虑n * n,实际上就是[n - n/2 , n) ∪ (n , n + n/2]的和
n为奇数:一开始想构造(n + 1) ^ 2 = n ^ 2 + 2 * n + 1,也就是构造n+1的平方然后在这个序列中剃掉n和n + 1,一想不对,这个序列本来就不含n + 1。。。然后考虑了一下n^2怎么构造,发现直接构造一个序列n - n/2 ,n - n/2 + 1,...,n,...,n + n/2 - 1,n + n/2 + 1,这个序列的和就是n^2,但是此时极差为n - 1,我们考虑把所有数都加上2,此时的和就会变成n ^ 2 + 2 * n,是不是有点像(n + 1)^ 2了,我们把最小值-1,最大值+1,极差变为n + 1,和不变,再把次大值+1,数组和就变成了(n + 1)^ 2,over。
Code
#include <bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);std::cin.tie(0);
#define ll long long
#define db double
#define PII pair<int, int>
#define ALL(x) x.begin(), x.end()
#define debug(x) cerr<<#x<<"->"<<x<<endl
using namespace std;
const int maxn=1e6+10;
const int INF=0x3f3f3f3f;
const db esp=1e-12;
void solve()
{
int n;
cin >> n;
vector<int>res;
if(n & 1)
{
for(int i = n - n / 2; i <= n + n / 2;i ++)
res.push_back(i + 2);
res[0] --;
res[res.size() - 1] ++;
res[res.size() - 2] ++;
}
else
{
for(int i = n - n / 2;i <= n + n / 2;i ++)
{
if(i == n) continue;
res.push_back(i);
}
}
for(auto i : res) cout << i << " ";
cout << endl;
}
int main()
{
int tt;
cin >> tt;
while(tt --)
solve();
system("pause");
return 0;
}
喜报:e和f不是构造
悲报:2500分以上的题我这个菜狗怎么会啊