C. A Tale of Two Lands

题意:

  给出 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;

  左移,右移只可以用到正整数上;

  负数禁用位移运算;


D. Cute Sequences

题意:

  定义“Cute Sequences”,如果序列x满足 ∀i∈[2 , n] xi=xi1+xi2+⋯+x1+ri (1 ≤ r≤ 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)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. Codeforces Round 561(Div 2)题解

    这是一场失败的比赛. 前三题应该是随便搞的. D有点想法,一直死磕D,一直WA.(赛后发现少减了个1……) 看E那么多人过了,猜了个结论交了真过了. 感觉这次升的不光彩……还是等GR3掉了洗掉这次把, ...

  5. Codeforces Round #561 (Div. 2) E. The LCMs Must be Large(数学)

    传送门 题意: 有 n 个商店,第 i 个商店出售正整数 ai: Dora 买了 m 天的东西,第 i 天去了 si 个不同的个商店购买了 si 个数: Dora 的对手 Swiper 在第 i 天去 ...

  6. Codeforces Round #561 (Div. 2) A. Silent Classroom(贪心)

    A. Silent Classroom time limit per test1 second memory limit per test256 megabytes inputstandard inp ...

  7. 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 ...

  8. 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 ...

  9. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

随机推荐

  1. Contentprovider 注册 启动简单流程

    安装app时packagemanager 读取manixfest获取provider信息 存在数据库里流程:1.加载ActivityThread main方法,创建消息队列.ActivityThrea ...

  2. JavaScript--关于实例对象带不带参数和构造函数带不带参数的关系

    就是一句话: 构造函数创建对象时,也可以带参数,因为可以对对象进行一些属性的初始化,也就是你创建对象时,就带着这些属性,当然你也可以不带参数,后面实例化对象后再进行添加.而且,js函数的参数在定义函数 ...

  3. MySQL安装后设置root 密码

    Mysql安装完成后初始化root 密码为空,直接回车 使用命令行: mysqladmin -u root password "123456" 来设置root密码.这里我设置的密码 ...

  4. 基于TCP编程的socket

    什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域 ...

  5. CC-Debugger 最小调试接法

    CC-Debugger 最小调试接法 以 CC2541 为例,最少需要四根 DD DC RST GND. 一般 VCC 目标调试板都有,所以这里你需要将 CC-Debugger 的 PIN 2 和 P ...

  6. python 模块的作用

  7. Leetcode744.Find Smallest Letter Greater Than Target寻找比目标字母大的最小字母

    给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 数组里字母的顺序是循环的.举个例子,如果目标字母target = 'z' 并且有 ...

  8. 安装vagrant&virtualBox

    https://blog.csdn.net/dream_188810/article/details/78218073 VirtualBox是一款开源免费的虚拟机软件(之前一直使用vm,vm功能较多, ...

  9. 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] ...

  10. 2019-6-11-WPF-如何在应用程序调试启动

    title author date CreateTime categories WPF 如何在应用程序调试启动 lindexi 2019-06-11 09:32:35 +0800 2018-2-13 ...