• 我最近是不是数据结构学傻了啊。。。
  • 这道题看是1e5,所以复杂度为\(O(nlogn)\)的是完全可以跑过去的,然后看题,要求的对于每个数满足要求的区间的长度之和,我们自然而然的就可以想到用FHQ-Treap来维护这个序列了。

- ps:不会FHQ的小伙伴们可以学习一下,这也是一个比较好用的数据结构(特别是打暴力)。

  • 然后事情就很好办了。先建一个一颗平衡树,然后每次查询的时候直接用我们可奈的split操作分出满足条件的区间,然后直接统计答案即可。
  • 但是有一个小小的问题,我们每次分出来的序列没有包含与这个相同的数,但它们也是要统计进去的,怎么办呢?

    map,你值得拥有!
  • 我们可以用map记录一下每个出现的次数,相同的数之间形成的匹配数为$ \frac {n*(n-1)}{2} $,因为每个数只能用一次,所以算过了之后要归0;
  • 基本思路就是这样,还有一些处理上的小细节,我会在代码中指出。

AC CODE:

#include<bits/stdc++.h>
#define clean(a,i) memset(a,i,sizeof(a))
#define ll long long
#define inl inline
#define il inl void
#define it inl int
#define ill inl ll
#define re register
#define ri re int
#define rl re ll
#define lc(cur) ch[cur][0]
#define rc(cur) ch[cur][1]
using namespace std;
template<class T>il read(T &x)
{
int f=1;char k=getchar();x=0;
for(;k>'9'||k<'0';k=getchar()) if(k=='-') f=-1;
for(;k>='0'&&k<='9';k=getchar()) x=(x<<3)+(x<<1)+k-'0';
x*=f;
}
const int MAXN = 1e5+5;
// 下方为FHQ-Treap的基本操作
int n,a[MAXN],ch[MAXN][2],val[MAXN],size[MAXN],rd[MAXN],cnt;
il pushup(int cur){size[cur]=size[lc(cur)]+size[rc(cur)]+1;}
it new_node(int a){
val[++cnt]=a,size[cnt]=1,rd[cnt]=rand();
return cnt;
}
it merge(int x,int y){
if(!x||!y) return x+y;
if(rd[x]<rd[y]){
rc(x)=merge(rc(x),y);
pushup(x);return x;
}
else{
lc(y)=merge(x,lc(y));
pushup(y);return y;
}
}
il split(int cur,int k,int &x,int &y){
if(!cur) x=y=0;
else{
if(val[cur]<=k) x=cur,split(rc(x),k,rc(x),y);
else y=cur,split(lc(y),k,x,lc(y));
pushup(cur);
}
}
int root,x,y,z;
il insert(int val){split(root,val,x,y),root=merge(merge(x,new_node(val)),y);}
//打板子时间到此为止,下面是具体的一些操作细节
map<int,int> mp;//用来储存每个数出现的个数
ll ans;//注意要开longlong
int main()
{
read(n);
for(ri i=1;i<=n;i++) read(a[i]),mp[a[i]]++,insert(a[i]);//读入数据,对每个数的出现进行储存,顺便将这个节点插入到平衡树里
for(ri i=1;i<=n;i++){
ri t=a[i]*9/10;
if(a[i]%10==0) t-=1;//这里的两步要注意下,我就是在这里死了好几次。首先是要先乘再除,这样可以保证精度。然后是后面的if判断,通过打表(或者直接推)可以发现,只有10的倍数乘上0.9才是一个整数。因为我们要将小于它的数中满足条件的分成两部分,所以为正数的时候边界还要左移(不太懂的可以自己举几个栗子,或者自己感性理解一下(逃))
split(root,a[i]-1,x,z),split(x,t,x,y);
ans+=size[y],root=merge(merge(x,y),z);//这里的两部都是FHQ的正常操作,顺带着统计下答案
}
for(ri i=1;i<=n;i++){
ri sz=mp[a[i]];mp[a[i]]=0;//把每一个还没有计算过的数拿出来统计答案,级的统计过后要归0
if(!sz) continue;
ans+=1LL*sz*(sz-1)/2;
}
printf("%lld",ans);
return 0;
}

最后再温馨提示一下,蒟蒻的这种做法其实并不是最优的,这道题可以做到O(n),如果感兴趣可以看一下我的方法,但最优的解法还是要学习一下的

