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 ...
随机推荐
- Kubernetes V1.16.2部署Dashboard V2.0(beta5)
Kubernetes V1.16.2部署Dashboard V2.0(beta5) 在Master上部署Dashboard 集群安装部署请看安装Kubernetes V1.16.2 kubectl g ...
- Day4 --- Python中的控制结构(if, for, while, try...expect..)
if for while 可以参考 : https://www.cnblogs.com/HYLering/p/10051906.html try 是异常处理里面的 可以参考 : https://ww ...
- Codeforces Round #521 (Div. 3) E. Thematic Contests(思维)
Codeforces Round #521 (Div. 3) E. Thematic Contests 题目传送门 题意: 现在有n个题目,每种题目有自己的类型要举办一次考试,考试的原则是每天只有一 ...
- k8s nginx ingress配置TLS
在没有配置任何nginx下,k8s的nginx默认只支持TLS1.2,不支持TLS1.0和TLS1.1 默认的 nginx-config(部分可能叫 nginx-configuration)的配置如下 ...
- ECMAScript严格模式
ECMAScript 第5个版本 1. 严格模式: 什么是: 比普通js运行机制,要求更严格的模式 为什么: js语言本身具有很多广受诟病的缺陷 何时: 今后所有的js程序,必须运行在严格模式下! 如 ...
- PF_INET 与驱动
https://blog.csdn.net/trustnature/article/details/7849562 ? ? ?
- shell脚本检索所有mysql数据库中没有primary key的表
1.mkdir -p /root/scripts/ 2. cd /root/scripts/ vim query.sql,代码如下: SELECT CONCAT(t.table_schema,&quo ...
- Codeforces 958F2 Lightsabers (medium) 尺取法
题目大意: 输入n,m,分别表示人的个数和颜色的个数,下一行输入n个数,对应每个人的颜色,最后一行输入对应每个颜色的人应有的数量: 问是否能找出一个区间,满足条件但有多余的人,输出多余的人最少的个数, ...
- JS基础入门篇(四十三)—ES6(二)
1.对象简洁表示法 原来写法 var name = "lzf"; var gender = "male"; var fn = function(){consol ...
- SDOI2019R2翻车记
额...貌似是学OI以来翻得最惨的一次比赛了呢... 不过还好是初三 但是没有机会和学长们打最后一场告别赛了呢(笑 按照惯例还是要记录一下吧. DAY ? 中考倒计时30天.来写这篇游记. DAY 0 ...