Pinely Round 4 (Div. 1 + Div. 2) (4/9)
比赛链接:https://codeforces.com/contest/1991
solve:ABC
开头
暑假训练快训了一个月,感觉收效甚微,于是决定开始补题解,希望开学前至少上青,最好能上蓝(•ω•`)
这一场真的坐牢,B卡了一小会,C更是wa了一发,D是最唐的,所以糖丸了.
A. Maximize the Last Element
思路:
签到题,判断每个数前面和后面数的数量能否被2整除,如果都能就可以得到,然后求最大值就行
代码:
#include<bits/stdc++.h>
using i64=long long;
void solve(){
int n;
std::cin>>n;
std::vector<int> a(n+1);
for(int i=1;i<=n;i++){
std::cin>>a[i];
}
int res=0;
for(int i=1;i<=n;i++){
int ta=i-1;
int tb=n-i;
if(ta%2==0&&tb%2==0){
res=std::max(res,a[i]);
}
}
std::cout<<res<<'\n';
}
int main(){
std::cin.tie(nullptr);
std::ios_base::sync_with_stdio(false);
int tt;
std::cin>>tt;
while(tt--){
solve();
}
}
B. AND Reconstruction
思路:
开局硬控我十分钟,然后构造了一下,发现除了第一个元素和最后一个元素,其余的都必须同时a[i]和a[i-1]的所有1,然后最后一个元素就是原来的最后一个元素,第一个元素必须是a[1]&b[2],然后遍历一下判断是否正确(其实还有更好的方法)
代码:
#include<bits/stdc++.h>
using i64=long long;
void solve(){
i64 n;
std::cin>>n;
std::vector<i64> a(n);
std::vector<i64> b(n+1);
for(i64 i=1;i<n;i++){
std::cin>>a[i];
}
b[n]=a[n-1];
for(i64 i=n-1;i>=1;i--){
if(i>1){
b[i]=a[i]|a[i-1];
}
else{
b[1]=a[1]&b[2];
}
}
for(i64 i=2;i<=n;i++){
i64 t=b[i]&b[i-1];
if(t!=a[i-1]){
std::cout<<-1<<'\n';
return;
}
}
for(i64 i=1;i<=n;i++){
std::cout<<b[i]<<' ';
}
std::cout<<'\n';
}
int main(){
std::cin.tie(nullptr);
std::ios_base::sync_with_stdio(false);
int tt;
std::cin>>tt;
while(tt--){
solve();
}
}
C. Absolute Zero
思路:
每次减去最大值的一半,还有一种方法就是每次减去2^30...,这样每次操作后所有数都不会大于这个数
代码:
#include<bits/stdc++.h>
using i64=long long;
void solve(){
int n;
std::cin>>n;
std::vector<int> a(n+1);
for(int i=1;i<=n;i++){
std::cin>>a[i];
}
std::priority_queue<int> q;
for(int i=1;i<=n;i++){
q.push(a[i]);
}
int u=0;
std::vector<int> res;
for(int i=1;i<=40;i++){
if(q.top()==0){
u=1;
break;
}
int k=(q.top()+1)/2;
res.push_back(k);
std::queue<int> t;
while(q.size()){
t.push(abs(q.top()-k));
q.pop();
}
while(t.size()){
q.push(t.front());
t.pop();
}
}
if(u==0){
std::cout<<-1<<'\n';
}
else{
std::cout<<res.size()<<'\n';
for(int i=0;i<res.size();i++){
std::cout<<res[i]<<' ';
}
std::cout<<'\n';
}
}
int main(){
std::cin.tie(nullptr);
std::ios_base::sync_with_stdio(false);
int tt;
std::cin>>tt;
while(tt--){
solve();
}
}
D. Prime XOR Coloring
思路:
这道题坐牢了,我一开始以为这是需要染色法,然后想着先构建出所有边再染色,但这样几乎不可能实现,时间复杂度太高了,所以我就造了个10的图,然后观察,我发现10的答案也是4,看到1~6的样例答案,我以为答案是1,2,2,3,3,4,4,1,12,2...这样循环,结果错了,果然猜必wa 一堆废话
正确的做法呢非常巧妙,首先所有的质数除了2都是奇数,所以一个奇数和一个偶数异或才有可能是质数,同奇偶的两个数一定不可能(当然除了质数2),所以现在就是让奇数和偶数分成两种不同的颜色,这样才可以满足,然后我们再来讨论2,同奇偶的两个数异或才有可能是2,同时这两个数一定相差2,比如说4-6,8-10,3-5,7-9,这样打表可以发现规律相邻的同奇偶的两个数都是隔着一个有一条边,所以说奇数里有分了两种颜色,偶数里也分了两种颜色,所以一共有四种颜色.
这里我看很多人说用到了四色定理,然后我看群友们讨论知道了四色定理只是适用在平面图中,这里的图并不一定是平面图,所以四色定理其实不适用
最后呢小于6的直接打表,之后的其实就是每四个数都不能是相同的元素,直接循环即可
这道题挺妙的,样例挺误导的,这里有个思想就是去掉特殊的,先讨论一般的,最后再讨论特殊的
代码:
#include<bits/stdc++.h>
using i64=long long;
void solve(){
int n;
std::cin>>n;
if(n<=5){
if(n==1) std::cout<<"1\n1\n";
else if(n==2) std::cout<<"2\n1 2\n";
else if(n==3) std::cout<<"2\n1 2 2\n";
else if(n==4) std::cout<<"3\n1 2 2 3\n";
else if(n==5) std::cout<<"3\n1 2 2 3 3\n";
}
else{
std::cout<<4<<'\n';
for(int i=1;i<=n;i++){
if(i%4==0){
std::cout<<4<<' ';
}
else{
std::cout<<i%4<<' ';
}
}
std::cout<<'\n';
}
}
int main(){
std::cin.tie(nullptr);
std::ios_base::sync_with_stdio(false);
int tt;
std::cin>>tt;
while(tt--){
solve();
}
}
E. Coloring Game
交互还没学qwq
F. Triangle Formation
待补
G. Grid Reset
待补
H. Prime Split Game
待补
I. Grid Game
待补(下辈子补吧)

浙公网安备 33010602011771号