第二次打虚拟赛。

CF 传送门

T1:Yellow Cards

黄色卡片

中规中矩的 \(T1\)。

首先可以算出一个人也不罚下时发出的最多黄牌数: \(sum=a1*(k1-1)+a2*(k2-1)\)

此时,若 \(sum>=n\),则最少罚下 \(0\) 人,否则最少罚下 \(n-sum\) 人。

然后看最多。优先考虑全部发给所需黄牌数少就能下场的一队。如果全下光了,就去发给另一队。

不得不说这比赛机制简直找打

Code:

#include<bits/stdc++.h>
using namespace std;
int a1,a2,k1,k2,n,sum,tmp;
int main(){
scanf("%d%d%d%d%d",&a1,&a2,&k1,&k2,&n);
sum=a1*(k1-1)+a2*(k2-1);
printf("%d ",max(0,n-sum));
if(k1>k2){
swap(k1,k2);
swap(a1,a2);
}
tmp=n/k1;
if(tmp>a1){
n-=a1*k1;
printf("%d",a1+n/k2);
}
else printf("%d",tmp);
return 0;
}

\(5min\) 速切

T2:The Number of Products

一开始想的是用前缀和算每个区间的负数个数,但是 \(O(n^2)\) 显然超时。于是就顿住了 \(qwq\)。

后来想到可以对每一次读入快速判。设置一个标记记录当前正负状态。如果标记为正,那么正答案加上之前所有的正区间、负答案加上之前所有负区间(不变号)。如果标记为负,那么正答案加上之前所有的负区间、负答案加上之前所有正区间(变号)。

然鹅样例都过不了,一度怀疑做法假了。就去看了眼 \(T3\)。后来发现,没有算单独一个数的。最后正答案再加上正数个数、负答案再加上负数个数就好了。时间复杂度 \(O(n)\)。

Code:

#include<bits/stdc++.h>
using namespace std;
long long n,a,z,f,ans1,ans2,fl=1;
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a);
if(a<0) fl=-fl;
if(fl>0) ans1+=z,ans2+=f,z++;
else ans1+=f,ans2+=z,f++;
}
printf("%lld %lld",ans2+f,ans1+z);
return 0;
}

\(33min\) 才过 \(qwq\)

T3:Swap Letters

一开始读错题,以为是单个字符串内部交换。心想怎么会这么水。对着样例才发现了错误。

首先容易得知,两个字符串中 \(b\)(或 \(a\)) 的个数为偶数时,一定有解。为奇数则一定无解。

其次考虑怎么交换。对照样例三:

in:

8
babbaabb
abababaa

out:

3
2 6
1 3
7 8

发现,每一对交换的字符有共同点

  • 要不是串一都为 \(a\),串二都为 \(b\) 的一对

  • 要不是串一都为 \(b\),串二都为 \(a\) 的一对

简单思考后发现这样成对交换就是最优的。(换一次就可以匹配上两位)

于是,考虑先统计出 串一为 \(a\),串二为 \(b\) 的位数 \(cnt1\),并存入 \(ans1\) 数组。同时统计出 串一为 \(b\),串二为 \(a\) 的位数 \(cnt2\),并存入 \(ans2\) 数组。

这时发现一个问题,\(cnt1\) 和 \(cnt2\) 不一定为偶数,有可能不能各自成对匹配完。但可以发现, \(cnt1\) 与 \(cnt2\) 必同奇偶。由于偶数成对匹配更优,所以只可能剩下 一位串一为 \(a\),串二为 \(b\)一位串一为 \(b\),串二为 \(a\)

这时就出现了样例一的情况:

in:

4
abab
aabb

out:

2
3 3
3 2

只要按着样例一的方式特判输出即可。

Code:

#include<bits/stdc++.h>
using namespace std;
int n,ans1[200005],ans2[200005],cnt,cnt1,cnt2;
string s1,s2;
int main(){
scanf("%d",&n);
cin>>s1>>s2;
for(int i=0;i<n;i++){
if(s1[i]=='b') cnt++;
if(s2[i]=='b') cnt++;
}
if(cnt%2==1) printf("-1");
else{
for(int i=0;i<n;i++){
if(s1[i]=='a'&&s2[i]=='b') ans1[++cnt1]=i+1;
if(s2[i]=='a'&&s1[i]=='b') ans2[++cnt2]=i+1;
}
if(cnt1%2==0){
printf("%d\n",cnt1/2+cnt2/2);
for(int i=1;i<=cnt1;i+=2){
printf("%d %d\n",ans1[i],ans1[i+1]);
}
for(int i=1;i<=cnt2;i+=2){
printf("%d %d\n",ans2[i],ans2[i+1]);
}
}
else{
printf("%d\n",cnt1/2+cnt2/2+2);
for(int i=1;i<=cnt1-1;i+=2){
printf("%d %d\n",ans1[i],ans1[i+1]);
}
for(int i=1;i<=cnt2-1;i+=2){
printf("%d %d\n",ans2[i],ans2[i+1]);
}
printf("%d %d\n",ans1[cnt1],ans1[cnt1]);
printf("%d %d\n",ans1[cnt1],ans2[cnt2]);
}
}
return 0;
}

