AcWing - 寒假每日一题2023(DAY 6——DAY 10)

news/2023/5/28 7:30:44

文章目录

  • 一、AcWing 4645. 选数异或(中等)
    • 1. 实现思路
    • 2. 实现代码
  • 二、AcWing 4644. 求和(简单)
    • 1. 实现思路
    • 2. 实现代码
  • 三、AcWing 4653. 数位排序(简单)
    • 1. 实现思路
    • 2. 实现代码
  • 四、AcWing 4655. 重新排序(中等)
    • 1. 实现思路
    • 2. 实现代码
  • 五、AcWing 4652. 纸张尺寸(简单)
    • 1. 实现思路
    • 2. 实现代码

一、AcWing 4645. 选数异或(中等)

题目描述

给定一个长度为 n 的数列 A1,A2,⋅⋅⋅,An 和一个非负整数 x,给定 m 次查询,每次询问能否从某个区间 [l,r] 中选择两个下标不同的数使得他们的异或等于 x。

输入格式

输入的第一行包含三个整数 n,m,x。
第二行包含 n 个整数 A1,A2,⋅⋅⋅,An
接下来 m 行,每行包含两个整数 li,ri 表示询问区间 [li,ri]。

输出格式

对于每个询问,如果该区间内存在两个数的异或为 x 则输出 yes,否则输出 no

数据范围

对于 20% 的评测用例,1 ≤ n,m ≤ 100
对于 40% 的评测用例,1 ≤ n,m ≤ 1000
对于所有评测用例,1 ≤ n,m ≤ 100000,0 ≤ x < 220,1 ≤ li ≤ ri ≤ n,0 ≤ Ai <220

输入样例

4 4 1
1 2 3 4
1 4
1 2
2 3
3 3

输出样例

yes
no
yes
no

样例解释

显然整个数列中只有 2,3 的异或为 1。

具体实现

1. 实现思路

  • 我们有 n 个数,然后在 n 个数当中进行 m 次询问(判断),每次询问给一个区间,判断这个区间是否有一对数的异或值等于 x,有的话输出 yes,没有的话输出 no
  • 由于 n,m 的数据范围是100000,因此,我们需要将时间复杂度控制在 O(nlogn)。
  • 首先发现 a ^ b = x -> a ^ x = b -> b ^ x = a,也就是我们只要先把 x 跟每个数的异或值 b 提前算出,如果我们知道的了 b,那么只要 b 在 l ~ r 的范围内就符合题意了。这时输出 Yes 即可。
  • 但是,直接暴力判断的话,要两层 for 循环,时间复杂度时 O(n2),不符合要求。
  • 如果在 l 到 r 当中存在,那么一定在 1 到 r 当中存在(用于缩减询问次数)。
  • 假设,fi 是在 ai 左边,与 ai 配对的最近的一个数,那么 fi 一定是小于 r 的,我们只需要判断 fi 是否大于 l 即可。因此,我们只需要寻找这个 i 。
  • 为了简便,我们可以设定一个数组 g[i] 用于表示 i 左边 fi 的最大值,只需要判断 g® 是否大于等于 l。

2. 实现代码

