我现在真的什么都不会了呢......

题目链接: https://www.codechef.com/problems/SEAARC

好吧,这题其实考察的是枚举的功力……

题目要求的是\(ABAB\)的数量,这个不太好求,但是不同颜色区间对的总数和\(AABB,ABBA\)的都比较好求

补集转化,求\(ans0,ans1,ans2\), 分别表示总数、\(AABB\)、\(ABBA\)的数量

\(ans0\)很好算

\(ans1\), 枚举\(B\)的左端点

\(ans2\), 分块讨论

若\(A,B\)都是小颜色(该颜色块的数量小于阈值),则枚举\(A\)的左右端点,变成二维数点

若\(A\)是大颜色\(B\)是小颜色,则枚举\(A\)的种类,然后枚举\(B\)的种类和左右端点,推一下式子发现可以维护前缀和省去枚举左端点

若\(B\)是大颜色,同理枚举\(B\)的种类然后枚举\(A\)的种类和左右端点,同样省去枚举左端点

从昨天下午做到今天上午。。

理论最优时间复杂度\(O(n\sqrt{n\log n})\)

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<vector>
#include<cmath>
#define llong long long
using namespace std; const int N = 1e5;
const int P = 1e9+7;
const llong INV2 = 5e8+4;
int nxt[N+3];
int lstpos[N+3];
int a[N+3];
int num[N+3];
int cnum[N+3];
llong tmp0[N+3],tmp1[N+3],tmp2[N+3];
vector<int> clrpos[N+3];
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+3]; 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=0; i<=siz; i++) tr[i] = 0ll;
}
} bit1,bit2; void getans0() //ans0=ËùÓÐÑÕÉ«C(num,2)Á½Á½³Ë»ýÖ®ºÍ ²»ËãAAAA
{
llong cur = 0ll;
for(int i=1; i<=m; i++)
{
llong tmp = C2(num[i]);
update(ans0,cur*tmp%P);
update(cur,tmp);
}
} void getans1() //²»ËãAAAA
{
llong tmp = 0ll; //µ±Ç°×ܹ²Í¬É«Çø¼äµÄ¸öÊý
for(int i=1; i<=n; i++)
{
update(ans1,(tmp-C2(cnum[a[i]]))*(num[a[i]]-cnum[a[i]]-1)); //ÕâÖÖÑÕÉ«×ܸöÊý¼õÕâ֮ǰµÄ¸öÊý-1£¬µÈÓÚÕâÖ®ºóµÄ¸öÊý£¬³ËÒÔÇ°ÃæµÄÒìÉ«¸öÊý
update(tmp,(llong)cnum[a[i]]); //ÕâÖÖÑÕɫ֮ǰµÄ¸öÊý
cnum[a[i]]++;
}
} void getans2a() //small-small ²»ËãAAAA
{
bit1.siz = n; bit1.clear(); llong cur = 0ll;
for(int i=1; i<=n; i++) //ö¾ÙÓҶ˵ã
{
if(num[a[i]]<=B)
{
int tnum = 0;
for(int j=nxt[i]; j; j=nxt[j])
{
llong tmp = cur-bit1.querysum(j)-C2(tnum)+P+P; //>jµÄ×ó¶ËµãµÄ¸öÊý=×ܸöÊý¼õ<=jµÄ¸öÊý£¬È¥µôͬɫµÄ¸öÊý(²»ËãiºÍj)
update(ans2a,tmp);
tnum++; //ͬɫ¸öÊý
}
for(int j=nxt[i]; j; j=nxt[j]) //ÓÉÓÚÊÇÓҶ˵ãСÓÚj£¬ÏÈÐ޸ĺó²éѯ
{
cur++; //Ä¿Ç°Çø¼ä×ܸöÊý,¼´bit1.querysum(i)
bit1.addval(j,1);
}
}
}
} void getans2b() //large-small
{
for(int i=1; i<=m; i++) //ö¾ÙAÖÖÀà
{
if(num[i]>B)
{
tmp1[0] = 0ll; for(int j=1; j<=n; j++) tmp1[j] = tmp1[j-1]+(a[j]==i?1:0);
for(int j=1; j<=m; j++) //ö¾ÙBÖÖÀà
{
if(num[j]<=B)
{
llong cur = 0ll;
for(int k=0; 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]); //lb²»¿ÉµÈÓÚrb, ËùÒÔÏȸüÐÂans2bÔÙ¸üÐÂcur
}
}
}
}
}
} void getans2c() //large-large or small-large ²»ËãAAAA
{
for(int i=1; i<=m; i++) //ö¾ÙBµÄÖÖÀà
{
if(num[i]>B)
{
tmp1[0] = 0; for(int j=1; j<=n; j++) tmp1[j] = tmp1[j-1]+(a[j]==i?1:0);
for(int j=1; j<=m; j++) //ö¾ÙAµÄÖÖÀà
{
if(i==j) continue;
llong cur1 = 0ll,cur2 = 0ll;
for(int k=0; k<clrpos[j].size(); k++) //ö¾Ùra
{
//¸üÐÂans2c
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);
//¸üÐÂcur1,cur2
update(cur2,tmp1[ra]*tmp1[ra]);
update(cur1,tmp1[ra]);
}
}
}
}
ans2c = ans2c*INV2%P;
} int main()
{
scanf("%d",&n); B = sqrt(n)/2;
for(int i=1; i<=n; i++) scanf("%d",&a[i]),num[a[i]]++,m = max(m,a[i]),clrpos[a[i]].push_back(i);
for(int i=1; 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 0;
}

Codechef SEAARC Sereja and Arcs (分块、组合计数)的更多相关文章

  1. [总结]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...

  2. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  3. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  4. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  5. 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)

    [HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...

  6. 【BZOJ5323】[JXOI2018]游戏(组合计数,线性筛)

    [BZOJ5323][JXOI2018]游戏(组合计数,线性筛) 题面 BZOJ 洛谷 题解 显然要考虑的位置只有那些在\([l,r]\)中不存在任意一个约数的数. 假设这样的数有\(x\)个,那么剩 ...

  7. 【BZOJ5305】[HAOI2018]苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  8. 【BZOJ3142】[HNOI2013]数列(组合计数)

    [BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...

  9. 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)

    [BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...

随机推荐

  1. poj3252(数位dp)(模板)

    题目链接:https://vjudge.net/problem/POJ-3252 题意:求[l,r]之间的Round Number数,RN数即化为二进制后0的个数不少于1的个数的数. 思路:之前用组合 ...

  2. [转帖]oracle 00600 4194 4193 问题的处理

    oracle断电重启之ORA-00600[4194] https://www.cnblogs.com/xwdreamer/p/3778383.html 部门的机器出现异常 断电导致的 错误 从网上学了 ...

  3. JavaScript学习总结(一)——闭包、对象、函数

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  4. memset函数及注意事项

    memset函数的原型为:void * memset(void *ptr,int value,size_t num);用于为地址ptr开始的num个字节赋值value. memset函数的头文件为:C ...

  5. wode.

    http://www.cnblogs.com/wilber2013/p/4638967.html

  6. React中用EChart写面积图

    UED出的设计图如下:  实际展示效果如下: 调取的数据如下: "staffCountList":[ { "time":"2019-12-24 17: ...

  7. 解决 "Could not autowire. No beans of 'SationMapper' type found" 的问题

    网上查找的方法,附上原文链接:https://blog.csdn.net/Coder_Knight/article/details/83999139 方法1:在mapper文件上加@Repositor ...

  8. vue 中 @click.native.prevent 事件

    在项目中看到@click.native.prevent, 查了一点资料 总结一下, 1.给vue组件绑定事件时候,必须加上native ,否则会认为监听的是来自Item组件自定义的事件, 2.prev ...

  9. git和svn 及git使用&解决上线冲突

    一.svn git的工作流程 git 的工作流程图 二.git的基础使用 git 的安装 1.下载对应版本:https://git-scm.com/download 2.安装git:在选取安装路径的下 ...

  10. poj 1543 Perfect Cubes (暴搜)

    Perfect Cubes Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15302   Accepted: 7936 De ...