C题:

一期思路:我们发现如果x,y满足条件,那么{x,-y} {-x,y} {-x,-y}也满足条件。那么我们可以只讨论|x| |y|是否满足条件,如果满足条件,那么对ans的贡献是|x|出现次数*|y|出现次数。

于是引申出用二分查找满足条件的值的最靠后的位置,用map保存出现的次数,因为你会发现元素的范围在-10亿到10亿,不能开线性数组来保存出现次数。

查找到最靠后的位置之后,

for(j=i+1;j<=ans_pos;++j)  ans = ans + cnt[base]*cnt[ v[j] ];
但是这样的坏处是

(1)使用了map,map需要查找时间

(2)每个都要遍历一遍,复杂度到了O(n^2)。

(3)容易忽略绝对值相等的情况

  因为一个-x和一个x是能满足条件的,而这个公式很显式的把这种情况排除了,思路就被带偏了。

 综上,即使我解决了(3),if(cnt[base]==2) ++ans;

  还是会因为复杂度到了O(n^2)而超时,那么这时候题解的思路就很好了,压入的是所有的绝对值,这样不仅节约时间,还保证了能考虑到绝对值相等也能满足题意的情况。

思路正确但是TLE的代码:

#include <bits/stdc++.h>
#define pt printf
#define sc scanf
#define maxn 200005
#define ull unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
int N;
int a[maxn];
vector<int> v;
map<int,int> cnt;
int can(int where,int base)
{
int val = v[where] ;
if(val%==)
{
if(base>=val/) return ;
return ;
}
else
{
if(base> val/) return ;
return ;
}
}
int main()
{
sc("%d",&N);
int i,j,x;
for(i=;i<N;++i) sc("%d",&a[i]);
for(i=;i<N;++i)
{
x = abs(a[i]);
if(cnt.find(x)==cnt.end())
{
cnt[x]=;
v.push_back(x);
}
else ++cnt[x];
}
sort(v.begin(), v.end()); int len = v.size();
// for(i=0;i<len;++i) pt("cnt[v[i]]=%d ",cnt[v[i]]);
// pt("\n");
ull ans = ;
//假设大的数是b,小的数是a
//如果b是偶数,如果a大于等于b的一半那就可以
//如果b是奇数,如果a大于b的一半那就可以
for(i=;i<len;++i)
{
// pt("i=%d\n",i);
int base = v[i];
int l = i+, r = len - , ans_pos = i ;
//pt("base=%d ,l=%d ,r=%d ,ans_pos=%d \n",base,l,r,ans_pos);
while(l<=r)
{
int mid = (l+r)>>;
int status = can(mid,base);
if(status==)
{
ans_pos = mid;
l = mid + ;
}
else
{
r = mid - ;
}
}
for(j=i+;j<=ans_pos;++j)
{
ans = ans + cnt[base]*cnt[ v[j] ];
}
if(cnt[base]==) ++ans;
}
pt("%llu\n",ans);
return ;
}

AC的代码:满足条件的函数我分了奇偶讨论,但是只要   小的数*2>=大的数   就可以了。

#include <bits/stdc++.h>
#define pt printf
#define sc scanf
#define maxn 200005
#define ull unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
int N;
int a[maxn];
vector<int> v;
int can(int where,int base)
{
int val = v[where] ;
if(val%==)
{
if(base>=val/) return ;
return ;
}
else
{
if(base> val/) return ;
return ;
}
}
int main()
{
sc("%d",&N);
int i,j,x;
for(i=;i<N;++i) sc("%d",&a[i]);
for(i=;i<N;++i)
{
x = abs(a[i]);
v.push_back(x);
}
sort(v.begin(), v.end());
int len = N;
// for(i=0;i<len;++i) pt("cnt[v[i]]=%d ",cnt[v[i]]);
// pt("\n");
ull ans = ;
//假设大的数是b,小的数是a
//如果b是偶数,如果a大于等于b的一半那就可以
//如果b是奇数,如果a大于b的一半那就可以
for(i=;i<len;++i)
{
// pt("i=%d\n",i);
int base = v[i];
int l = i+, r = len - , ans_pos = i ;
//pt("base=%d ,l=%d ,r=%d ,ans_pos=%d \n",base,l,r,ans_pos);
while(l<=r)
{
int mid = (l+r)>>;
int status = can(mid,base);
if(status==)
{
ans_pos = mid;
l = mid + ;
}
else
{
r = mid - ;
}
}
ans += (ans_pos-i);
}
pt("%llu\n",ans);
return ;
}

