Codeforces Round #636 (Div. 3) A-D

简介: 笔记

A. Candies


题意

给定一个整数,判断是否存在1.png

思路

先对公式进行预处理 明显是一个等比数列

化简后得到

2.png

因为答案一定存在 所以用快速幂从小到大枚举即可

#include<iostream>
#include<cstdio>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#include<utility>
#include<deque>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define fi first
#define se second
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl '\n'
#define eps 1e-6
#define mem(n,a) memset(n,a,sizeof(n))
#define rep(i,be,en) for(int i=be;i<=en;++i)
#define pre(i,be,en) for(int i=en;i>=be;--i)
inline int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
inline int lowbit(int x) { return x & -x; }
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100010;
LL quick_pow(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1)ans *= a;
    a *= a;
    b >>= 1;
  }
  return ans;
}
int main() {
  int t;cin >> t;
  while (t--) {
    int n;cin >> n;
    for (int i = 2;i <= 32;++i) {
      int t = quick_pow(2, i) - 1;
      if (n % t == 0) {
        printf("%d\n", n / t);
        break;
      }
    }
  }
  return 0;
}


B. Balanced Array


题意

构造一个长度为n的数列,n为偶数,使得前3.png 个数全为偶数

3.png个数全为奇数并且使前后区间和相等


思路

观察样例可知 n/2为奇数时不能构造出来

n/2为偶数时 对前面的偶数按顺序构造,后面的n/2-1个奇数也按顺序构造,用最后一个奇数补足与偶数和的差值使前后区间和相等容易知道最后一个奇数应该为4.png

#include<iostream>
#include<cstdio>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#include<utility>
#include<deque>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define fi first
#define se second
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl '\n'
#define eps 1e-6
#define mem(n,a) memset(n,a,sizeof(n))
#define rep(i,be,en) for(int i=be;i<=en;++i)
#define pre(i,be,en) for(int i=en;i>=be;--i)
inline int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
inline int lowbit(int x) { return x & -x; }
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100010;
int main() {
  int t;cin >> t;
  while (t--) {
    int n;cin >> n;
    if ((n / 2) & 1)puts("NO");
    else {
      puts("YES");
      int t = 2;
      for (int i = 1;i <= n / 2; ++i)printf("%d ", t), t += 2;
      t = 1;
      for (int i = 1;i <= n / 2 - 1; ++i)printf("%d ", t), t += 2;
      printf("%d\n", n / 2 - 1 + n);
    }
  }
  return 0;
}

C. Alternating Subsequence


题意

从给定序列中选择一个正负交替的子序列使得子序列的和最大

思路

双指针,每次扫过一个正负号相同的区间,找到区间的最大值作为子序列的元素

#include<iostream>
#include<cstdio>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#include<utility>
#include<deque>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define fi first
#define se second
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl '\n'
#define eps 1e-6
#define mem(n,a) memset(n,a,sizeof(n))
#define rep(i,be,en) for(int i=be;i<=en;++i)
#define pre(i,be,en) for(int i=en;i>=be;--i)
inline int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
inline int lowbit(int x) { return x & -x; }
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 200010;
int a[N];
int np(int a) {
  if (a < 0)return 1;
  else return 2;
}
int main() {
  int t;cin >> t;
  while (t--) {
    int n;cin >> n;
    for (int i = 1;i <= n;++i)cin >> a[i];
    LL ans = 0;
    int s, p, maxn;
    p = 1;
    while (p <= n) {
      s = p;
      maxn = a[p];
      while (np(a[s]) == np(a[p]) && p <= n) {
        maxn = max(maxn, a[p]);
        ++p;
      }
      ans += maxn;
    }
    cout << ans << endl;
  }
  return 0;
}

D. Constant Palindrome Sum


题意

给一个长度为n的数列和一个k 要求用不大于k的数替换数组中的任意一个数 使 所有关于数组对称的两个位置的元素和相等 即5.png问最少替换多少次


思路

刚开始我想先算出每两个数对的和出现次数最多的当作x 再根据x与其他组数对的大小计算答案 后来发现这种方法是不可行的 因为每个数对和都不一样的情况是可能出现的 这时候无法判断到底选哪个作为x更合适

后来 看到别人的博客 才想起来下面这种方法

即 算出每个数对的和 并且记录该数对每一个x的贡献 再选择一个最小的当作答案

很容易分情况讨论

令minn = min(a[i], a[n - i + 1])

maxn = max(a[i], a[n - i + 1])

t = a[i] + a[n - i + 1]

delta代表差分数组

因为数组元素的范围是 [1,k]

所以数对的取值范围为 [2,2*k]

①x取 [2,minn] 时 即使较大的那个数改成了1 还是不符合这个范围 所以需要两个都改变

②x取 [minn + 1,maxn + k] 时,只需要改变其中一个数字即可

③x取 [maxn + k + 1, 2 * k] 时,两个都需要改变

