ABC365(D,E)
ABC365(D,E)
D - AtCoder Janken 3
- 石头剪刀布,给出对手的出招,问在保证不败的情况下最多能赢多少回
- 记 \(f_i,{0/1/2}\) 表示第 \(i\) 局出石头/剪刀/布 , 累计最多赢了多少回回, 直接转移即可
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=r;++i)
#define G(i,r,l) for(int i(r);i>=l;--i)
using namespace std;
using ll = long long;
const int N = 5e5 + 105;
const int inf = 0x3f3f3f3f;
int n;
int f[N][5],g[N];
char s[N];
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n>>s;
F(i,0,n-1){
if(s[i] == 'R') g[i + 1] = 0;
else if(s[i] == 'S') g[i + 1] = 1;
else if(s[i] == 'P') g[i + 1] = 2;
}
F(i,1,n) f[i][0] = f[i][1] = f[i][2] = -inf;
F(i,1,n){
if(g[i] == 0){
f[i][2] = max( f[i-1][0] , f[i-1][1] ) + 1;
f[i][0] = max( f[i-1][2] , f[i-1][1] );
}
else if(g[i] == 1){
f[i][0] = max( f[i-1][1] , f[i-1][2] ) + 1;
f[i][1] = max( f[i-1][0] , f[i-1][2] );
}
else if(g[i] == 2){
f[i][1] = max( f[i-1][0] , f[i-1][2] ) + 1;
f[i][2] = max( f[i-1][0] , f[i-1][1] );
}
}
cout << max({ f[n][0] , f[n][1] , f[n][2] }) << "\n";
return 0;
}
E - Xor Sigma Problem
- 求给定序列所有连续子串(长度大于1)异或和的总和
- 拆位计算 + 前缀异或和
- 考虑拆位计算,对于一个区间如果异或和的第 \(k\) 位是1, 说明有奇数个数这一位是1.
- 进而想到维护特定区间某一位出现的1的个数.
- 因为总情况数是 \(O(n^2)\), 所以我们不能一个个求, 但可以用前缀异或和覆盖所有区间, 特定区间1或0的个数同样可以用两个前缀和相减得到.
- 所以先求前缀异或和, 然后对于当前 \(i\), 统计第 \(k\) 位和 \(pre[i]\) 不一样的在 \(pre[1 \sim i-1]\) 中有多少个, 总和记为 \(cnt[k]\).
- 最后 \(ans = \sum_{i=0}^{30} 2^i \times cnt[k]\).
- 当然由于子串长度要大于 1, 再减去 \(\sum a[i]\) 即可.
- 时间复杂度 \(O(NlogA)\). (代码奇短! ! !)
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=r;++i)
#define G(i,r,l) for(int i(r);i>=l;--i)
using namespace std;
using ll = long long;
const int N = 3e5 + 105;
const int inf = 0x3f3f3f3f;
int n;
int a[N],num[33][2];
ll ans = 0;
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n; F(i,1,n) cin>>a[i] , a[i] ^= a[i-1] ;
F(i,0,30){ll cnt=0; num[i][0] = 1;
F(j,1,n) cnt += num[i][(((a[j] >> i) & 1) ^ 1)],num[i][((a[j] >> i) & 1)] ++ ;
ans += (1ll<<i) * cnt;
} return cout << ans << "\n",fflush(0),0;
}
随机推荐
- Win32 状态栏用法
WIN32 状态控件用法 1.创建控件 状态栏类名: STATUSCLASSNAME #define STATUSCLASSNAMEW L"msctls_statusbar32 ...
- [学习笔记]在不同项目中切换Node.js版本
@ 目录 使用 Node Version Manager (NVM) 安装 NVM 使用 NVM 安装和切换 Node.js 版本 为项目指定 Node.js 版本 使用环境变量指定 Node.js ...
- 一键k8s企业级集群部署(以k8s的1.18.0版本为例)
一.下载安装sealos wget https://github.com/fanux/sealos/releases/download/v3.2.0-beta.2/sealos && ...
- 老母鸡安装mqtt
大佬写好了, 按部就班操作一下就行了,在hass中添加mqtt可进行测试 玩客云搭建MQTT服务器 - 崔安兵 - 博客园 (cnblogs.com)
- WinForm DevExpress 添加行内按钮
1.在设计器里面添加一列,设置单元格不可编辑.只读属性 2. 在所在GridView属性里面添加CustomDrawCell事件与RowCellClick事件 private void gvMain_ ...
- NYX靶机笔记
NYX靶机笔记 概述 VulnHub里的简单靶机 靶机地址:https://download.vulnhub.com/nyx/nyxvm.zip 1.nmap扫描 1)主机发现 # -sn 只做pin ...
- 使用 iRingo 解锁本该属于你的苹果服务
为什么别人的 Spotlight 可以通过航班号查询航班信息,而我的不行?为什么别人的 Spotlight 可以直接看英超联赛的比分信息?为什么我的 Apple News 打不开?这其实是因为这些功能 ...
- 微前端实践MicroApp
微前端实践 本文主要是关于microApp的实践过程记录 本文主要内容如下: 什么是MicroApp? MicroApp的父子通讯方式以及路由介绍 如何部署相关应用? 安装 npm i @micro- ...
- 一文看懂global, nonlocal, local变量
Python中,变量是根据程序运行顺序进行的,比如函数外的变量,在函数内是可见的,但是可用,不可赋值.那么如何实现赋值呢? 利用global关键字进行. 在函数内,如果出现和函数外的变量同名变量,而且 ...
- 数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪
数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪 随着全球对可持续发展和产品透明度的关注日益增加,企业需要一种可靠的方法来跟踪和管理产品生命周期中的关键数据.我们 ...