#include <bits/stdc++.h>using namespace std;// 1<<20 表示2的20次方,+10是为了防止溢出
const int N = 100010, M = (1 << 20) + 10; int n, m, x;
//last[M]表示每个数最后一次出现的位置
//g[N]表示用于表示 i 左边 f~i~ 的最大值
int last[M], g[N];int main()
{cin >> n >> m >> x;for (int i = 1; i <= n; i ++ ){int a;cin >> a;//如果一个数字没有出现过,last数组是全局变量,就是0//递归g[i] = max(g[i - 1], last[a ^ x]);//更新lastlast[a] = i;}while (m -- ){int l, r;cin >> l >> r;if (g[r] >= l) {puts("yes");}else{puts("no");}}system("pause");return 0;
}

二、AcWing 4644. 求和(简单)

题目描述

给定 n 个整数 a1,a2,⋅⋅⋅,an,求它们两两相乘再相加的和,即
S=a1⋅a2+a1⋅a3+⋅⋅⋅+a1⋅an+a2⋅a3+⋅⋅⋅+an−2⋅an−1+an−2⋅an+an−1⋅an

输入格式

输入的第一行包含一个整数 n。
第二行包含 n 个整数 a1,a2,⋅⋅⋅,an

输出格式

输出一个整数 S,表示所求的和。
请使用合适的数据类型进行运算。

数据范围

对于 30% 的数据,1 ≤ n ≤ 1000,1 ≤ ai ≤ 100。
对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。

输入样例

4
1 3 6 9

输出样例

117

具体实现

1. 实现思路

  • 如果直接采取暴力做法两个 for 循环直接会超时,因此,需要进行优化。
  • 可以使用前缀和或者推导公式两种方法,递推公式整体比较复杂,在此不做过多叙述。
  • 前缀和详见博文 基础算法-前缀和。

2. 实现代码

#include <bits/stdc++.h>using namespace std;const int N = 200010;int n;
int a[N];int main()
{cin >> n;long long sum = 0;for(int i = 1; i <= n; i ++ ){cin >> a[i];sum += a[i];}long long res = 0, cnt = 0;   for(int i = 1; i <= n; i ++ ){cnt += a[i];res += a[i] * (sum - cnt);}cout << res << endl;system("pause");return 0;
}

三、AcWing 4653. 数位排序(简单)

题目描述

小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?

输入格式

输入第一行包含一个正整数 n。
第二行包含一个正整数 m。

输出格式

输出一行包含一个整数,表示答案。

数据范围

对于 30% 的评测用例,1 ≤ m ≤ n ≤ 300。
对于 50% 的评测用例,1 ≤ m ≤ n ≤ 1000。
对于所有评测用例,1 ≤ m ≤ n ≤ 106

输入样例

13
5

输出样例

3

样例解释

1 到 13 的排序为:1,10,2,11,3,12,4,13,5,6,7,8,9。
第 5 个数为 3。

具体实现

1. 实现思路

  • 不可以实时计算每一个数字的数位和,有可能会导致超时。
  • 因此,我们可以使用一个数组,将每个数的数位之和存储进去,然后使用快速排序即可。
  • 快速排序详见 基础算法-快速排序。

2. 实现代码

#include <bits/stdc++.h>using namespace std;const int N = 1000010;int n, m;
int w[N], s[N];bool cmp(int a, int b)
{if (s[a] != s[b]) {return s[a] < s[b];}return a < b;
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i ++ ){w[i] = i;for (int j = i; j != 0; j /= 10){s[i] += j % 10;}}sort(w + 1, w + n + 1, cmp);cout << w[m] << endl;system("pause");return 0;
}

四、AcWing 4655. 重新排序(中等)

题目描述

给定一个数组 A 和一些查询 Li,Ri,求数组中第 Li 至第 Ri 个元素之和。
小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。
小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?

输入格式

输入第一行包含一个整数 n。
第二行包含 n 个整数 A1,A2,⋅⋅⋅,An,相邻两个整数之间用一个空格分隔。
第三行包含一个整数 m 表示查询的数目。
接下来 m 行,每行包含两个整数 Li、Ri,相邻两个整数之间用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

数据范围

对于 30% 的评测用例,n,m ≤ 50;
对于 50% 的评测用例,n,m ≤ 500;
对于 70% 的评测用例,n,m ≤ 5000;
对于所有评测用例,1 ≤ n,m ≤ 105,1 ≤ Ai ≤ 106,1 ≤ Li ≤ Ri ≤ n。

输入样例

5
1 2 3 4 5
2
1 3
2 5

输出样例

4

样例解释

原来的和为 6+14=20,重新排列为 (1,4,5,2,3) 后和为 10+14=24,增加了 4。

具体实现

1. 实现思路

  • 首先,我们可以先统计一下每一位数在答案当中会加多少次。
  • 具体方法可以通过差分实现,当 l 到 r 这段区间被求和时,就 将 bl 加上 1,br+1 减去 1 就可以了。具体详见 基础算法-差分。
  • 然后,重新排列,使得最大的相互对应,按照顺序去配对。
  • 求和的过程就是前缀和的步骤,具体详见 基础算法-前缀和。

2. 实现代码

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 100010;int n, m;
//w[N]表示原数组
//s[N]表示记录被加次数的数组
int w[N], s[N];int main()
{cin >> n;for (int i = 1; i <= n; i ++ ){cin >> w[i];}cin >> m;while (m -- ){int l, r;cin >> l >> r;s[l] ++, s[r + 1] -- ;}//对原数组求前缀和for (int i = 1; i <= n; i ++ ){s[i] += s[i - 1];}//最初的总和LL sum1 = 0;for (int i = 1; i <= n; i ++ ){sum1 += (LL)s[i] * w[i];}//重新排序后的总和LL sum2 = 0;sort(s + 1, s + n + 1);sort(w + 1, w + n + 1);for (int i = 1; i <= n; i ++ ){sum2 += (LL)s[i] * w[i];}cout << sum2 - sum1 << endl;system("pause");return 0;
}

