异色弧

Time Limit: 20 Sec  Memory Limit: 256 MB

Description

  

Input

  

Output

  仅一行一个整数表示答案。

Sample Input

  8
  1 2 3 1 2 3 2 1

Sample Output

  8

HINT

  

Main idea

  给定若干个点,每个点有一个颜色,颜色一样的可以组成一个区间,询问有几个交。

Solution

  BearChild只会70分的做法,记录N表示区间个数,效率为O(Nlog(N))。这里介绍一下。

  我们基于将所有区间提取出来计算,可以用一个vector存一下记录相同颜色的,然后相同颜色的任意组合即可组成可行的区间。

  首先我们考虑容斥:颜色不同的相交个数 = 不考虑颜色的总相交个数 - 颜色相同的相交个数。然后我们分段来解:

  1. 不考虑颜色的总相交个数:
    我们考虑带log的算法,先将所有区间按照右端点(细节:若相同则将左端点大的放在前面,保证不会算入答案)排序,然后顺序往后做,每次用树状数组在区间左端点+1区间(右端点-1)处-1(细节:右端点-1处是为了处理前一个的右端点=这一个的左端点情况),然后每次只要查询(左端点-1)的前缀和,显然就是在这个区间前和这个区间的交的个数。这样我们就可以计算出总相交个数了。

  2.颜色相同的相交个数:
    我们考虑如何计算颜色相同的相交个数,设a表示一个颜色的个数,显然个数就是:C(a,4)。也就是任意4个相同颜色点可以组成一个交。

  然后我们相减一下,就可以得到答案啦。注意一下细节。

Code

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std; typedef long long s64;
const int ONE = ;
const int MOD = 1e9+; vector <int> q[ONE]; int n;
int A[ONE];
int cnt,Ans;
int Max,vis[ONE];
int Jc[ONE],inv[ONE]; struct power
{
int l,r;
}a[]; bool cmp(const power &a,const power &b)
{
if(a.r == b.r) return a.l > b.l;
return a.r < b.r;
} void Moit(int &a)
{
if(a<MOD) a+=MOD;
if(a>MOD) a-=MOD;
} int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} namespace D
{
int Quickpow(int a,int b)
{
int res=;
while(b)
{
if(b&) res=(s64)res*a%MOD;
a=(s64)a*a%MOD;
b>>=;
}
return res;
} void Deal_Jc(int k)
{
Jc[]=;
for(int i=;i<=k;i++) Jc[i] = (s64)Jc[i-]*i%MOD;
} void Deal_inv(int k)
{
inv[]=; inv[k] = Quickpow(Jc[k],MOD-);
for(int i=k-;i>=;i--) inv[i] = (s64)inv[i+]*(i+)%MOD;
} void pre(int k)
{
Deal_Jc(k); Deal_inv(k);
}
} int C(int n,int m)
{
if(n < m) return ;
return (s64)Jc[n]*inv[m]%MOD*inv[n-m]%MOD;
} namespace Bit
{
int C[ONE]; int lowbit(int x)
{
return x&-x;
} void Add(int R,int x)
{
for(int i=R;i<=n;i+=lowbit(i))
C[i]+=x, Moit(C[i]);
} int Query(int R)
{
int res=;
for(int i=R;i>=;i-=lowbit(i))
res+=C[i], Moit(res);
return res;
}
} int main()
{
n=get(); D::pre(n+);
for(int i=;i<=n;i++)
{
A[i]=get();
q[A[i]].push_back(i);
Max=max(Max,A[i]);
}
for(int k=;k<=Max;k++)
{
if(!q[k].size()) continue;
Ans-=C(q[k].size(),); Moit(Ans);
for(int i=;i< q[k].size();i++)
for(int j=i+;j< q[k].size();j++)
a[++cnt].l=q[k][i], a[cnt].r=q[k][j];
} sort(a+,a+cnt+,cmp);
for(int i=;i<=cnt;i++)
{
Ans += Bit::Query(a[i].l-);
Moit(Ans);
Bit::Add(a[i].l,), Bit::Add(a[i].r-,-);
} printf("%d",Ans);
}