④因为当数对和为x时 不需要改变任何一个数字 而第二部已经把这种情况包括了 所以需要减去 即 delta[x]–

#include<iostream>
#include<cstdio>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#include<utility>
#include<deque>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define fi first
#define se second
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl '\n'
#define eps 1e-6
#define mem(n,a) memset(n,a,sizeof(n))
#define rep(i,be,en) for(int i=be;i<=en;++i)
#define pre(i,be,en) for(int i=en;i>=be;--i)
inline int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
inline int lowbit(int x) { return x & -x; }
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 200010;
int a[N], delta[N << 1];
int main() {
  int t;cin >> t;
  while (t--) {
    memset(delta, 0, sizeof delta);
    int n, k;cin >> n >> k;
    for (int i = 1;i <= n;++i)cin >> a[i];
    for (int i = 1;i <= n / 2;++i) {
      int t = a[i] + a[n - i + 1];
      int minn = min(a[i], a[n - i + 1]);
      int maxn = max(a[i], a[n - i + 1]);
      delta[2] += 2;
      delta[minn + 1] -= 2;
      delta[maxn + k + 1] += 2;
      delta[2 * k + 1] -= 2;
      delta[minn + 1] ++;
      delta[maxn + k + 1]--;
      delta[x]--;
      delta[x + 1]++;
    }
    LL ans = INF;
    for (int i = 2;i <= 2 * k;++i) {
      delta[i] += delta[i - 1];
      ans = min(ans, (LL)delta[i]);
    }
    cout << ans << endl;
  }
  return 0;
}



目录
相关文章
|
Python
Python代码扫描目录下的文件并获取路径
【5月更文挑战第12天】Python代码扫描目录下的文件并获取路径
238 1
|
机器学习/深度学习 弹性计算 运维
ECS阿里云监控服务
ECS阿里云监控服务
356 3
|
Web App开发
在 HTML 中禁用 Chrome 浏览器的 Google 翻译功能
在 html 标签中添加 translate=“no” 属性,浏览器将不会翻译整个页面。
662 0
|
12月前
|
JavaScript 定位技术
echarts地图数据信息流向图效果
本文介绍了如何使用 ECharts 创建一个地图数据信息流向图效果,包括设置地理坐标、线条动画和流向图的实现方法,并通过 Vue.js 封装了一个可重用的 ECharts 地图组件。
613 23
echarts地图数据信息流向图效果
|
11月前
|
机器学习/深度学习 存储 SQL
AllData数据中台核心菜单十:指标体系
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
12月前
|
Ubuntu 机器人 语音技术
语音识别与语音控制的原理介绍
硬件平台 机器硬件:OriginBot(导航版/视觉版)PC主机:Windows(>=10)/Ubuntu(>=20.04)扩展硬件:X3语音版 运行案例 首先进入OriginBot主控系统,运行一下指令。请注意,部分操作OriginBot内暂未放入,请根据内容进行适当处理。 cd /userdata/dev_ws/ # 配置TogetheROS环境 source /opt/tros/setup.bash # 从tros.b的安装路径中拷贝出运行示例需要的配置文件。 cp -r /opt/tros/lib/hobot_audio/config/ . # 加载音频驱动,设备启动之后只
496 83
|
12月前
仿SOUL社交友附近人婚恋约仿陌陌APP网站源码
仿SOUL社交友附近人婚恋约仿陌陌APP网站源码
356 0
仿SOUL社交友附近人婚恋约仿陌陌APP网站源码
|
C#
C#小知识之中英文转换、去空格
# 一、中英文转换 ## 1、安装NPinYin ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231031-1f77b9b6.png?x-cos-security-token=kcWkaWALSQ5t0gKzZRkVwYOOBJMLQ8Ra8df6748cc017b8b22443671efb8aed172ct0qMmH-Si3jPfLmVc91udBHTdfdp2n1Qk-hBfLRQF5l22U2cHOMKfU7b0bWfl1t
340 0
C#小知识之中英文转换、去空格
|
编译器 数据安全/隐私保护 C++
C++一分钟之-属性友元与访问控制
【7月更文挑战第9天】C++中的友元机制允许非成员函数或类访问私有和保护成员,打破了封装性。友元需在类内声明,常见的错误包括忘记声明、过度使用及误解友元的非继承性。要避免错误,应明确声明友元,限制其使用,并理解其局限。示例展示了如何声明和使用友元函数来访问私有数据。谨慎使用友元以保持代码的健壮性和可维护性。
177 1
|
存储 Java 数据库
Java一分钟之-JPA实体监听器:@PrePersist, @PostLoad
【6月更文挑战第15天】JPA实体监听器通过`@PrePersist`等注解在实体生命周期关键点执行逻辑,例如设置默认值或处理并发更新。常见问题包括监听器未注册、并发冲突和性能影响。示例展示了如何在`@PrePersist`中设置默认创建时间和`@PostLoad`时初始化关联数据。使用监听器能增强灵活性,但也需注意潜在问题和优化。
325 6