【CF】Sereja and Arcs
#include <bits/stdc++.h>
#define llong long long
using namespace std; const int N = 1e5;
const int P = 1e9+;
const llong INV2 = 5e8+;
int nxt[N+];
int lstpos[N+];
int a[N+];
int num[N+];
int cnum[N+];
llong tmp0[N+],tmp1[N+],tmp2[N+];
vector<int> clrpos[N+];
int n,m,B;
llong ans1,ans2a,ans2b,ans2c,ans0,ans; llong C2(llong x) {return x*(x-1ll)/2ll%P;}
llong update(llong &x,llong y) {x = (x+y)%P;} struct BITree
{
llong tr[N+]; int siz;
void addval(int lrb,llong val)
{
while(lrb<=siz)
{
update(tr[lrb],val);
lrb += (lrb&(-lrb));
}
}
llong querysum(llong rb)
{
llong ret = 0ll;
while(rb)
{
update(ret,tr[rb]);
rb -= (rb&(-rb));
}
return ret;
}
void clear()
{
for(int i=; i<=siz; i++) tr[i] = 0ll;
}
} bit1,bit2; void getans0()
{
llong cur = 0ll;
for(int i=; i<=m; i++)
{
llong tmp = C2(num[i]);
update(ans0,cur*tmp%P);
update(cur,tmp);
}
} void getans1()
{
llong tmp = 0ll;
for(int i=; i<=n; i++)
{
update(ans1,(tmp-C2(cnum[a[i]]))*(num[a[i]]-cnum[a[i]]-));
update(tmp,(llong)cnum[a[i]]);
cnum[a[i]]++;
}
} void getans2a()
{
bit1.siz = n; bit1.clear(); llong cur = 0ll;
for(int i=; i<=n; i++)
{
if(num[a[i]]<=B)
{
int tnum = ;
for(int j=nxt[i]; j; j=nxt[j])
{
llong tmp = cur-bit1.querysum(j)-C2(tnum)+P+P;
update(ans2a,tmp);
tnum++;
}
for(int j=nxt[i]; j; j=nxt[j])
{
cur++;
bit1.addval(j,);
}
}
}
} void getans2b()
{
for(int i=; i<=m; i++)
{
if(num[i]>B)
{
tmp1[] = 0ll; for(int j=; j<=n; j++) tmp1[j] = tmp1[j-]+(a[j]==i?:);
for(int j=; j<=m; j++)
{
if(num[j]<=B)
{
llong cur = 0ll;
for(int k=; k<clrpos[j].size(); k++)
{
int rb = clrpos[j][k];
llong tmp = (num[i]-tmp1[rb])*cur%P;
update(ans2b,tmp);
update(cur,tmp1[rb]);
}
}
}
}
}
} void getans2c()
{
for(int i=; i<=m; i++)
{
if(num[i]>B)
{
tmp1[] = ; for(int j=; j<=n; j++) tmp1[j] = tmp1[j-]+(a[j]==i?:);
for(int j=; j<=m; j++)
{
if(i==j) continue;
llong cur1 = 0ll,cur2 = 0ll;
for(int k=; k<clrpos[j].size(); k++)
{
int ra = clrpos[j][k];
llong tmp = tmp1[ra]*tmp1[ra]%P*k%P;
update(ans2c,tmp);
tmp = tmp1[ra]*(-2ll*cur1-k)%P+P;
update(ans2c,tmp);
tmp = cur2+cur1+P;
update(ans2c,tmp);
update(cur2,tmp1[ra]*tmp1[ra]);
update(cur1,tmp1[ra]);
}
}
}
}
ans2c = ans2c*INV2%P;
} int main()
{
scanf("%d",&n); B = sqrt(n)/;
for(int i=; i<=n; i++) scanf("%d",&a[i]),num[a[i]]++,m = max(m,a[i]),clrpos[a[i]].push_back(i);
for(int i=; i<=n; i++)
{
nxt[i] = lstpos[a[i]];
lstpos[a[i]] = i;
}
getans0();
getans1();
getans2a();
getans2b();
getans2c();
ans = ((ans0-ans1-ans2a-ans2b-ans2c)%P+P)%P;
printf("%lld\n",ans);
return ;
}
【CF】Sereja and Arcs的更多相关文章
- 【CF】223 Div.1 C Sereja and Brackets
水线段树. /* 380C */ #include <iostream> #include <string> #include <map> #include < ...
- 【CF】438E. The Child and Binary Tree
http://codeforces.com/contest/438/problem/E 题意:询问每个点权值在 $c_1, c_2, ..., c_m$ 中,总权值和为 $s$ 的二叉树个数.请给出每 ...
- 【CF】148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题意:w个白b个黑,公主和龙轮流取,公主先取,等概率取到一个.当龙取完后,会等概率跳出一只.(0<= ...
- 【CF】328 D. Super M
这种图论题已经变得简单了... /* D */ #include <iostream> #include <string> #include <map> #incl ...
- 【CF】323 Div2. D. Once Again...
挺有意思的一道题目.考虑长度为n的数组,重复n次,可以得到n*n的最长上升子序列.同理,也可以得到n*n的最长下降子序列.因此,把t分成prefix(上升子序列) + cycle(one intege ...
- 【CF】7 Beta Round D. Palindrome Degree
manacher+dp.其实理解manacher就可以解了,大水题,dp就是dp[i]=dp[i>>1]+1如何满足k-palindrome条件. /* 7D */ #include &l ...
- 【CF】86 B. Petr#
误以为是求满足条件的substring总数(解法是KMP分别以Sbeg和Send作为模式串求解满足条件的position,然后O(n^2)或者O(nlgn)求解).后来发现是求set(all vali ...
- 【CF】121 Div.1 C. Fools and Roads
题意是给定一棵树.同时,给定如下k个查询: 给出任意两点u,v,对u到v的路径所经过的边进行加计数. k个查询后,分别输出各边的计数之和. 思路利用LCA,对cnt[u]++, cnt[v]++,并对 ...
- 【CF】310 Div.1 C. Case of Chocolate
线段树的简单题目,做一个离散化,O(lgn)可以找到id.RE了一晚上,额,后来找到了原因. /* 555C */ #include <iostream> #include <str ...
随机推荐
- 六种酷炫Python运行进度条
本文介绍了目前6种比较常用的进度条,让大家都能直观地看到脚本运行最新的进展情况 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...
- 关于css布局中,inline-block元素间隙的处理方法
关于inline-block元素间隙的处理 参考橱窗外的小孩,原文链接https://www.cnblogs.com/showcase/p/10469361.html 如下,两个inline-bloc ...
- 一篇文章快速搞懂什么是GitHub
导读:什么是GitHub?Git与GitHub之间是什么关系?我们为什么需要版本控制系统?GitHub如何使用?本文将带你一探究竟. 本文字数:1710,阅读时长大约:13分钟 一.什么是版本控制 按 ...
- C#LeetCode刷题之#155-最小栈(Min Stack)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4020 访问. 设计一个支持 push,pop,top 操作,并能 ...
- 四博智慧物联系统入门示例-1.增加一个DHT11温湿度传感器
1.准备工作 DOIT农业控制开发板或者esp32模组,并下载 四博智慧物联系统快速入门-2.准备工作 章节中的固件 DHT11连接在端口01 使用快速入门注册的管理账号和用户 2.配置网络 3.绑定 ...
- js中几种常用的数组处理方法的总结
一.filter()用法 功能:用于筛选数组中满足条件的元素,返回一个筛选后的新数组. <script> $(function(){ var arr = [1,-2,3,4,-5]; va ...
- sourcetree关于注册的问题
当前只有Win的版本,Mac自行百度(笑) 很多人用git命令行不熟练,那么可以尝试使用sourcetree进行操作. 然鹅~~sourcetree又一个比较严肃的问题就是,很多人不会跳过注册或者操作 ...
- Selenium数据驱动测试模型和实例
模块驱动的模型虽然解决了脚本的重复问题,但是需要测试不同数据的用例时,模块驱动的方式就不很适合了. 数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变. 装载数据的方式可以是列表. ...
- python基本数据类型(—)
数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2** ...
- 30分钟闲置服务器建站(gitlab为例)
前言 最近博主的阿里云主机又到了续费的时候了,刚买云主机的时候那是各种优惠各种打折,续费的时候只能当孙子了. 为了节省开支,又保证高性能的前提下,买了台10代NUC,内存和ssd自选,搭建一台个人服务 ...