首页 > 其他分享 >ARC184C 做题记录

ARC184C 做题记录

时间:2024-09-27 10:01:26浏览次数:1  
标签:... 记录 ll ARC184C 偶数 define bmod 折痕

link

我们考虑所有编号为奇数的折痕,其形如 VMVMVM...,其中 V 表示下凹,M 为上凸。这个可以证明:

  • 归纳证明。考虑第一个折痕,其在最后一次对折时产生,显然为 V

  • 假设前 \(2^c - 1\) 条奇数编号的折痕形如 VMVMVM...,第 \(2^c\) 条折痕会将前面这些折痕对称过去并取反(例如会在 VMVMVMV 末尾接上 MVMVMVMV,变为 VMVMVMVMVMVMVMV),因此前 \(2^{c+1} - 1\) 条奇数编号的折痕也满足这个结构。

类似的,我们可以推广这个结论:对于任意一个 \(c(0\le c\le 99)\),拎出所有编号的 lowbit 为 \(2^b\) 的折痕,它们的结构形如 VMVMVM...。证明可以考虑忽略所有 lowbit 小于 \(2^c\) 的折痕,就是上面的结论。

接下来回到原问题,我们首先对 \(a_{1...n}\) 分类,分成奇数和偶数两类。

令 \(k\) 为 \(a_{1...n}\) 需要加的增量。如果 \(k\) 为奇数,则 \(a\) 中的偶数的贡献可以确定;如果 \(k\) 为偶数,则 \(a\) 中的奇数的贡献可以确定。

当 \(k\) 为偶数时,为了确定贡献是 \(0\) 还是 \(1\),我们还需要对 \(\frac {k} 2\) 的奇偶性即 \(k \bmod 4 = 2\) 或 \(k \bmod 4 = 0\) 进行分类讨论。当 \(k \bmod 4 = 0\) 时,贡献为 \(\sum\limits_{i = 1} ^ n [a_i \bmod 4 = 3]\);当 \(k \bmod 4 = 2\) 时,贡献为 \(\sum\limits_{i = 1} ^ n [a_i \bmod 4 = 1]\)。

设 \(f(a, u)\) 为对于给定的 \(a\) 序列,满足 \(k \bmod 2 = u\) 的答案。当 \(u = 0\) 即 \(k\) 为偶数时,我们还需要求所有偶数组成的序列答案,设 \(b\) 序列为 \(a\) 中所有偶数除以二组成的序列。注意有个隐性条件:当 \(k \bmod 4 = 0\) 时,从 \(f(b, 0)\) 处转移过来;当 \(k \bmod 4 = 2\) 时,从 \(f(b, 1)\) 处转移过来。

\(u = 1\) 的情况是类似的。当递归层数达到 \(\log_2 a\) 时可以直接返回,每个数至多被遍历 \(O(\log a)\) 次,时间复杂度 \(O(n\log a)\)。

  • 启示:先观察必要的东西,找到必要的性质利于下一步,然后是这种二进制递归形式的 trick
点击查看代码 ```cpp #include #define ll long long #define fi first #define se second #define mkp make_pair #define pir pair <ll, ll=""> #define pb emplace_back #define i128 __int128 using namespace std; const ll maxn = 1010, inf = 1e18; ll n, a[maxn], b[maxn]; pir solve(ll d, ll l, ll r) { if(l > r) return mkp(0, 0); if(d == 1) return mkp(-inf, r - l + 1); ll cnt[4] = {}, pl = l, pr = r; for(ll i = l; i <= r; i++) { if(a[i] & 1) b[pl++] = a[i]; else b[pr--] = a[i]; ++cnt[a[i] & 3]; } for(ll i = l; i <= r; i++) a[i] = b[i] >> 1; pir x = solve(d - 1, l, pl - 1), y = solve(d - 1, pr + 1, r); pir ret; ret.fi = max(cnt[2] + x.fi, cnt[0] + x.se); ret.se = max(cnt[3] + y.se, cnt[1] + y.fi); return ret; } int main() { scanf("%lld", &n); for(ll i = 1; i <= n; i++) scanf("%lld", a + i); pir ret = solve(100, 1, n); printf("%lld", max(ret.fi, ret.se)); return 0; } ```