五、AcWing 4652. 纸张尺寸(简单)

题目描述

在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm×841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm×594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。
将 A1 纸沿长边对折后为 A2 纸,依此类推。
输入纸张的名称,请输出纸张的大小。

输入格式

输入一行包含一个字符串表示纸张的名称,该名称一定是 A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。

输出格式

输出两行,每行包含一个整数,依次表示长边和短边的长度。

输入样例 1

A0

输出样例 1

1189
841

输入样例 2

A1

输出样例 2

841
594

具体实现

1. 实现思路

  • 只需要依次递推计算即可,中间需要注意长边和短边的变换。
  • 当 x 小于 y 的时候,下一次就是 y 折半,为了方便,这里直接将 x 与 y 交换即可。

2. 实现代码

#include <bits/stdc++.h>using namespace std;int main()
{int n;char s;cin >> s >> n;int x = 1189, y = 841;while (n -- ){x /= 2;if (x < y){swap(x, y);}}cout << x << endl << y << endl;system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4567066.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

2021年中国健康体检现状与格局分析,老龄化趋势推动产业发展,民营占比持续提升「图」

一、健康体检产业链概述 健康体检产业上游主要包括相关仪器设备和医用耗材&#xff0c;下游为个人客户或单位团体客户。医疗器械的市场分散程度较高&#xff0c;如果体检中心对医疗器械的采购量大&#xff0c;对上游的议价能力就强&#xff1b;体检中心对下游的团体客户议价能…

总结了11句话,送给通信新员工

1、入职第一件事——改变形象。刚毕业的大学生进入工作单位之后&#xff0c;需要尽快完成身份的转换——从一名学生&#xff0c;变身为一个职业人。这个转换的第一步&#xff0c;就是改变形象外表。大学里过于随意的穿搭&#xff0c;请一定不要带进单位&#xff0c;尤其是入职的…

体验管理 | 以 [ 新员工入职场景 ] 为例,教你如何设计员工体验?

Guofu 第 76⭐️ 篇原创干货分享&#xff08;全文 7 千字&#xff0c;建议先收藏&#xff0c;再阅读~&#xff09;目录1、员工体验设计框架2、聆听/诊断&#xff08;定性定量&#xff09;3、建立员工细分画像4、员工入职体验旅程地图5、优先解决员工体验旅程中的关键痛点6、员工…

江工网:公务员辞职后几年禁考

单位如果同意辞职&#xff0c;可以报考&#xff1b;如果单位并不同意辞职&#xff0c;自动离职五年以内不得报考&#xff1b;按照国家人力资源和保障部规定&#xff0c;试用期内辞职的公务员3年内不得报考公职。 服务年限不满2年(含试用期)的公务员和参照公务员法管理机关(单位…

程序员合同日期不到想辞职_在职场,辞职有时是难免的,要怎样写辞职信才好呢...

天下没有不散的宴席&#xff0c;职场也一样。由于种种原因&#xff0c;很多人都不可能在一个单位干到老&#xff0c;总有可能换几个单位。这就难免涉及到写辞职信的问题了。一方面&#xff0c;这是法律程序&#xff0c;必须要走&#xff1b;另一方面&#xff0c;这是对原单位的…

试用期三个月,快转正的时候,领导说,“你的表现没有达到预期”

文|洪生鹏职场上&#xff0c;一般试用期是三个月&#xff0c;有的单位条件相对好些&#xff0c;试用期时间就稍微短些&#xff0c;1-2两个月&#xff0c;有的更少&#xff0c;1-2周。试用期其实是用人单位和员工的磨合时期&#xff0c;避免在面试时双方看人有误&#xff0c;用人…

为什么“离职要提前三十天通知”?看完就全明白了!

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]点击领取全栈资料&#xff1a;全栈资料“这年头&#xff0c;没有跳槽的打算&#xff0c;都不敢跟人打招呼。”年轻人之间时常这样打招呼。其实这里说的“说走就走”只是在指那些有跳槽意向的员工&#xff0c;他们相较于前几…

【Ajax】模板引擎

一、模板引擎的基本概念渲染UI结构时遇到的问题var rows [] //遍历空数组 $.each(res.data, function (i, item) { // 循环拼接字符串rows.push(<li class"list-group-item"> item.content <span class"badge cmt-date">评论时间&#xff1a;…

节点流与处理流的使用

节点流与处理流的使用 •什么是节点流 节点流&#xff1a;从一个特定的数据源&#xff08;节点&#xff09;读写数据&#xff08;如&#xff1a;文件、内存&#xff09;的类叫做节点流类 这些节点类跟数据源或数据目的地做直接连接用的 在java.io包中&#xff0c;字节…

