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. Manacher(最长回文串)

    http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符 ...

  2. Codeforces 1156E Special Segments of Permutation(单调栈)

    可以用单调栈直接维护出ai所能覆盖到的最大的左右范围是什么,然后我们可以用这个范围暴力的去查询这个区间的是否有满足的点对,一个小坑点,要对左右区间的大小进行判断,只需要去枚举距离i最近的一段区间去枚举 ...

  3. 物流运输(最短路+dp)

    这道题是相当的火,但是在tyher的讲解下我一遍就AC了!!! Part 1 理解题目 从第一天到最后一天,总会有一些点莫名其妙地走不了,所以导致我们不能按照上一次的最短路一直运输得到最少费用,而需要 ...

  4. web调试代理工具Whistle

    由于最近在学习微信小程序开发,项目中用到了https代理请求,所以用到了基于Node实现的跨平台web调试代理工具Whistle,在此做一记录. 完成https代理请求总共需要5个步骤. 一.安装No ...

  5. opencv2——直方图5

    (一)图像直方图 图像的构成是有像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图).所谓直方图就是对图像的中的这些像素点的值进行统计,得到一个统一的整体的灰度概念.直方图的好处就在于可以 ...

  6. 任务21 :了解ASP.NET Core 依赖注入,看这篇就够了

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  7. ubuntu chm文档阅读器

    一,chm阅读器名称 KchmViewer 安装方法 sudo apt-get install kchmviewer 使用 kchmviewer #非root用户可以直接使用

  8. STM32中stm32f0xx_flash.icf文件的作用详解!(不错的!)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/weibo1230123/article/details/80142210 每个芯片开发商都会针对每款 ...

  9. Zabbix微信报警脚本及写触发记录

    一.Zabbix微信报警 默认路径:/usr/lib/zabbix/scripts/weixin.py #!/usr/bin/python # -*- coding: utf-8 -*- import ...

  10. APP前置代码

    APP自动化前置代码: #导入包from appium import webdriverimport timedesired_caps = {}desired_caps['platformName'] ...