标签:...,记录,ll,ARC184C,偶数,define,bmod,折痕
From: https://www.cnblogs.com/Sktn0089/p/18435113

相关文章

  • 易优CMS安装时,提示在写入表ey_weapp_multicity记录失败-eyoucms
    当你在安装易优CMS时遇到“写入表ey_weapp_multicity记录失败”的提示时,这通常意味着在安装过程中数据库出现了问题,可能是由于数据库连接问题、权限问题、数据冲突等原因造成的。以下是一些可能的解决步骤:步骤1:检查数据库连接确认数据库连接信息确保数据库连接信息(主机名......
  • 使用 Redis 记录用户连续登录天数的方法及代码分享
    目录标题:使用Redis记录用户连续登录天数的方法及代码分享一、为什么不适合放在数据库中二、Redis的bitmap介绍三、存储方式及统计方法(一)以每天维度存储(二)以用户维度存储在本文中,我们将探讨如何使用Redis记录用户连续登录天数的问题。这是一个在面试中可能会遇到......
  • repo 简单搭建学习记录
    repo简单搭建学习记录一、repo搭建参考:repo仓库搭建教程【CSDN】gitrepo工具详细使用教程【CSDN】搭建Repo服务器【CSDN】使用REPO管理GIT多仓库1、服务端repo需要一个服务端(manifest仓库),用来列出所有子仓库的路径等信息,如果在github等远程托管平台创建服务端,那......
  • Codeforces Round 971 (Div. 4)题解记录(G3待补)
    A.Minimize!暴力模拟一遍即可#include<iostream>#include<queue>#include<deque>#include<map>#include<set>#include<stack>#include<vector>#include<bitset>#include<math.h>#include<random>#include&l......
  • 算法记录——树
     二叉树3.1二叉树的最大深度思路:二叉树的最大深度=根节点的最大高度。因此本题可以转换为求二叉树的最大高度。        而求高度的时候应该采用后序遍历。遍历顺序为:左右中。每次遍历的节点按后序遍历顺序,先收集左右孩子的最大高度,再最后处理当前节点的最大高......
  • 算法记录——链表
    2.链表2.1判断是否是回文链表1.方法一:利用栈反转链表/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,Lis......
  • BladeX开发入门(记录)
    BladeX物联网平台是一款高度集成的物联网解决方案,涵盖设备管理、数据采集、实时监控、数据分析以及开放API服务等核心功能。平台经过精心设计与开发,提供了全面的品类、产品和设备支持。设备注册成功后,能够轻松桥接至其他物联网云平台,实现设备的无缝集成。同时提供服务端订阅功......
  • 安全:snoopy: 只能记录root的操作命令
    一,问题现象:1,一台新服务器上安装了snoopy之后,发现一个问题,它只能记录root的操作命令,其他用户的操作命令完全记录不下来2,查看配置:[root@backup~]#snoopyctlconf;Optionsfromconfigfile(ordefaults):/etc/snoopy.ini[snoopy]error_logging=yesfilter_chain=e......
  • VN9D DataSheet 阅读记录
    简介VN9D30是一个高边外设,有6个channel,使用24路SPI进行通信,用于汽车领域。Generaldeepcoldcrankingapplications(指深冷启动应用场景)IntegratedPWMenginewithindependentphaseshiftandfrequencygeneration(foreachchannel)IntegratedPWMengine:指的......
  • ‌华为手机记录密码后页面显示的用户名可以通过修改设置来隐藏
    1、打开手机主页面,进入【手机设置】。2、在设置界面中,找到并选择【安全】菜单。 3、进入“密码保险箱”。 4、进入 “管理应用自动填充” 5、关闭保存和自动填充  ......