IntelliJ IDEA使用maven自定义和JBLJavaToWeb插件创建JavaWeb工程

注意&#xff1a;1.maven工具与idea结合的时候有可能会出现问题&#xff0c;但是非常建议最后的推荐方式&#xff08;使用插件的形式&#xff09;&#xff0c;一般不会有问题&#xff0c;注意在第一次创建maven项目的时候一定要联网。 2.maven负责管理项目构建&#xff0c;主要…

java文件夹压缩和解压

啥都不想说&#xff0c;直接上代码&#xff01;工具是eclipse测试。亲测&#xff01; 下面是dome地址&#xff1a;http://download.csdn.net/detail/bobo8945510/9608459点击打开链接 友情链接 java压缩图片&#xff1a;http://blog.jdk5.com/zh/java-resize-and-compress-ima…

linux读取文件夹所有文件,Linux C 读取文件夹下所有文件(包括子文件夹)的文件名【转】...

Linux C 下面读取文件夹要用到结构体struct dirent&#xff0c;在头#include 中&#xff0c;如下&#xff1a;#include struct dirent{long d_ino; /* inode number 索引节点号 */off_t d_off; /* offset to this dirent 在目录文件中的偏移 */unsigned short d_reclen; /* le…

java判断是否为文件夹_java怎么判断是否文件夹

java判断是否是文件夹&#xff1a;在桌面建立了一个名为one的文件&#xff0c;路径为&#xff1a;/Users/XXXXXX/Desktop/onejava代码如下&#xff1a;import java.io.File;public class Flie_or_Folder {public static void main(String s[]){String path "/Users/XXXXX/…

如何使用LEFT JOIN实现多表查询

LEFT JOIN: 即使右表中没有匹配&#xff0c;也从左表返回所有的行 先举个案例来说明,如下&#xff01; 组织表(t_organization) 部门表(t_department) 用户表(t_user) 组织下面有部门&#xff0c;部门下面有用户&#xff0c;组织和部门通过organization_id字段关联&#x…

美国B2签证申请要准备哪些材料?

美国B2签证是颁发给赴美休闲/娱乐的申请人&#xff0c;包括旅游观光、探亲访友、医疗以及其他联谊、社交或服务性质的活动。申请美国B2签证要先完成非移民签证电子申请表(DS-160)的填写&#xff0c;然后缴费并预约面签时间&#xff0c;最后获得签证。 美国B2签证申请要准备以下…

美国会议签证——我是正当理由去美国,我能支付(或有人为我支付)我在美国期间的所有费用,办完事我肯定回来, 邀请信,行程表这些材料齐全即可...

急!有去美国参加会议签证经验的请进啊~~~~ hiki 来自签证版问题5月从英国想去参加个会议,因为以前被拒过,这次特紧张 签过的xdjm能分享下经验嘛?除了网站上要的材料,还需要别的嘛?谢谢大家了7sweetsong准备好使馆要求的材料&#xff0c;还有你认为所有能证明你和现在居住国有…

Linux常用命令——tmux命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tmux Tmux是一个优秀的终端复用软件&#xff0c;类似GNU Screen&#xff0c;但来自于OpenBSD&#xff0c;采用BSD授权。 补充说明 使用它最直观的好处就是&#xff0c;通过一个终端登录远程主机并运行tmux后&a…

中国各阶级收入统计表,看看你在哪个阶级

我经常讲&#xff0c;大家别焦虑&#xff0c;网上那些口口声声随随便便就能年入百万的&#xff0c;听听就行。都是普通人&#xff0c;除非时机和运气特别好&#xff0c;再怎么努力&#xff0c;其实也就那样了&#xff0c;过好当下的日子就好。看看你在哪个阶级&#xff1f;程序…

中国互联网用户各阶级的分析

谁是我们的目标人群&#xff1f;谁是我们的竞争对手&#xff1f;这个问题是做产品设计的核心问题之一。很多产品成效不好收益不高&#xff0c;未必是其技术上的问题&#xff0c;而更大的更能性是没有选对产品所针对的人群&#xff0c;更没能根据他们的特点投其所好。用户是产品…

微信公众号-写作主题

一、人生理想 个人追求&#xff0c;宏大愿景。 1. 价值观 2. 人生理想 3.《人生发展之歌》&#xff0c;十年磨一剑&#xff0c;写一本叼叼的书二、理论体系和方法论 1.解决问题的方法论 2.思考和表达 3.学习方法三、一技之长 最基本的生存能力&#xff0c;温饱和小康最基本的…