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;
}
随机推荐
- springcloud线上发布超时之grpc
springcloud线上发布超时系列文章: springcloud线上发布超时之feign(ribbon饥饿加载) springcloud线上发布超时之grpc springcloud线上发布超时方 ...
- Docker简单使用总结
写在前面 最近在部署前后端分离的SpringBoot项目,发现使用Docker技术很方便,特此记录一下Docker常用命令 1.常用网站 Docker docs :https://docs.docke ...
- Web端OA办公后台管理系统(使用AxureRP设计)思路与效果分享
本期带来一套OA办公后台管理系统(办公一体化)的设计分享.本次的作品设计,使用AxureRP软件. 一套实用的后台OA系统,一定是功能强大.能覆盖常用功能的.本次分享的系统,包含组织.员工管理.考勤. ...
- dfs剪枝与优化
搜索树 剪枝方法 1.优化搜索顺序 2.排除等效冗余 3.可行性 4.最优性(估价) 5.记忆化(树形不会重复计算时不需要) A.针对每个维度边界信息缩放.推倒 B.计算未来最少花费 C.结合各维度的 ...
- IP报文格式详解
下图为常见的IP报文格式表: 上面是IP的报文格式,接下来我们先说明各个字段的意义.然后,用Etheral软件转包分析IP的报文格式. 1.版本:ip报文中,版本占了4位,用来表示该协议采用的是那一个 ...
- C primer plus笔记之初识C语言
初识C语言 --本文参考书籍: Stephen Prata的<C Primer Plus> 前言 C 语言是一门抽象的.面向过程的语言,C 语言广泛应用于底层开发,C 语言 ...
- Angular 18+ 高级教程 – Component 组件 の Angular Component vs Web Component
前言 在 初识 Angular 中我有提到, Angular 团队是一群不爱创新.爱 follow 标准.爱小题大做的一群人. 所以,要理解 Angular Component,我们就非得要先搞懂远古 ...
- CSS – 冷知识 (新手)
<img> extra 4px at the bottom 参考: Extra 4px at the bottom of html <img> The mysterious 4 ...
- java基础 -IO流笔记
610,文件的基础知识 文件流 输入流和输出流都是相对 java程序内存 而言 611,创建文件 在D盘下创建文件. package com.hspedu.file; import org.junit ...
- pytorch中LSTM各参数理解
nn.LSTM(input_dim,hidden_dim,nums_layer,batch_first) 各参数理解: input_dim:输入的张量维度,表示自变量特征数 hidden_dim:输出 ...