CF561做题
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做题的更多相关文章
- UOJ 做题记录
UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- C语言程序设计做题笔记之C语言基础知识(上)
C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...
- 屏蔽Codeforces做题时的Problem tags提示
当在Codeforces上做题的时,有时会无意撇到右侧的Problem tags边栏,但是原本并不希望能够看到它. 能否把它屏蔽了呢?答案是显然的,我们只需要加一段很短的CSS即可. span.tag ...
- ACM 做题过程中的一些小技巧。
ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...
- [日记&做题记录]-Noip2016提高组复赛 倒数十天
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...
- CodeM美团点评编程大赛复赛 做题感悟&题解
[T1] [简要题意] 长度为N的括号序列,随机确定括号的方向:对于一个已确定的序列,每次消除相邻的左右括号(右左不行),消除后可以进一步合并和消除直到不能消为止.求剩下的括号的期望.\(N \l ...
- (luogu1704)寻找最优美做题曲线 [TPLY]
寻找最优美做题曲线 题目链接:https://www.luogu.org/problemnew/show/P1704 题目大意: 求包含指定点的最长不降子序列(严格递增) 题解 首先我们发现 一个序列 ...
- project euler做题记录
ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...
随机推荐
- k8s nginx ingress配置TLS
在没有配置任何nginx下,k8s的nginx默认只支持TLS1.2,不支持TLS1.0和TLS1.1 默认的 nginx-config(部分可能叫 nginx-configuration)的配置如下 ...
- SELECT COUNT语句
数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查. 在数据库的增删改查操作中,使用最频繁的就是查询操作.而在所有查询操作中,统计数量操作更 ...
- 抽象类(abstract)与接口(interface)的区别
如果一个类中包含抽象方法,那么这个类就是抽象类.abstract只能用来修饰类或者方法,不能用来修饰属性. 接口是指一个方法的集合,接口中的所有方法都没有方法体.接口通过关键字interface实现. ...
- 2017ICPC沈阳赛现场赛 L-Tree (dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6228 题目大意:给一棵树,需要用k种颜色给树上的节点染色,问你在最优的染色方案下,相同颜色的节点连接的 ...
- 【学习笔记】可持久化并查集(BZOJ3673)
好久之前就想学了 然后今天恰巧一道题需要用到就学了 前置芝士 1.主席树[可持久化数组] 2.并查集 如果你掌握了前面两个那么这个东西你就会觉得非常沙茶.. 构造 可持久化并查集 = 主席树 + 并 ...
- 存储过程如何传变量到like下
存储过程中执行如下DDL语句create or replace procedure etl_test(v_com varchar2) is v_spname varchar2(40); com var ...
- python3-Django初始化项目详细
0.背景 近期在学习django,在初始化项目的时候遇到了一丢坑,记录一下. 1.安装django 下载安装包解压出来后,python3 setup.py install 即可 2.创建项目 djan ...
- 【leetcode】553. Optimal Division
题目如下: 解题思路:这是数学上的一个定理.对于x1/x2/x3/..../xN的序列,加括号可以得到的最大值是x1/(x2/x3/..../xN). 代码如下: class Solution(obj ...
- 【leetcode】75. Sort Colors
题目如下: 解题思路:我的解题思路是遍历数组,遇到0删除该元素并插入到数组头部,遇到1则不处理,遇到2删除该元素并插入到数组尾部. 代码如下: class Solution(object): def ...
- Python3解leetcode Maximum SubarrayHouse Robber
问题描述: You are a professional robber planning to rob houses along a street. Each house has a certain ...