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;
}

随机推荐

  1. Spring 相关知识

    https://www.bilibili.com/video/BV1gW411W7wy?spm_id_from=333.788.b_636f6d6d656e74.173 老雷的Spring注解驱动 源 ...

  2. Turbo Sparse:关于LLM稀疏性的探索

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/18352898 关于llama稀疏性的观察 llama原始模型的FFN计算过程为: \[f(x) = \text ...

  3. CORDIC算法解释及FPGA实现(圆坐标系)

    CORDIC算法解释及Verilog仿真(圆坐标系) CORDIC算法原理阐述 CORDIC(Coordinate Rotation Digital Computer)算法,即坐标旋转数字计算方法,是 ...

  4. vscode注释快捷键

    单行注释 ctrl+/ 多行注释 ctrl+alt+a 文档注释 /** 复制上面一行 ctrl+d 选中段落整体向左或向右缩进 ctrl +[ 或 ctrl + ] 查找 ctrl + f

  5. Coursera, Big Data 5, Graph Analytics for Big Data, Week 5

    Computing Platforms for Graph Analytics programming models for Graphs Giraph and GraphX 其中讲 GraphX 的 ...

  6. Entity Framework Plus: 让 EF Core 开发如虎添翼

    EF Core介绍 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台版的常用 Entity Framework 数据访问技术,EF Core 是适用于 .NET 的 ...

  7. HTML – Native Dialog Modal

    前言 之前介绍 Native Form 的时候有提及过 method="dialog", 但由于它太新了, 所以没去研究. 这篇就介绍一下. Dialog 也好 Modal 也好, ...

  8. 揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证

    揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证 介绍 JWT(JSON Web Tokens)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在网络上安全地传输信息. ...

  9. JAVAEE——navicat安装

    Navicat Premium 15激活步骤 准备 Navicat Premium 15.Navicat Premium 15注册机 用到的都放在这里了: 链接:https://pan.baidu.c ...

  10. LinerProgression

    手动实现线性回归 点击查看代码 import torch import pandas as pd import numpy as np import matplotlib.pyplot as plt ...