【Foreign】异色弧 [树状数组]的更多相关文章

  1. BZOJ.4888.[TJOI2017]异或和(树状数组)

    BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...

  2. Luogu3760 TJOI2017 异或和 树状数组

    传送门 题意:给出一个长度为$N$的非负整数序列,求其中所有连续区间的区间和的异或值.$N \leq 10^5$,所有元素之和$\leq 10^6$ 设序列的前缀和为$s_i$,特殊地,$s_0=0$ ...

  3. [BZOJ4888][TJOI2017]异或和(树状数组)

    题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...

  4. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  5. 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)

    题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...

  6. [CSP-S模拟测试]:异或(树状数组+LCA)

    题目传送门(内部题21) 输入格式 第一行一个字符串$str$,表示数据类型.第二行一个正整数$k$,表示集合$K$的大小,保证$k>1$.接下来$k$行每行$k$个数,第$i$行第$j$个数表 ...

  7. 【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D

    [树状数组]区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D PROBLEM 题目描述 初始给定n个卡片拍成一排,其中第i个卡片上的数为x[i]. 有q个询问,每次询问 ...

  8. 【BZOJ4888】[TJOI2017]异或和(树状数组)

    [BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...

  9. BZOJ4888 [Tjoi2017]异或和 【树状数组】

    题目链接 BZOJ4888 题解 要求所有连续异或和,转化为任意两个前缀和相减 要求最后的异或和,转化为求每一位\(1\)的出现次数 所以我们只需要对每一个\(i\)快速求出\(sum[i] - su ...

随机推荐

  1. 深度学习(deep learning)优化调参细节(trick)

    https://blog.csdn.net/h4565445654/article/details/70477979

  2. Java日志(二):log4j与XML配置文件

    [Java日志(一):log4j与.properties配置文件]一文列举的几个案例以.properties文件作为log4j的配置文件,本文简单看一下log4j与XML配置文件 (1)XML配置文件 ...

  3. 25、react入门教程

    0. React介绍 0.1 什么是React? React(有时称为React.js 或ReactJS)是一个为数据提供渲染HTML视图的开源JavaScript库. 它由FaceBook.Inst ...

  4. 阅读MDN文档之布局(四)

    Introducing positioning Static positioning Relative positioning Introducing top, bottom, left and ri ...

  5. ipfs补充命令

    ipfs cat之后 将文件保存在指定的路径下 添加都文件夹下面 ipfs files cp /ipfs/QmSkyNME8YqndkNq7ovKphpYwjk2hEQ61P1pjSckqLP6zt ...

  6. 启动 SQL Server 管理 Studio 在 SQL Server 2008R2 中的错误消息:"无法读取此系统上以前注册的服务器的列表" 解决方法

    问题: 服务器被人直接停掉,重启后,发现sqlserver2008r2 启动管理器报错: "无法读取此系统上以前注册的服务器的列表" 如图: 点击继续,进入后: 解决方法: 点击上 ...

  7. Go基础篇【第8篇】: 内置库模块 bytes [一]

    bytes包实现了操作[]byte的常用函数.本包的函数和strings包的函数相当类似. func Compare func Compare(a, b []byte) int Compare函数返回 ...

  8. J2EE开发实战基础系列之开卷有益

    2014.10.24[致歉]{抱歉,从7.4号接到朋友的请求,一直忙到现在,最近又有新的CASE要忙,很抱歉教程要延误,开课时间请大家关注Q群} 时隔七年再次接触培训有关的事情,是兴奋,更多的是恐惧, ...

  9. 201621044079 week05-继承、多态、抽象类与接口

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 interface关键字 implements has-a;comparable co ...

  10. PAT 1030 完美数列

    https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224 给定一个正整数数列,和正整数 p,设这个数列 ...