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 ...
随机推荐
- SSM+Maven+IDEA增删改查
开发工具 IntelliJ IDEA Apache-tomcat-9.0 JDK 1.8 MySQL 8.0.11 Maven 3.5.4 IDEA+Maven搭建项目骨架 1. 新建Maven项目: ...
- python Python程序的架构
- 【水滴石穿】react-native-template-app
这个也是一个基础项目 地址如下https://github.com/ndlonghi/react-native-template-app 点击登陆跳转到首页 分析代码如 react-native-te ...
- PLAY2.6-SCALA(二) Actions, Controllers ,Results,routes
一.Action(play.api.mvc.Action) 大多数的应用的请求都是由action进行处理,并生成一个结果给客户端,Action有多种创建方式: 1. Action {Ok(" ...
- 集合--Set&&HashSet和TreeSet
特点:元素无序,不可重复 1.添加元素 set.add("tanlei"); set.addAll(Arrays.asList(44,"磊","磊&q ...
- linux包之包管理rpm-yum
背景 YUM(Yellow dog Updater, Modified)为多个Linux发行版的前端软件包管理器,例如 Redhat RHEL, CentOS & Fedora. YUM通过调 ...
- windows下多版本python安装与pip安装和pip使用 吐血总结
https://blog.csdn.net/silence2015/article/details/56483892/ 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附 ...
- Go语言开发教程
Go语言简述 兴起:2009年Gogle发布的第二款开源编程语言 特征: 语法简单:语法标准比较严格,适合开发人员短时间高效的服务端开发. 并发模型:Goroutine是Go最显著的特征,使用类协程的 ...
- working copy is not up-to-date
解决方法: 在相应文件上,单击选择team,然后选择先更新,然后再提交.这样就好了.
- 《C程序设计语言》笔记(一)
一:导言 1:printf中的格式化字符串: %ld 按照long整型打印 %6d 按照十进制整数打印,至少6个字符宽,不够的 ...