题目链接

CF 原题

\(Description\)

有n个点,其中有m条边连接两个点。每一个没有连边的三元组\((i,j,k)(i<j<k)\)对答案的贡献为\(A*i+B*j+C*k\),求所有无连边三元组的贡献和。

\(Solution\)

直接求无连边三元组依旧很难。考虑用所有方案去减,那 Ans=所有方案-至少有1条连边+至少有2条连边-有3条边("至少"显然比较好做啊)。

对于所有方案,A,B,C可以分别统计,即枚举哪个是A/B/C,剩下的随便组合。

对于至少1条连边,可以枚举每个点及其出边(\(O(n+m)\))。因为连的双向边,所以对于i,to=link[i],只在i<to时计算i作为A/A/B,to作为B/C/C时的值就行了。

对于至少2条连边,枚举两条边的公共端点(so得建无向图),组合一下。不好求其它连边的和,所以算to的贡献。

对于三条连边,直接\(O(m\sqrt{m})\)枚举三元环。

bzoj水过,然而Codeforces上T了。。毕竟复杂度有点高。抄的代码不太好,但是好理解啊。不管了。

//24736kb	2884ms
#include <set>
#include <cmath>
#include <cstdio>
#include <cctype>
#include <vector>
#include <iostream>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 250000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define Vec std::vector<int>
#define Output printf("%I64u\n",ans)
typedef long long LL;
typedef unsigned long long ull;
const int N=2e5+5; int m,dgr[N],Link[N];
ull n,A,B,C,sumA[N],sumB[N],sumC[N];
Vec vec[N];
std::set<int> s[N];
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline ull readull()
{
ull now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
} int main()
{
n=read()-1, m=read(), A=readull(), B=readull(), C=readull();//id:0~n
for(int u,v; m--; )
u=read(), v=read(), vec[u].push_back(v), vec[v].push_back(u), s[u].insert(v), s[v].insert(u);
for(int i=0; i<=n; ++i) dgr[i]=vec[i].size(), std::sort(vec[i].begin(),vec[i].end()); ull ans=0;
//All
for(ull i=0; i<=n-2; ++i) ans+=A*i*((n-i)*(n-i-1)>>1);//All
for(ull i=1; i<n; ++i) ans+=B*i*i*(n-i);
for(ull i=2; i<=n; ++i) ans+=C*i*(i*(i-1)>>1);
//One & Two
for(ull i=1; i<=n; ++i) sumA[i]=sumA[i-1]+i*A, sumB[i]=sumB[i-1]+i*B, sumC[i]=sumC[i-1]+i*C;
for(ull i=0; i<=n; ++i)
{
const Vec &to=vec[i]; ull cnt0=0,cnt1=0;
for(int j=0,len=to.size()-1; j<=len; ++j)
{
ull v=to[j];
if(v<i) ++cnt0, ans+=A*v*(len-j)+B*v*j;//同下,无论i为B/C,v有len-j种可能为A。
else//v>i
{//要找一个位置使得i<to[x]<v,所以在v<i时再算v作为A/B的答案(写出三种可能就比较清楚了)
++cnt1;
ans-=(A*i+B*v)*(n-v)+sumC[n]-sumC[v];
ans-=(A*i+C*v)*(v-i-1)+sumB[v-1]-sumB[i];
if(i) ans-=(B*i+C*v)*i+sumA[i-1]; ans+=C*v*j+B*v*(len-j);//无论i作为A还是B,v就是有j种可能作为C(前j种任选一个都能确定i是A or B)。
}
}
ans+=i*(A*(cnt1*(cnt1-1)>>1)+B*cnt0*cnt1+C*(cnt0*(cnt0-1)>>1));
//上面只算了i作为两边端点时其它点的贡献,并没有算i的。(枚举别的枚举到i时也不是i作为要枚举的两边端点了)
}
//Three
for(int i=0,size=sqrt(m); i<=n; ++i)
{
const Vec &to=vec[i]; int len=to.size();
for(int j=len-1; ~j; --j) Link[to[j]]=i;
for(int j=len-1; ~j; --j)
if(i<to[j])
{
int v=to[j];
if(dgr[v]<=size)
{
for(int k=vec[v].size()-1; ~k; --k)
if(v<vec[v][k]) ans-=A*i+B*v+C*vec[v][k];
else break;
}
else
{
for(int k=len-1; ~k; --k)
if(v<to[k])
if(s[v].count(to[k])) ans-=A*i+B*v+C*to[k];
else ;
else break;
}
}
} printf("%llu",ans); return 0;
}

BZOJ.5407.girls(容斥 三元环)的更多相关文章

  1. bzoj 3622 DP + 容斥

    LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...

  2. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

  3. BZOJ 3498 PA2009 Cakes(三元环处理)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3498 [题目大意] N个点m条边,每个点有一个点权a. 对于任意一个三元环(j,j,k ...

  4. BZOJ 4361 isn 容斥+dp+树状数组

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列A不是非降的 ...

  5. BZOJ 2287 DP+容斥

    思路: 先处理出来f[j]表示这i个物品都可用 填满容量j的方案数 容斥一发 处理出来g[j]=g[j-w[i]] 表示i不能用的时候 填满容量j的方案数 //By SiriusRen #includ ...

  6. BZOJ.2916.[POI1997]Monochromatic Triangles(三元环)

    题目链接 \(Description\) n个点的完全图,其中有m条边用红边相连,其余边为蓝色.求其中三边同色的三角形个数. \(Solution\) 直接求同色 除了n^3 不会.. 三角形总数是C ...

  7. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

  8. [BZOJ 3198] [Sdoi2013] spring 【容斥 + Hash】

    题目链接:BZOJ - 3198 题目分析 题目要求求出有多少对泉有恰好 k 个值相等. 我们用容斥来做. 枚举 2^6 种状态,某一位是 1 表示这一位相同,那么假设 1 的个数为 x . 答案就是 ...

  9. [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

    题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...

随机推荐

  1. JavaScript事件冒泡与捕获

    event.preventDefault();    如果event.cancelable的值为true,可以取消默认事件 event.cancelable;             元素是否可以取消 ...

  2. python程序练习题集

    1.#输入a,b,c,d4个整数,计算a+b-c*d的结果 a=input("please input a nimber:") b=input("please input ...

  3. ==和equals区别

    java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等号( ...

  4. -bash: /bin/rm: Argument list too long的解决办法【转】

    当目录下文件太多时,用rm删除文件会报错: -bash: /bin/rm: Argument list too long 提示文件数目太多. 解决的办法是使用如下命令: ls | xargs -n 1 ...

  5. Codeforces Round #504 D. Array Restoration

    Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部 ...

  6. 使用IDEA进行打包

    使用IDEA打jar包: 1.

  7. Java多线程-Java多线程概述

    第一章 Java多线程概述 线程的启动 线程的暂停 线程的优先级 线程安全相关问题 1.1 进程与线程 进程:可以将运行在内存中的程序(如exe文件)理解为进程,进程是受操作系统管理的基本的运行单元. ...

  8. (一)问候 Jsoup

    第一节: Jsoup 简介 Jsoup简介 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQu ...

  9. nginx防止DDOS攻击

    防御DDOS是一个系统工程,攻击花样多,防御的成本高瓶颈多,防御起来即被动又无奈.DDOS的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构 ...

  10. Effective STL 学习笔记14: Use reserve to avoid unnecessary reallocations.

    vector 和 string 容器在动态插入一个新的对象时,如果容器内空间不够,该容器会: 重新分配空间 通常的做法是分配当前 Capacity 大小两倍的空间. 将旧空间中的所有元素拷贝进新的空间 ...