猫猫接币币

给定两个容量分别为ab的盒子,已知第i秒天上会掉下i个金币,你会从第1秒开始接金币,每秒钟你可以选择任意一个盒子接金币,但是不能不选,你必须使得两个盒子刚好装满,请问是否存在某个时刻,使得恰好装满两个盒子,输出一个仅由 AB 组成的字符串,第\(i\)位的字符即表示第\(i\)秒用哪个盒子去接金币。

如果存在多种接金币的方法,输出任意一种正确接法即可

题解:贪心

假设第\(n\)秒恰好装满两个盒子,容易发现:\(\sum\frac{n(1+n)}{2} = a+b\)

存在一种这样的贪心构造:

对于\(1,2,3...n\)中这\(n\)个数字,我们从大到小装入盒子,哪个盒子能装就装哪个盒子

#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 2e5 + 10, M = 4e5 + 10; void solve()
{
int a, b;
cin >> a >> b;
int n = 0;
bool flag = false;
for (int i = 1; i <= 2000; ++i)
{
n += i;
if (n == a + b)
{
flag = true;
n = i;
break;
}
}
if (!flag)
{
cout << "NO" << endl;
return;
}
cout << "YES" << endl;
string ans;
for (int i = n; i >= 1; i--)
{
if (a >= i)
{
a -= i;
ans = "A" + ans;
}
else if (b >= i)
{
b -= i;
ans = "B" + ans;
}
}
cout << ans << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}

关于我转生成为位运算大师但做的却是一道关于前缀和的题目这件事

你的朋友刚学了位运算,但并不是特别的精通,他知道你是位运算大师,于是拿着下面这段伪代码来问你:

Input N
T = 0
While True:
X = N # (N - 1)
If N == X:
Break
End If
T = T + 1
N = X
End While
Output T

他定义了三个函数 \(f(x),g(x),h(x)\)分别表示当上述伪代码中的 # 符号被替换为 &(按位与)、|(按位或)以及 ^(按位异或)这三种运算符之后,输入 \(x\) 所得到的结果。

他给了你一个 \(n\),请你帮助他分别求出这三个函数的前缀和

\[\sum_{x=1}^{n}f(x),\sum_{x=1}^{n}g(x),\sum_{x=1}^{n}h(x),
\]

题解:思维

我们观察三个函数:

  1. 对于第一个函数手模后我们不难发现,每一次&操作都会减少一个最低位的1,所以\(f(x)\)的值为\(x\)在二进制表示下1的个数
  2. 对于第二个函数我们不难发现只有\(x\)偶数时,\(g(x)=1\),否则\(g(x)=0\)
  3. 对于第三个函数我们不难发现只有\(x\)偶数时,\(g(x)=2\),否则\(h(x)=1\),特殊的\(h(1)=0\)

那么我们只需要快速算出前缀和即可:

  1. 对于第一个函数的前缀和,我们不难发现每一位存在周期性,假设周期为\(p\),每个周期中1的个数为\(p/2\),所以我们只需要计算\(x\)已经经过了几个周期即可,最后\(x\)对\(p\)取模后,观察是否有没有漏算1
000000
000001
000010
000011
000100
000101
000110
000111

我们不难发现规律,对于第一位二进制,周期为\(2\),对于第二位二进制,周期为\(2^2\).....以此类推

  1. 对于第二个函数的前缀和我们只需要算出\([1,x]\)中有几个偶数即可,显然偶数的个数为$\lfloor \frac{x}{2} \rfloor $

  2. 对于第三个函数的前缀和我们只需要算出\([1,x]\)中有几个偶数和几个奇数即可,注意\(h(1)=0\),所以奇数的个数需要减去一

#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 2e5 + 10, M = 4e5 + 10; int n; void solve()
{
cin >> n;
int p = 2;
int ans1 = 0;
int m = n + 1;
while (m / p)
{
int t = p / 2;
ans1 += t * (m / p);
int t2 = m % p;
if (t2 > t)
ans1 += t2 - t;
p *= 2;
}
int t = p / 2;
ans1 += t * (m / p);
int t2 = m % p;
if (t2 > t)
ans1 += t2 - t;
int ans2 = n / 2;
int ans3 = 2 * (n / 2) + (n - n / 2 - 1);
cout << ans1 << " " << ans2 << " " << ans3 << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}