\(49min\) AC \(qwq\)

T4:Ticket Game

看上去是高大上的博弈论问题,实际就是贪心。

考虑把字符串分成左右两部分,分别统计出两边的 ? 个数 \(l,r\) 与不是 ? 的数字之和 \(ls,rs\)。

因为 Monocarp 先手,而 Bicarp 要维护字符串两边和相等,所以在两边都还有 ? 时,Monocarp 填任意一个, Bicarp 必然在另一边填一个相等的数字。所以,这些过程对结果是无意义的,可以把两边都有的 ?个数抹掉。

于是,问题就变成了一边都是数,在另一边填数。由题意,问号为偶数个,所以原来两边问号奇偶相同,减掉后剩下的问号也为偶数个。

这时我们发现,问题很像小学奥数里的取棋子游戏。就是每人每次取一个或两个,取到最后一个者胜,判断先后手谁胜。易知,棋子总数为 \(3\) 的倍数时,后手必胜,因为只要补 \(3\) 即可。

假设剩下的 ? 都在右边,问题就变成两人轮流填 \(0-9\) 的数,若最后和为 \(ls-rs\) 则后手胜。所以易想到 “补 \(9\)” 的策略。因为问号只有 \(r-l\) 个,所以每人只能填 \(\frac{r-l}{2}\) 次。

得出结论:只要 \(ls-rs\) 是 \(9\) 的 \(\frac{r-l}{2}\) 倍,则 Bicarp 胜。反之则 Monocarp 胜。

因为赛时很快想到思路,代码实现也简单,所以成为拉分的一题。

Code:

#include<bits/stdc++.h>
using namespace std;
int n,ls,rs,l,r;
string s;
int main(){
scanf("%d",&n);
cin>>s;
for(int i=0;i<n/2;i++){
if(s[i]=='?') l++;
else ls+=s[i]-'0';
}
for(int i=n/2;i<n;i++){
if(s[i]=='?') r++;
else rs+=s[i]-'0';
}
if(l>r){
swap(l,r);
swap(ls,rs);
}
r-=l;
if(r/2*9+rs==ls) printf("Bicarp");
else printf("Monocarp");
return 0;
}

\(1h\) \(05min\) AC \(qwq\)

T5:Marbles

状压 \(DP\),告辞

一个结论:把一个序列变为不降所需要的相邻元素交换次数就是这个序列的逆序对数。

那么这题要我们干的是什么呢?就是按颜色变为不降,只不过颜色的大小顺序我们可以任意指定而已。比如样例 \(1\) 指定的就是 \(3<4<2\),样例 \(2\) 指定的就是 \(20<1<14<10<2\)。

看到颜色数最多 \(20\),显然是状压 \(DP\)。定义 \(f[s]\) 是 \(s\) 对应的颜色的大小顺序已经安排好了的最小逆序对数。

假设已经安排好 \(k1<k2<⋯<km\) ,我们选择一个在 \(s\) 中没出现过的 \(k_{m+1}\)。那么新的状态就要加上 \((k_1,k_{m+1})\)之间的,满足 \(i<j,a_i=k_1,a_j=k_2\) 的 \((i,j)\)对数。这个预处理一下就好了。

——来自 \(\color{orange}{x义x}\) 巨佬的 题解

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[400005],cnt[25];
ll b[25][25],f[2000005];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
for(int j=1;j<=20;j++) b[j][a[i]]+=cnt[j];
cnt[a[i]]++;
}
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int k=0;k<(1<<20);k++){
for(int i=1;i<=20;i++){
if((k>>(i-1))&1) continue ;
ll tmp=0;
for(int j=1;j<=20;j++){
if((k>>(j-1))&1) tmp+=b[j][i];
}
f[k|(1<<(i-1))]=min(f[k|(1<<(i-1))],f[k]+tmp);
}
}
printf("%lld\n",f[(1<<20)-1]);
return 0;
}

T6:Radio Stations

施工中 \(qwq\)