Luogu P4670 [BalticOI 2011 Day2]Plagiarism 题解的更多相关文章

  1. Luogu 4784 [BalticOI 2016 Day2]城市

    斯坦纳树复习,我暑假的时候好像写过[JLOI2015]管道连接来着. 设$f_{i, s}$表示以$i$为根,$k$个重要点的连通状态为$s$,($0$代表没有连进最小生成树里面去,$1$代表连进了最 ...

  2. LOJ#2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On

    题目描述 译自 BalticOI 2011 Day1 T3「Switch the Lamp On」有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会.有 N×M 个这样 ...

  3. SCOI 2015 Day2 简要题解

    「SCOI2015」小凸玩密室 题意 小凸和小方相约玩密室逃脱,这个密室是一棵有 $ n $ 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 $ A_i $,每条边 ...

  4. 【GDOI 2011 DAY2 T3】零什么的最讨厌了 (快速求阶乘、中国剩余定理)

    问题描述: 林记在做数学习题的时候,经常遇到这种情况:苦思冥想了很久终于把问题解出来,结果发现答案是0,久而久之林记在得到习题答案是0的时候就没有了做出一道难题的成就感.于是林记决定:以后出题,答案一 ...

  5. JLOI2015 DAY2 简要题解

    「JLOI2015」骗我呢 题意 问有多少个 \(n \times m\) 的矩阵 \(\{x_{i, j}\}\) 满足 对于 \(\forall i \in [1, n], j \in [1, m ...

  6. SCOI2016 Day2 简要题解

    「SCOI2016」妖怪 题意 有 \(n\) 只妖怪,每只妖怪有攻击力 \(\text{atk}\) 和防御力 \(\text{dnf}\) ,在环境 \((a, b)\) 下,它可以把攻击力和防御 ...

  7. 【luogu P1955 [NOI2015]程序自动分析】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1955 并查集操作,1e9要离散化,数组要开大一些,操作前先执行合并操作 样例好毒啊(全是排好序的) #inc ...

  8. 【luogu P2195 HXY造公园】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2195 fir.吐槽题目(省略1w字 sec.考虑对一个森林的维护,每棵树用并查集维护. 操作1:输出当前查询 ...

  9. 【luogu P1073 最优贸易】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1073 对于状态量相互影响的题目,分层图是个不错的想法. 考虑在题目中分为: 不交易: 直接从1到n出去,为0 ...

随机推荐

  1. redis之单机和主从环境搭建

    单机环境搭建 官网http://redis.io/download下载xxx.tar.gz二进制压缩包,注意下载2.8+版本,2.8之前的版本之前从服务器不支持部分重复制,2.6之前的版本不支持set ...

  2. AdapterViewFlipper功能 自动播放的图片库

    案例中有"上一个""下一个""自动播放",但是我觉得可以更加完善一下,点击自动播放,按钮变成"停止播放",在按" ...

  3. HDU 2106 decimal system (进制转化求和)

    题意:给你n个r进制数,让你求和. 析:思路就是先转化成十进制,再加和. 代码如下: #include <iostream> #include <cstdio> #includ ...

  4. gulp布局构建小结

    一.工具选择CSS预处理语言LESS 构建工具gulp(基于node环境)gulp插件:gulp-connect——主要是用来运行一个webserver npm install --save-dev ...

  5. ( KMP 求循环节的个数)Power Strings -- poj -- 2406

    链接: http://poj.org/problem?id=2406 Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bi ...

  6. listview 异步加载

    http://www.iteye.com/topic/685986 ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴 ...

  7. hdu 1505,1506

    1506题目 1505题目 1506: #include<stdio.h> #include<string.h> #include<iostream> using ...

  8. hdu 5685 Problem A (逆元)

    题目 题意:H(s)=∏i≤len(s)i=1(Si−28) (mod 9973),求一个字符串 子串(a 位到 b 位的)的哈希值.这个公式便是求字符串哈希值的公式,(字符的哈希值 = 字符的ASC ...

  9. POJ1062不错的题——spfa倒向建图——枚举等级限制

    POJ1062 虽然是中文题目但是还是有一定几率都不准题目意思的:1.所有可能降价的措施不是降价多少钱而是降至多少钱2.等级范围:是你所走的那一条路中所有人中最好最低等级差不允许超过limit限制 思 ...

  10. 四则运算 Java (于泽浩,袁浩越)

    GitHub 地址 一. 项目要求 题目 实现一个自动生成小学四则运算题目的命令行程序. 需求(全部完成) 使用 -n 参数控制生成题目的个数 Myapp.exe -n 10 使用 -r 参数控制题目 ...