Acwing 120. 防线
题目简译:给定\(n\)个等差数列,每个等差数列的起点为\(s\),终点为\(e\),差为\(d\)。整个序列中至多有一个位置所占数字是奇数。判断奇数位是否存在,如果不存在输出"There's no weakness.",如果存在输出位置与大小。
温馨提示:\(⌊x⌋\)为将\(x\)向下取整

算法:前缀和 + 二分位置
1、奇数位存在性
整个序列中至多有一个位置的数字所占数量是奇数,所以如果存在奇数位,则整个数列的总和必然是奇数(奇数 + 偶数 = 奇数,偶数 + 偶数 = 偶数)。反之,若不存在奇数位,则一定是偶数。故只需判断数字数量的总和的奇偶性即可。
2、二分位置
若存在这个奇偶性,我们可以通过二分答案的位置来找到这个位置,然后判断区间\([l,mid]\)的总和的奇偶性。若为奇数,则奇数位存在于此区间。反之若为偶数,则一定存在于\([mid+1,r]\)区间。用这个方法逐步缩小范围即可。
关于查找\([l,mid]\)的总和,我们可以用前缀和的思路,用\(sum[n] - sum[mid-1]\)即可求出。(\(sum[i]\)为求出\(i\)位置之前所有位置的和)
3、\(O(n)\)时间求出区间\(sum[x]\)的数字个数
设整个数列的最小位置为\(minn\)
这里,我们枚举每一个等差数列(它的起点为\(s\),终点为\(e\),差为\(d\))。若\(s <= x\),则两区间存在交集。
则它与\([minn,x]\)的共同区间为\([s,min(e,x)]\)。那么此区间包含此数列的个数是\((⌊(min(e,x) - s) / d⌋ + 1\)。
正确性证明十分容易:
在此区间中存在一段区间,共\(⌊s,min(e,x) / d⌋ * d\)个位置,头尾的位置上都有数字,差为\(d\),则数字的数量就是\((⌊(min(e,x) - s) / d⌋ + 1\)。
时间复杂度:\(O(nlogn)\)
二分的时间为\(O(logn)\),每次\(check()\)的时间为\(O(n)\),故总的时间复杂度为\(O(nlogn)\)。
C++ 代码
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int N = 200000 + 1, INF = 1e9;
int t,n;
struct node{
int s,e,d;
}a[N];
int getSum(int x){ // O(n) 求[1,x]的前缀和
int res = 0;
for(int i = 1; i <= n; i++)
if(a[i].s <= x)
res += (min(a[i].e, x) - a[i].s)/a[i].d + 1;
return res;
}
bool check(int l,int r){ // O(n) 查找[l,r]是否存在奇数位
return (getSum(r) - getSum(l - 1)) & 1;
}
int main(){
cin >> t;
while(t--){
cin >> n;
int maxn = -INF, minn = INF;
for(int i = 1; i <= n; i++){
cin >> a[i].s >> a[i].e >> a[i].d;
minn = min(minn,a[i].s);
maxn = max(maxn,a[i].e);
}
if(!(getSum(maxn) & 1)){
cout << "There's no weakness." << endl;
}else{
int l = minn, r = maxn;
while(l <= r){
int mid = (l + r) >> 1;
if(check(l,mid))r = mid - 1;
else l = mid + 1;
}
cout << l << " " << (getSum(l) - getSum(l - 1)) << endl;
}
}
return 0;
}
Acwing 120. 防线的更多相关文章
- 【转】花开正当时,十四款120/128GB SSD横向评测
原文地址:http://www.expreview.com/19604-all.html SSD横评是最具消费指导意义的评测文章,也是各类热门SSD固态硬盘的决斗疆场.SSD评测在行业内已经有不少网站 ...
- 【AcWing】周赛
A.糖果 题目链接 链接 题目描述 给定三个正整数 a,b,c. 请计算 ⌊a+b+c2⌋,即 a,b,c 相加的和除以 2 再下取整的结果. 输入格式 第一行包含整数 T,表示共有 T 组测试数据. ...
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- 防线修建 bzoj 2300
防线修建(1s 512MB)defense [问题描述] 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还 ...
- Linux 日志报错 xxx blocked for more than 120 seconds
监控作业发现一台服务器(Red Hat Enterprise Linux Server release 5.7)从凌晨1:32开始,有一小段时间无法响应,数据库也连接不上,后面又正常了.早上检查了监听 ...
- C语言执行时报错“表达式必须是可修改的左值,无法从“const char [3]”转换为“char [120]” ”,原因:字符串不能直接赋值
解决该问题的方法:使用strcpy函数进行字符串拷贝 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string ...
- INFO: task java:27465 blocked for more than 120 seconds不一定是cache太大的问题
这几天,老有几个环境在中午收盘后者下午收盘后那一会儿,系统打不开,然后过了一会儿,进程就消失不见了,查看了下/var/log/message,有如下信息: Dec 12 11:35:38 iZ23nn ...
- JAVA经典算法40题(1-20)
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律 ...
- task mysqld:26208 blocked for more than 120 seconds
早上10点左右,某台线上ECS服务器突然没响应. 查看日志,发现如下信息: Aug 14 03:26:01 localhost rsyslogd: [origin software="rsy ...
随机推荐
- PDF技术 -Java实现Html转PDF文件
转载:https://blog.csdn.net/qq_34190023/article/details/82999702 html转换为pdf的关键技术是如何处理网页中复杂的css样式.以及中文乱码 ...
- [LeetCode题解]24. 两两交换链表中的节点 | 递归
方法一:递归 解题思路 递归法,假设后续链表已经完成交换,此时只需要对前两个节点进行交换,然后再连接上后续已交换的链表即可. 代码 /** * Definition for singly-linked ...
- robot 如何定义用户关键字、变量
1.用户关键字,使用robot语法定义的关键字 2.系统关键字 自带的 3.资源文件,自己定义的关键字 4.变量 自己定义的关键字,需单独建一个资源文件 自己写的关键字,需写在***Keywords ...
- window安装elasticsearch和kibana
本次测试安装5.1.1版本 es下载地址:https://www.elastic.co/downloads/past-releases/elasticsearch-5-1-1 选择zip kibana ...
- Contest 985
A 均移到黑色或白色即可. 时间复杂度 \(O\left(n\log n\right)\). B 枚举每种开关判断是否有灯只能靠该种开关控制. 时间复杂度 \(O\left(nm\right)\). ...
- 为什么90%的大学都要求计算机专业学习C语言?
编程语言是编程的工具,计算机相关专业的学生必须具备足够的编程能力.当然,关于"最好语言"的争论从来没有休止过,这里要强调一下:语言的选择真的没那么重要,学习语言的过程最重要是语言的 ...
- nameServer路由发现
RocketMQ路由发现是非实时的,当Topic路由出现变化时,NameServer不主动推动给客户端,而是客户端定时拉取主题最新的路由 总结: topic路由的是brokername
- 【mq读书笔记】定时消息
mq不支持任意的时间京都,如果要支持,不可避免的需要在Broker层做消息排序,加上持久化方面的考量,将不可避免地带来巨大的性能消耗,所以rocketMQ只支持特定级别的延迟消息. 在Broker短通 ...
- SpringBoot中JPA的学习
SpringBoot中JPA的学习 准备环境和项目配置 写一下学习JPA的过程,主要是结合之前SpringBoot + Vue的项目和网上的博客学习一下. 首先,需要配置一下maven文件,有这么两个 ...
- odoo13之右上角弹出提示框
前言 在odoo中已经提供好了右上角弹出提示框的接口,我们只需要调用即可: 而提示框的实现又分为前端js实现和后段函数实现,前后端实现的效果相同. 实现效果图 前端实现提示框 在前端中显示提示框最常用 ...