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 ...
随机推荐
- Contentprovider 注册 启动简单流程
安装app时packagemanager 读取manixfest获取provider信息 存在数据库里流程:1.加载ActivityThread main方法,创建消息队列.ActivityThrea ...
- JavaScript--关于实例对象带不带参数和构造函数带不带参数的关系
就是一句话: 构造函数创建对象时,也可以带参数,因为可以对对象进行一些属性的初始化,也就是你创建对象时,就带着这些属性,当然你也可以不带参数,后面实例化对象后再进行添加.而且,js函数的参数在定义函数 ...
- MySQL安装后设置root 密码
Mysql安装完成后初始化root 密码为空,直接回车 使用命令行: mysqladmin -u root password "123456" 来设置root密码.这里我设置的密码 ...
- 基于TCP编程的socket
什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域 ...
- CC-Debugger 最小调试接法
CC-Debugger 最小调试接法 以 CC2541 为例,最少需要四根 DD DC RST GND. 一般 VCC 目标调试板都有,所以这里你需要将 CC-Debugger 的 PIN 2 和 P ...
- python 模块的作用
- Leetcode744.Find Smallest Letter Greater Than Target寻找比目标字母大的最小字母
给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 数组里字母的顺序是循环的.举个例子,如果目标字母target = 'z' 并且有 ...
- 安装vagrant&virtualBox
https://blog.csdn.net/dream_188810/article/details/78218073 VirtualBox是一款开源免费的虚拟机软件(之前一直使用vm,vm功能较多, ...
- MacOS利用Terminal访问远程Linux服务器
常用命令 默认22端口访问 ssh x.x.x.x 指定端口访问 ssh x.x.x.x -p port 指定用户访问(默认是MacOS当前用户) ssh user@x.x.x.x [-p port] ...
- 2019-6-11-WPF-如何在应用程序调试启动
title author date CreateTime categories WPF 如何在应用程序调试启动 lindexi 2019-06-11 09:32:35 +0800 2018-2-13 ...