CF561做题的更多相关文章

  1. UOJ 做题记录

    UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...

  2. C语言程序设计做题笔记之C语言基础知识(下)

    C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...

  3. C语言程序设计做题笔记之C语言基础知识(上)

    C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...

  4. 屏蔽Codeforces做题时的Problem tags提示

    当在Codeforces上做题的时,有时会无意撇到右侧的Problem tags边栏,但是原本并不希望能够看到它. 能否把它屏蔽了呢?答案是显然的,我们只需要加一段很短的CSS即可. span.tag ...

  5. ACM 做题过程中的一些小技巧。

    ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...

  6. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  7. CodeM美团点评编程大赛复赛 做题感悟&题解

    [T1] [简要题意]   长度为N的括号序列,随机确定括号的方向:对于一个已确定的序列,每次消除相邻的左右括号(右左不行),消除后可以进一步合并和消除直到不能消为止.求剩下的括号的期望.\(N \l ...

  8. (luogu1704)寻找最优美做题曲线 [TPLY]

    寻找最优美做题曲线 题目链接:https://www.luogu.org/problemnew/show/P1704 题目大意: 求包含指定点的最长不降子序列(严格递增) 题解 首先我们发现 一个序列 ...

  9. project euler做题记录

    ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...

随机推荐

  1. 洛谷 P1168 中位数(优先队列)

    题目链接 https://www.luogu.org/problemnew/show/P1168 解题思路 这个题就是求中位数,但是暴力会tle,所以我们用一种O(nlogn)的算法来实现. 这里用到 ...

  2. python学习三十四天函数高阶函数定义及用法

    python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...

  3. Redis设计与实现 -- 动态字符串对象(SDS)

    1. 动态字符串( simple dynamic string, SDS) 在 Redis 中,当需要可以被重复修改的字符串时,会使用 SDS 类型 ,而不是 C 语言中默认的 C 字符串类型 .举个 ...

  4. day64--pymysql模块的使用、视图、触发器、函数、存储过程、事务

    一.pymysql的下载和使用 (一)pymysql模块的下载:pip3 install pymysql # 实现:使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中) im ...

  5. 【问题解决方案】GitHub仓库重构之将某个或某些文件夹移动到其他文件夹内

    仓库重构时遇到的问题,在GitHub页面里好像没有类似的操作按钮? 搜了一下好像要用到一些命令比如rm等,但是我对Linux类的命令不是很熟悉 于是想试试曲线救国,先把远程库的文件pull到本地,在本 ...

  6. 工作流引擎 springmvc SSM 流程审批 Java Activiti 后台框架源码

    工作流模块  1.模型管理    :web在线流程设计器.预览流程xml.导出xml.部署流程 2.流程管理    :导入导出流程资源文件.查看流程图.根据流程实例反射出流程模型.激活挂起 3.运行中 ...

  7. 20180223-logging模块

    Python的logging模块提供了标准的日志接口,可以通过它存储各种格式的日志,logging的日志可以依次分为debug().info().warning().error().cirtical( ...

  8. 246-基于TI DSP TMS320C6678、Altera FPGA的CPCI处理卡

    基于TI DSP TMS320C6678.Altera FPGA的CPCI处理卡 1.板卡概述  本板卡由我公司自主研发,基于CPCI架构,符合CPCI2.0标准,采用两片TI DSP TMS320C ...

  9. Tomcat-部署多个项目(不同端口)

    20190713  整理 参考文档 https://blog.csdn.net/chenchunlin526/article/details/78799772 如何在Tomcat服务中,为不同端口部署 ...

  10. 【抓包工具之Fiddler】增加IP列;session高亮

    Fiddler 在处理每个session时,脚本文件CustomRules.js中的方法都会运行,该脚本使得你可以隐藏,标识或任意修改负责的session.规则脚本在运行状态下就可以修改并重新编译,不 ...