Codeforces Round #561 (Div. 2)
题意:
给出 n 个数,问有多少点对(x,y)满足 |x-y| ≤ |x|,|y| ≤ |x+y|;
(x,y) 和 (y,x) 表示一种答案;
题解:
数形结合;
对于某数 x 查找满足条件 y 有多少个;
①x ≥ 0
y ∈ [x/2 , 2x] ∪ [ -2x , -x/2];
②x < 0
y ∈ [2x , -x/2] ∪ [-x/2 , -2x];
特别注意临界值 x/2 处;
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+; int n;
int x[maxn]; int F(int a,int b)///查找数组x中有多少数位于[a,b]之间
{
if(a > b)
swap(a,b);
int t1=lower_bound(x+,x+n+,a)-x;
int t2=upper_bound(x+,x+n+,b)-x;
return t2-t1;
}
ll Solve()
{
sort(x+,x+n+); ll ans=;
for(int i=;i <= n;++i)
{
int a,b;
if(x[i] >= )
a=(x[i]+)/;
else
a=(x[i]-)/;///不能写成(x[i]-1)>>1;
b=x[i]*;///不能写成b=x[i]<<1;
ans += F(a,b);
ans += F(-a,-b);
ans--;///减掉x[i]本身
}
return ans>>;///重复计算,除以2
}
int main()
{
scanf("%d",&n);
for(int i=;i <= n;++i)
scanf("%d",x+i);
printf("%lld\n",Solve()); return ;
}
坑:
负数使用右移符号出错;
-2×2 ≠ -2<<1;
左移,右移只可以用到正整数上;
负数禁用位移运算;
题意:
定义“Cute Sequences”,如果序列x满足 ∀i∈[2 , n] xi=xi−1+xi−2+⋯+x1+ri (1 ≤ ri ≤ m),那么次序列为"Cute Sequences";
现给出你 a,b,m ,让你构造一个序列,满足:
①x[1] = a , x[n] = b;
②n ≤ 50;
③此序列为"Cute Sequences";
题解:
定义数组val[]存储最终的值;
看下面这段代码:
ll sum=a;
ll k=;
val[++k]=a;
while(k <= )
{
if(val[k] >= b)
break; val[++k]=sum+m;
sum += val[k];
}
因为题目要求 k ≤ 50,所以,要先让其每次加最大的值 m ,找到使得 val[k] ≥ b 的最小的 k ;
那么多的部分 val[k]-b 该怎么办呢?

