1001题目链接

题意:给定数x,求包含x的区间和为素数的最小区间长度
分析:
显然 r > 0,r ≥ l,如果 l ≤ 0,此时 [l,r] 区间和 = [−l + 1,r] 的区间和,且 r ≥ −l + 1 > 0。
故对于任意一个区间,都可以找到一个对应的 r ≥ l > 0 的区间与之对应,区间和相同。对于下式:∑i=lri=(l+r)(r−l+1)2\sum_{i=l}^ri=\frac{(l+r)(r-l+1)}{2}∑i=lr​i=2(l+r)(r−l+1)​

当 l > 0 时,若 r − l ≥ 2,则l+r2\frac{l+r}{2}2l+r​和r−l+12\frac{r-l+1}{2}2r−l+1​之中必有一个是大于 1 的整数。区间和必然能被拆分成两个因数的乘积。所以这样的满足和为素数的区间长度必然不长于 2。

预处理出比 [2,2 × 10 7 ] 略大范围内的质数,埃氏筛或者线筛均可。

如果 x ≤ 0,则候选答案为:

如果 x > 0,则候选答案为:

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<string>
#include<queue>
#define maxn 20000010
using namespace std;
int prime[maxn];
int visit[maxn];
void Prime() {memset(visit, 0,sizeof(visit));memset(prime, 0,sizeof(prime));visit[0] = 1;visit[1] = 1;for (int i = 2; i <= maxn; i++) {if (!visit[i]) {prime[++prime[0]] = i;}for (int j = 1; j <= prime[0] && i * prime[j] <= maxn; j++) {visit[i * prime[j]] = 1;if (i % prime[j] == 0) {break;}}}
}
int main()
{int t;Prime();scanf("%d", &t);while (t--){int x;scanf("%d", &x);int minindex = maxn;if (x <= 0){int i;for (i = 1 - x; visit[i]; ++i);minindex = min(minindex, 2 * i);for (i = 2 - x; visit[2 * i - 1]; ++i);minindex = min(minindex, 2*i-1);printf("%d\n", minindex);}else{int i = 0;if (!visit[x])printf("1\n");else{if (!visit[2 * x + 1] || !visit[2 * x - 1])printf("2\n");else{for (i = x; visit[i]; ++i);minindex = min(minindex, 2*i);for (i = x; visit[2 * i - 1]; ++i);minindex = min(minindex, 2 * i - 1);printf("%d\n", minindex);}}}}return 0;
}

1005 题目链接

题目大意:

给定整数 1 , 2 , ⋯ , n 把这些数字分成m个不相交的集合,使第j个集合的中位数为bj。确定这是否可能。
注:这题中,偶数个数的集合的中位数取中间两个数中较小的那个。

题目分析:

题目分析:
显然 b1b_1b1​,b2b_2b2​,··· ,bmb_mbm​ 这 m 个数要放在 m 个不同的集合中,剩下的 n − m 个数字要放到这 m 个集合里且不影响每个集合的中位数。
使用一个例子以方便说明:假设 n = 6,m = 2,b1b_1b1​ = 3,b2b_2b2​ = 5,那么 1,2,··· ,n 这些数会被b分成 1,2、4、6 这三段,且任意两段中的任意一对数字可以配对消掉。
所以最后剩下的所有数字一定是同一段内的。
因此讨论两种情况:

  • 如果长度最大的段的数字个数不大于其它段的数字个数之和,那么最终要么全部消掉,要么剩下一个,且剩下的这个数可以在任何一段内。
    如果会剩下,不妨将最后一段的数字剩下一个,此时再把最后一段的数字放到中位数最小的集合中即可满足题意,所以答案为 YES。
  • 如果长度最大的段的数字个数大于其它段的数字个数之和,那么最终剩下的所有数字都在最大的这段内。
    设中位数小于这一段的最小值的集合的个数为 x,容易发现当且仅当 x 不小于这一段剩下的数字个数时有解。
    时间复杂度 O(n)O(n)O(n)。

