cf #796 Div.2

文章目录

  • cf #796 Div.2
    • [A. Cirno's Perfect Bitmasks Classroom](https://codeforces.com/contest/1688/problem/A)
    • [B. Patchouli's Magical Talisman](https://codeforces.com/contest/1688/problem/B)
    • [C. Manipulating History](https://codeforces.com/contest/1688/problem/C)
    • [D. The Enchanted Forest](https://codeforces.com/contest/1688/problem/D)

A. Cirno’s Perfect Bitmasks Classroom

找到一个最小的y使得x&y>0 && x^y>0

  • 题解

    1. 要使x&y>0中y的最小值,只要让x的最低位1在y的对应位上也为1即可。所以满足此式的最小y为lowbit(x)。
    2. 要使x^y>0,只要x,y中存在某对应位是相异的即可。如果上述所求的y已经满足要求了,则不用计算,因为这个条件的运算还可能使y增大。如果上述求的y不满足此式,要么让x的最低位1在y的对应位上为0(不可能,与上一条矛盾),要么让x的最低位0在y的对应位置上为1。
    3. 同时满足上述两个条件的y就是y1+y2
  • 代码

#include <iostream>
#include <cmath>using namespace std;
typedef long long LL;int lowbit(int x){return x&-x;
}void solve()
{int x;cin>>x;int a=lowbit(x);//求y1if(x^a){//y1已经符合2直接输出cout<<a<<'\n';return ;}//y1不符合2int i,b;for(i=0;i<=30;i++){//找最低位0if(x&1)x=x>>1;else break;}b=pow(2,i);//求得y2cout<<a+b<<'\n';//y=y1+y2
}int main()
{int T;cin>>T;while(T--){solve();}return 0;
}

B. Patchouli’s Magical Talisman

  • 题意

    给定一个整数数组,可以进行两种操作:1.删除任意两个数a,b,同时增加一个数a+b;2.选定某数除以2。输出让所有数都变奇数的最小操作步数。

  • 题解

    1. 如果数组中既有奇数又有偶数,那么把一个偶数变奇数只需要选一个奇数与这个偶数相加,最小步数为偶数的个数。因为把一个偶数变成奇数的最小步数为1,所以这样奇偶相加变换已经是最优方案。

    2. 如果数组中全是偶数,只需选一个偶数先变成奇数就划归成上一情况,那么这个偶数需选lowbit最小的(lowbit的1的位置代表这个数变成奇数的次数)即变成奇数所需次数最小。

  • 代码

#include <iostream>using namespace std;int lowbit(int x){return x&-x;
}int main()
{int T;cin>>T;while(T--){int n,x,odds=0,evens=0,min_lowbit_even=0x3f3f3f3f;cin>>n;for(int i=1;i<=n;i++){cin>>x;if(x&1)odds++;else {evens++;min_lowbit_even=min(min_lowbit_even,lowbit(x));}}if(odds)cout<<evens<<'\n';else {int a=-1;//最小lowbit变成奇数所需的次数while(min_lowbit_even){a++;min_lowbit_even>>=1;}cout<<n-1+a<<'\n';}}return 0;
}

C. Manipulating History

  • 题意

    初始串只有1个字母,每次选择任意子串将其替换成其他串,给出打乱顺序的操作序列和最终结果,问字符串中最初的字母是什么

  • 题解

    统计每个字母出现的次数,出现奇数次的字母为初始字母。

    因为每个字母在被添加进来时会出现一次,当被替换删除的的时候会再出现一次或者一直保留到最终字符串中也会出现一次,故一定出现偶数次。而最初的字母不需被添加,所以只会在被替换删除或者保留到最后字符串中出现一次,即最初字母只出现奇数次。

  • 代码

#include <iostream>
#include <cstring>using namespace std;int main()
{int T;cin>>T;while(T--){int n;int a[26]={0};string str;cin>>n;n=2*n+1;while(n--){cin>>str;int len=str.length();for(int i=0;i<len;i++)a[str[i]-'a']++;}for(int i=0;i<26;i++)if(a[i]&1)cout<<(char)(i+'a')<<'\n';}return 0;
}

D. The Enchanted Forest

  • 题意

    给出一个分数序列,可以任选一个初始位置,每次可以向左/向右/不动,然后取走这个位置上的全部分数,同时所有位置分数+1,问走k步的分数最大值为多少

  • 题解

    对于位置i,其对分数的贡献为a[i]+(t[i]-1),t[i]表示最后一次到达i位置的时间(因为可能会多次经过i,所以在i位置的收获的多长出来的分数为t[i])。所以若选择的位置为pos1,pos2,pos3…,那么答案就是
    ∑ a [ i ] + ∑ ( t [ i ] − 1 ) , 上下限取决于经过的点个数 \sum{a[i]}+\sum{(t[i]-1)},上下限取决于经过的点个数 ∑a[i]+∑(t[i]−1),上下限取决于经过的点个数

    1. k<=n;即能选的位置最多为k个,t[i]-1的和是固定的一定是s[0,k-1],而要让答案尽量大只能让a[i]之和大,即求长度为k的连续区间和的最大值。
    2. k>n;即最多选的位置为n个,a[i]的和固定为前n个数的和,要让答案大只能让最后到达点的位置的时间最大,故t[i]-1取k-1,k-2,k-3…这n个到达的时间点
  • 代码

#include <iostream>using namespace std;
const int N=2e5+5;
int a[N],pre[N];int main()
{int T;cin>>T;while(T--){int n,k;cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];pre[i]=pre[i-1]+a[i];//前缀和}if(k>n){int res=pre[n];for(int i=1;i<=n;i++)res+=k-i;cout<<res<<'\n';}else {int res=0;for(int i=k;i<=n;i++)res=max(res,pre[i]-pre[i-k]);for(int i=0;i<k;i++)res+=i;cout<<res<<'\n';}}return 0;
}

cf #796 Div.2相关推荐

  1. CF #366(div.2) C 模拟,思维

    CF #366(div.2)  C.  Thor 题意:一个手机n个联系人,有q个操作.每次给出ty和ai,如ty==1,表示收到ai的一条信息:如ty==2,表示将ai发的信息都看掉:如ty==3, ...

  2. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

  3. cf #823 Div.2(A~C)

    Cf #823 Div.2 文章目录 Cf #823 Div.2 [A. Planets](https://codeforces.com/contest/1730/problem/A) [B. Mee ...

  4. cf #818 Div.2(A~C)

    Cf #818 Div.2 文章目录 Cf #818 Div.2 [A. Madoka and Strange Thoughts](https://codeforces.com/contest/171 ...

  5. CF #683 div.2

    CF #683 div.2 目前 ABCD A. Add Candies B. Numbers Box C. Knapsack D. Catching Cheaters 结尾 A. Add Candi ...

  6. CF#764(div.3A~D)dp进阶

    CF#764(div.3A~D)&&dp进阶 CF#764(div.3) Problem - A - Codeforces 题意 一个数列,每次操作可以使这个数列中的任何数加1,问最少 ...

  7. CF #764 Div.3(B ~D)

    CF #764 Div.3 B题 Make AP 给定a b c 使其中一个数 乘 任意正整数m 问是否能构成成差数列 我们可以想到等差数列的性质 2b=a+c2b = a + c 2b=a+c 思路 ...

  8. cf #825 Div.2(A~C2)

    Cf #825 Div.2 文章目录 Cf #825 Div.2 [A. Make A Equal to B](https://codeforces.com/contest/1736/problem/ ...

  9. edu cf #138 Div.2(A~D)

    edu cf #138 Div.2 文章目录 edu cf #138 Div.2 [A. Cowardly Rooks](https://codeforces.com/contest/1749/pro ...

最新文章

  1. Ext-第一课基本配置
  2. dataframe按某字段排序
  3. criteria创建criteria 左连接 再 添加 add example,报错 ClassCastException:
  4. jquery 封装页面之间获取值
  5. 静态成员变量的初始化,vector类型变量初始化
  6. linux iconv函数失败,Linux 编码转换 (iconv失败的解决方法)
  7. Oracle client 安装、配置
  8. python turtle画五边形_python画一朵玫瑰给你
  9. 知识图谱java实现_知识图谱:neo4j(四)Java API
  10. 一次ORACLE启动报错修复的记录
  11. python三维可视化图,如何使用Python在(交互式)3D中可视化图形?
  12. 【2019杭电多校第六场1008=HDU6641】TDL(思维)
  13. 前端引入阿里图标库的最便捷方式
  14. 离散数学:n个相同的小球,可以放入m个相同的盒子里,允许有空盒,问有多少种不同方法
  15. VMware Workstation 虚拟机安装windows 10 系统步骤
  16. poi hssfcellstyle 文字方向_揭秘!文字识别在高德地图数据生产中的演进
  17. Python环境搭建-自用
  18. 《千手智能打铃》使用说明
  19. Python爬虫实战四 | 盘搜搜1.2-网盘搜索神器开源
  20. 企业不得不知的BYOD实施十大风险

热门文章

  1. 如何在职场上变得更优秀
  2. 【IDEA】代码未提交(commit)拉取(pull) 远程代码导致代码全部丢失的bug
  3. 方正SOA中间件的平台发展史
  4. 【Python_urllib学习笔记(四)】基于urllib和re,爬取豆瓣电影新片榜
  5. git pull 配置免密_git仓库免密码登陆配置
  6. 基于Matlab的遗传算法优化BP神经网络的算法实现(附算法介绍与代码详解)
  7. APS生产计划排产 — 排产结果拉动模具工装需求计划
  8. 使用pg_hint_plan固定Postgresql执行计划
  9. C#与三菱PLC通信(FX5U工控设备)
  10. 如何添加计算机硬盘分区,教你电脑怎么分区