刚开始,每个数都会增加 m ,如果第 i 个数少加 x,有什么变化呢?
先通过上述小范围的数据看一下规律;
你会发现,如果第 i 个数少加 x,那么,对于第 j (j > i) 个数,就会少加2j-i-1x;
这样的话,就可以通过前面的数少加 x 使得第 k 个数 val[k] 变为 b;
不过在此之前你得确定 val[k] 可以减少为 b;
bool isSat(int k)
{
memcpy(tmp+,val+,k*sizeof(ll));
for(int i=;i <= k;++i)
{
ll x=m-;
tmp[i] -= x;
for(int j=i+;j <= k;++j)///i之后的数依次减少2^(j-i-1)*x,累加x即可
tmp[j] -= x,x += x;
if(tmp[k] <= b)
return true;
}
return tmp[k] <= b ? true:false;
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=2e5+; int q;
ll a,b,m;
ll val[];
ll tmp[]; bool isSat(int k)
{
if(k == )
return true; memcpy(tmp+,val+,k*sizeof(ll));
for(int i=;i <= k;++i)
{
ll x=m-;
tmp[i] -= x;
for(int j=i+;j <= k;++j)
tmp[j] -= x,x += x;
if(tmp[k] <= b)
return true;
}
return false;
}
void Solve()
{
ll sum=a;
ll k=;
val[++k]=a;
while(k <= )
{
if(val[k] >= b)
break; val[++k]=sum+m;
sum += val[k];
} if(k > || !isSat(k))
{
printf("-1\n");
return ;
} printf("%lld %lld",k,a);
for(int i=;i < k;++i)
{
ll d=val[k]-b;
ll x=min(m-,d/(1ll*<<(k-i-))); val[i] -= x;
for(int j=i+;j <= k;++j)
val[j] -= x,x += x; printf(" %lld",val[i]);
}
if(k > )
printf(" %lld\n",b);
else
printf("\n");
}
int main()
{
// freopen("C:/Users/14685/Desktop/stdin&&stdout/contest","r",stdin);
scanf("%d",&q);
while(q--)
{
scanf("%lld%lld%lld",&a,&b,&m);
Solve();
}
return ;
}
bug:
61~64最后输出语句,晚上重新敲的时候将其放到了for()里:
printf("%d %lld",k,a);
for(int i=;i <= k;++i)
{
if(i == k)
{
printf(" %lld\n",b);
return ;
}
ll d=val[k]-b;
ll x=min(m-,d/(1ll*<<(k-i-)));
val[i] -= x;
for(int j=i+;j <= k;++j)
val[j] -= x,x += x;
printf(" %lld",val[i]);
}
一直是“Wrong answer on test 10”,debug了好一会,才发现,当 k = 1是,最后是有换行的;
但是,放到for()里就缺少一个换行;
Codeforces Round #561 (Div. 2)的更多相关文章
- Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
链接:https://codeforces.com/contest/1166/problem/C 题意: The legend of the foundation of Vectorland talk ...
- Codeforces Round #561 (Div. 2) B. All the Vowels Please
链接:https://codeforces.com/contest/1166/problem/B 题意: Tom loves vowels, and he likes long words with ...
- Codeforces Round #561 (Div. 2) A. Silent Classroom
链接:https://codeforces.com/contest/1166/problem/A 题意: There are nn students in the first grade of Nlo ...
- Codeforces Round 561(Div 2)题解
这是一场失败的比赛. 前三题应该是随便搞的. D有点想法,一直死磕D,一直WA.(赛后发现少减了个1……) 看E那么多人过了,猜了个结论交了真过了. 感觉这次升的不光彩……还是等GR3掉了洗掉这次把, ...
- Codeforces Round #561 (Div. 2) E. The LCMs Must be Large(数学)
传送门 题意: 有 n 个商店,第 i 个商店出售正整数 ai: Dora 买了 m 天的东西,第 i 天去了 si 个不同的个商店购买了 si 个数: Dora 的对手 Swiper 在第 i 天去 ...
- Codeforces Round #561 (Div. 2) A. Silent Classroom(贪心)
A. Silent Classroom time limit per test1 second memory limit per test256 megabytes inputstandard inp ...
- Codeforces Round #561 (Div. 2) A Tale of Two Lands 【二分】
A Tale of Two Lands 题目链接(点击) The legend of the foundation of Vectorland talks of two integers xx and ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
随机推荐
- IO流理解方式小结
从业以来一直对IO不甚了解,每次看到都头疼不已,最近有时间小小的总结一下,下面以FileIO流为]; //文件输入流 FileInputStream in = new FileInputStream( ...
- Mac查看Python安装路径和版本
目录 #查看当前所有Python版本路径 appledeMBP:~ apple$ which python2.7 /usr/local/bin/python2.7 appledeMBP:~ apple ...
- Ajax之基础
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/liu_yujie2011com/article/details/29812777 几 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION) 学习目标 ...
- 如何利用 Webshell 诊断 EDAS Serverless 应用
本文主要介绍 Serverless 应用的网络环境以及 Serverless 应用容器内的环境,了解背景知识以及基本的运维知识后可以利用 Webshell 完成基本的运维需求. Webshell 简介 ...
- Linux进程管理(一、 基本概念和数据结构)
被问到两个问题, 后来想了下如果要讲明白还不太容易,需要对进程的概念,进程管理有清晰的认识: 1. 父进程打开了一个文件,然后通过fork创建一个子进程, 子进程是否共享父进程的文件描述符? 2. 在 ...
- jupyter的简单操作
jupyter简单使用 esc+ m 切换到标记模式 shift + enter 运行 a 向上新增代码块 b 向下新增代码块 dd 删除代码块 y python代码模式 file --- downl ...
- 轻松学习之 IMP指针的作用
http://www.cocoachina.com/ios/20150717/12623.html 可能大家一直看到有许多朋友在Runtime相关文章中介绍IMP指针的概念,那么IMP究竟有什么实际作 ...
- 2019-7-1-VisualStudio-快速设置启动项目
title author date CreateTime categories VisualStudio 快速设置启动项目 lindexi 2019-07-01 14:37:38 +0800 2019 ...
- oracle函数 LPAD(c1,n[,c2])
[功能]在字符串c1的左边用字符串c2填充,直到长度为n时为止 [参数]C1 字符串 n 追加后字符总长度 c2 追加字符串,默认为空格 [返回]字符型 [说明]如果c1长度大于n,则返回c1左边n个 ...