AC代码:

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<algorithm>
#include<assert.h>
using namespace std;
typedef pair<int, int> Pair;
#define maxn 100005
int main()
{ios::sync_with_stdio(false);cin.tie(0);int t;cin >> t;while (t--){vector<Pair> size;int n, m, b[maxn];int flag[maxn] = { 0 };cin >> n >> m;for (int i = 1; i <=m; ++i)cin >> b[i],flag[b[i]] = 1;flag[n + 1] = 1;int len = 0, num = 0;for (int i = 1; i <=n+1; ++i){if (flag[i]){if (len)size.push_back(Pair(len, num));len = 0;num++;}elselen++;}int sum = 0;for (auto s : size)sum += s.first;if (size.empty())cout << "YES" << endl;else{sort(size.begin(), size.end());if (size.back().first <=sum - size.back().first+size.back().second)cout << "YES" << endl;elsecout << "NO" << endl;}}return 0;
}

1008题目链接

分析

考虑范围为 k 的狙击手,可以攻击的范围是一个正方体。那我们不妨重新陈述一下题面,称狙击手从 (x,y,z)(x,y,z)(x,y,z) 可以攻击的范围是所有满足 x≤x′≤x+2kx≤x′≤ x + 2kx≤x′≤x+2k,y≤y′≤y+2ky ≤ y ′ ≤ y + 2ky≤y′≤y+2k,z≤z′≤z+2kz ≤ z ′ ≤ z + 2kz≤z′≤z+2k的 (x′,y′,z′)(x ′ ,y ′ ,z ′ )(x′,y′,z′)。

那么我们就会发现:如果我们的狙击手的某一维度的坐标小于剩余点的那一维度的最小坐标,我们就应该把狙击手移动的那一维度的最小坐标,因为这样只会让我们能狙击的目标增
多。

在我们三个维度都是那一维度的最小坐标时,狙击手就必须将三个维度中某一维度最小坐标的所有敌军都消灭,才能继续移动。这时我们可以贪心的选取所需 k 最小的敌军消灭。
复杂度 O(nlogn)O(nlogn)O(nlogn)。

AC代码

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<assert.h>
#include<string>
#include<queue>
#include<algorithm>
#include<set>
using namespace std;
typedef pair<int, int> P;
#define maxn 500005
typedef long long ll;
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cin >> t;while (t--){int n;cin >> n;set<P>sets[3];vector<vector<int> >pos(3,vector<int>(n+1,0));for (int i = 0; i < n; ++i){cin >> pos[0][i] >> pos[1][i] >> pos[2][i];sets[0].insert(make_pair(pos[0][i], i));sets[1].insert(make_pair(pos[1][i], i));sets[2].insert(make_pair(pos[2][i], i));}int ans = 0;while (sets[0].size()){P x = *sets[0].begin(), y = *sets[1].begin(), z = *sets[2].begin();vector<P>k;for (int i = 0; i < 3; ++i){P cur =*sets[i].begin();k.push_back(make_pair(max(pos[0][cur.second] - x.first, max(pos[1][cur.second] - y.first, pos[2][cur.second] - z.first)), cur.second));}sort(k.begin(), k.end());ans = max(ans, k[0].first);for (int i = 0; i < 3; ++i)sets[i].erase(P(pos[i][k[0].second], k[0].second));}cout << ( ans + 1 ) / 2 << endl;}return 0;
}