2023-05 多校联合训练 ZJNU站 热身赛的更多相关文章

  1. 2017多校联合训练2—HDU6054--Is Derek lying?(思维题)

    Is Derek lying? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. NFLSOJ 1072 - 【2021 六校联合训练 NOIP #1】异或(FWT+插值)

    题面传送门 一道非常不错的 FWT+插值的题 %%%%%%%%%%%% 还是那句话,反正非六校的看不到题对吧((( 方便起见在下文中设 \(n=2^d\). 首先很明显的一点是这题涉及两个维度:异或和 ...

  3. NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)

    由于 NFLSOJ 题面上啥也没有就把题意贴这儿了( 没事儿,反正是上赛季的题,你们非六校学生看了就看了,况且看了你们也没地方交就是了 题意: 给你一张 \(n\) 个点 \(m\) 条边的图 \(G ...

  4. 2016多校联合训练4 F - Substring 后缀数组

    Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...

  5. 2014 多校联合训练赛6 Fighting the Landlords

    本场比赛的三个水题之一,题意是两个玩家每人都持有一手牌,问第一个玩家是否有一种出牌方法使得在第一回和对方无牌可出.直接模拟即可,注意一次出完的情况,一开始没主意,wa了一发. #include< ...

  6. 2016多校联合训练contest4 1012Bubble Sort

    Bubble Sort Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  7. hdu 4649 Professor Tian 多校联合训练的题

    这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作  即  或 ,与 ,和异或 |   &  ^ )这样依次把操作符插入整 ...

  8. HDU OJ 5317 RGCDQ( 2015多校联合训练第3场) 暴力打表+小技巧

    题目连接:Click here 题意:在一个[L,R]内找到最大的gcd(f[i],f[j])其中L<=i<j<=R,f[x]表示i分解质因数后因子的种类数.eg:f[10]=2(1 ...

  9. HDU OJ 5326 Work( 2015多校联合训练第3场) 并查集

    题目连接:戳ME #include <iostream> #include <cstdio> #include <cstring> using namespace ...

  10. HDU 4643 GSM 暑期多校联合训练第五场 1001

    点击打开链接 我就不说官方题解有多坑了 V图那么高端的玩意儿 被精度坑粗翔了 AC前 AC后 简直不敢相信 只能怪自己没注意题目For the distance d1 and d2, if fabs( ...

随机推荐

  1. RxJS 系列 – Observable & Creation Operators

    前言 RxJS 最大篇幅就是一堆的 operators, 但是那些概念并不多, 只要常用就能熟能生巧了. Observable 和 Subject 反而需要我们了解清楚. 所以这篇我们先来了解这 2 ...

  2. tailwindcss 3.3.3(完成入门,需要补充每个单独样式)

    归纳 修饰符堆叠 <button class="dark:md:hover:bg-fuchsia-600"> 以下为修饰符 伪类伪元素 使用方法: 在实用程序类前添加h ...

  3. EAS(能量感知调度)绿色节能调度器

    能量感知调度(EAS)使调度程序能够预测其决策对 CPU 消耗的电量的影响. EAS 依赖于 CPU 的能量模型 (EM) 来为每个任务选择省电的 CPU,同时要求对执行任务的吞吐量的影响最小. EA ...

  4. 数据库周刊29│2020数据库研究报告;Oracle取消今年技术大会;腾讯云DBbridge发布支持一键迁库;饿了么迁至阿里云;PG数组查询;Oracle被比特币勒索;DM8 安全管理…

    摘要:墨天轮数据库周刊第29期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档.   热门资讯 1.快讯:2020年Oracle OOW大会因疫情取消 系近20年首度[摘要]Oracle ...

  5. iOS Masonry使用小结

    一.Masonry简介 Masonry是一个轻量级的布局框架,它拥有自己的描述语法(采用更优雅的链式语法封装)来自动布局,具有很好可读性且同时支持iOS和Max OS X等. 二.Masonry的基本 ...

  6. yarn 和 npm 不能混合使用

    当有 yarn.lock 的时候说明项目使用的yarn 创建的 则后面的都要使用 yarn 操作,比如下载 包 等 : 当项目没有 yarn.lock 而是 package.json.lock 说明项 ...

  7. 有没有开发过⼀些vue插件?举例说说 - 批量引入插件

    有过,项⽬开发的时间⻓了,沉淀了不少业务通⽤全局组件,想把他们统⼀进⾏注册,就封装了⼀个⼩ 插件 当时其实⼀开始也没有什么思路,后来扒了⼀下 elementUI的源码,仿了⼀下它的写法,流程我还⼤概记 ...

  8. Kubernetes 边缘节点抓不到监控指标?试试这个方法!

    KubeSphere v3.1.0 通过集成 KubeEdge,将节点和资源的管理延伸到了边缘,也是 KubeSphere 正式支持边缘计算的第一个版本. 笔者也第一时间搭建和试用了边缘节点相关的功能 ...

  9. 题解:P9784 [ROIR 2020 Day1] 超速

    传送门 洛谷题解 思路 我们设 \(T\) 为所花的总时间,\(d\) 为超速多少. 然后不难知道 $ T = \sum_{i = 1}^{n} \frac{l_i}{v_i+d}$,所以我们实际上是 ...

  10. idea项目提交到码云

    第一步:创建一个项目 第二步:在码云上新建一个项目.[注意把使用Readme复选框取消掉] 第三步:复制gitee地址 第四步:创建本地git仓库 第五步:选择自己需要上传到码云的项目名 第六步:提交 ...