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. redis setNx方法

    Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXists.这系列的命令非常有用,这里讲使用SETNX来实现分布式锁 ...

  2. python学习第十四天字典的del(),pop().popitem(),clear()删除方法

    字典的每个键值 key=>value 数据类型,字典的key是唯一的,Value可以一样 names={'玖乐公司网址':‘www.96net.com.cn’,"电池网":' ...

  3. tensorflow用dropout解决over fitting

    在机器学习中可能会存在过拟合的问题,表现为在训练集上表现很好,但在测试集中表现不如训练集中的那么好. 图中黑色曲线是正常模型,绿色曲线就是overfitting模型.尽管绿色曲线很精确的区分了所有的训 ...

  4. 形象生动的SpringBoot和SpringMVC的区别

    spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运行的代码 Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等 ...

  5. Java 时间类 Date 和 Calendar

    在项目中获取一个yyyy-MM-dd HH:mm:ss格式的时间字符串 package org.htsg.kits; import java.text.SimpleDateFormat; import ...

  6. This program cannot be run in DOS mode.

    问题:通过ftp上传的exe执行时提示“This program cannot be run in DOS mode.” 解决方法:检查ftp传输模式,设置成binary模式上传即可 参考:https ...

  7. 后缀自动机(SAM) 学习笔记

    最近学了SAM已经SAM的比较简单的应用,SAM确实不好理解呀,记录一下. 这里提一下后缀自动机比较重要的性质: 1,SAM的点数和边数都是O(n)级别的,但是空间开两倍. 2,SAM每个结点代表一个 ...

  8. Kotlin学习笔记(9)- 数据类

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...

  9. Wait and Click Element

    Wait and Click Element [Documentation] 等待元素出现并单击元素 [Arguments] ${locator} Wait Until Element Is Visi ...

  10. .net core webapi添加swagger

    依赖项——右键——管理NuGet程序包——浏览——输入以下内容 Install-Package Swashbuckle.AspNetCore -Pre 双击Properties——点击生成——勾选XM ...