2021杭电多校补题(6)相关推荐

  1. 2021杭电多校补题——第一场

    2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...

  2. 2021杭电多校补题(9)

    1. Integers Have Friends 2.0 传送门 题意: 给出一个长度为nnn 的数组,选出一个最长的子序列,存在一个 m≥2m \geq 2m≥2 使得 ak1%m=ak2%m=ak ...

  3. 2021杭电多校补题(3)

    1009题目链接 设 fijkf_{ijk}fijk​ 表示从 (1,1) 走到 (i,j),一路上收集了 k 个钻石时,钻石的单价最高能涨到多少,则 ans = max(k × f n,n,k ). ...

  4. 2021杭电多校补题(4)

    1008题目链接 题意:给定一张n*m的方格,起点在左上角,只能向下或向右走,地图中有k个地雷,人不能走到地雷上,问可能到达的点有多少. 我们考虑行的转移,在这一行上初始不可达点是输入中的点,对于这样 ...

  5. 2021杭电多校补题(1)

    1005 https://acm.hdu.edu.cn/showproblem.php?pid=6954) 思路:边权为lcm(a,b).因为lcm(a,b)=a*b/gcm(a,b),所以有两种情况 ...

  6. 2021杭电多校补题(5)

    传送门 1. Array 题意: 给出一个长度为 nnn 的数组,求其有多少个区间满足其众数个数大于区间长度的一半. 题解: 考虑分治. 对于一个区间(l,r)(l,r)(l,r),其中点为 midm ...

  7. 2021杭电多校补题(2)

    1. I love max and multiply 题意: 给出两个数组aaa和bbb ,定义ccc数组 ck=max(ai⋅bj)c_k =max(a_i \cdot b_j)ck​=max(ai ...

  8. 2021杭电多校第八场补题

    比赛传送门:Contest Problem List (hdu.edu.cn) 1006)GCD Game 题目翻译:爱丽丝和鲍勃正在玩游戏. 他们轮流操作.有n个数字,a1,a2,...,an.每次 ...

  9. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(10)签到题2题

    Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Pty loves sequence 25.00%(52/208) 1002 Pty with ...

最新文章

  1. 13-NSPersistentContainer性能比较
  2. 音视频技术在云会议场景的拓展和未来
  3. support v4官方下载_掌心长兴客户端下载-掌心长兴ap下载v4.1.4 安卓官方版
  4. 深入浅出redux知识
  5. 18.案例实战:体验lombok的核心@Data和@Slf4j注解
  6. Android 如何在Eclipse中查看Android API源码 及 support包源码
  7. pio代表什么_“PIO是什么的简称?PIO”是什么的 – 手机爱问
  8. 网页服务器目录属性,IIS 6.0 F1:网站属性 - 目录安全性选项卡
  9. 安装mathtype打开word报错 mathtype.Dll cannot be found 解决方式
  10. Netch游戏加速器自建(糖豆人Free就是研究的动力)
  11. 国内身份证号码的正则验证
  12. 简单屏幕录制截屏工具
  13. EduCoder Java程序设计---Java语言基础(十)- 方法的使用
  14. Python数据分析之用户留存
  15. sin60度 用计算机,cos60度等于多少啊
  16. Kafka原理+操作+实战
  17. 计算机从bios到操作系统,高手进!!计算机开机后在进入操作系统前BIOS在进行什么检测工作?...
  18. 【短道速滑六】古老的视频去噪算法(FLT_GradualNoise)解析并优化,可实现1920*1080 YUV数据400fps的处理能力。...
  19. LattePanda 之深入学习 Firmata通讯
  20. 文件夹中文件名称的获取,并相应的添加或删除对应的文件夹或文佳

热门文章

  1. time_t和SYSTEMTIME 与TDateTime的转换。
  2. mysql-yog_mysql和SQLYog工具使用
  3. easyconnect是什么软件
  4. hdu 2570 迷瘴
  5. 企业营运能力分析:流动资产周转率、存货周转率、应收账款周转率、固定资产周转率、总资产周转率...
  6. 柯西-施瓦茨不等式的四种形式
  7. 2023-06-03 陕西省技能大赛 crypto 复现
  8. python迭代举例_大神总结223个Python小例子,建议收藏
  9. 浙江省第十五届大学生程序设计竞赛 记录
  10. (小程序)后台交互-首页