【Virt.Contest】CF1215(div.2)的更多相关文章

  1. 【Virt.Contest】CF1321(div.2)

    第一次打虚拟赛. CF 传送门 T1:Contest for Robots 统计 \(r[i]=1\) 且 \(b[i]=0\) 的位数 \(t1\) 和 \(r[i]=0\) 且 \(b[i]=1\ ...

  2. 【Virt.Contest】CF1155(div.2)

    CF 传送门 T1:Reverse a Substring 只有本身单调不减的字符串不能转换为字典序更小的字符串.否则肯定会出现 \(s_i>s_{i+1}\) 的情况. 所以只要从头到尾扫一遍 ...

  3. 【小瑕疵】在div里插入img后在底部留有缝隙怎么解决

    [本文转载自http://blog.sina.com.cn/s/blog_9fd5b6df01013mld.html] 图片IMG与容器下边界之间有空隙怎么办?这里介绍3中简单的解决方法. 第一,给图 ...

  4. 【Codeforces Round】 #432 (Div. 2) 题解

    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)  A. Arpa and a research in Mexi ...

  5. 【Codeforces Round】 #431 (Div. 2) 题解

    Codeforces Round #431 (Div. 2)  A. Odds and Ends time limit per test 1 second memory limit per test ...

  6. 【CSS基础】实现 div 里的内容垂直水平居中

    方案一: 所有内容垂直水平居中 兼容性:IE8+. 条件:内容宽度和高度可以未知,可以是多行文字.图片.div. 描述:使用table-cell + vertical-align , html代码见文 ...

  7. 【java web】--css+div总结

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  8. 【网摘】监控 div 的内容变化

    数据是动态加载而来,而当无数据时,提示一下暂无数据.而数据是可以动态在当前页面即时添加的,故在无数据时所做提示,需要隐藏,所以找了这个方法.成功在动态添加数据后,暂无数据的提示没有了. if($(&q ...

  9. 两种隐藏元素方式【display: none】和【visibility: hidden】的区别

    此随笔的灵感来源于上周的一个面试,在谈到隐藏元素的时候,面试官突然问我[display: none]和[visibility: hidden]的区别,我当时一愣,这俩有区别吗,好像有,但是忘记了啊,因 ...

随机推荐

  1. Android Kotlin Annotation Processer

    Annotation Processer 注解处理器(Annotation Processer)是javac内置的注解处理工具,可以在编译时处理注解,让我们自己做相应的处理.比如生成重复度很高的代码, ...

  2. E - Road Reduction

    E - Road Reduction (atcoder.jp) 题意:一棵树n个点,m条路, di表示1-i的距离,问怎么选择边可以使得d2+...dn最短. 题解: 很明显,就是直接套最短路板子,判 ...

  3. http服务(postman调用方法及反参)

    #region 监听url #region 监听url路径请求 static HttpListener httpobj; private void listeningUrl() { //提供一个简单的 ...

  4. HK32F030MF4P6的Linux GCC工具链和VSCode开发环境

    HK32F030MF4P6简介 航顺的 HK32F030MF4P6, TSSOP20封装, Arm Cortex M0 内核, 内建32MHz时钟, 16K Flash, 2K RAM(实际上可用的有 ...

  5. kali2020.1修改root密码,以最高权限登录系统

    普通用户权限登录系统 sodu su切换为root权限 passwd root 按提示输入密码 再次输入密码 更新密码 右上角点切换用户 root/xxxx 更改成功,下面公布操图片

  6. Kubernetes(K8S)特性有哪些?

    Kubernetes简介 Kubernetes是一个开源的,用于管理云平台中做个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单且高效,Kubernetes提供了应用部署,规划 ...

  7. 【ProxySQL】ProxySQL Cluster的搭建

    文章转载自:https://blog.51cto.com/l0vesql/2104643 背景 早期的ProxySQL若需要做高可用,需要搭建两个实例,进行冗余.但两个ProxySQL实例之间的数据并 ...

  8. kubectl top命令

    kubectl top命令可显⽰节点和Pod对象的资源使⽤信息,它依赖于集群中的资源指标API来收集各项指标数据.它包含有node和pod两个⼦命令,可分别⽤于显⽰Node对象和Pod对象的相关资源占 ...

  9. CentOS7下yum安装GitLab-CE

    前提准备 建立git用户 useradd git 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 安装依赖库 yum instal ...

  10. 【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口

    [C++]从零开始的CS:GO逆向分析2--配置GLFW+IMGUI环境并创建透明窗口   使用的环境:Visual Studio 2017,创建一个控制台程序作为工程文件 1.配置glfw 在git ...