题目链接

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. MongoDB以Windows Service运行

    以Administrator身份打开CMD并输入以下命令 cd D:\Developer\MongoDB\mongodb-win32-x86_64-2.4.6\binD:mongod --logpat ...

  2. Java设计模式——工厂模式

    一.工厂模式分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: (1)简单工厂模式(Simp ...

  3. TCP三次握手与四次挥手过程

    TCP连接的建立(三次握手) 首先,客户端与服务器均处于未连接状态,并且是客户端主动向服务器请求建立连接: 客户端将报文段中的SYN=1(同步位),并选择一个seq=x,(即该请求报文的序号为x)  ...

  4. JSON数据填充表格——(三)

    1.定义页面请求JSON的按钮与定义一个带表头的表格  请求数据的按钮 <button class="btn btn-primary search_bar_button floatR& ...

  5. C# WebClient、 jsonp实现跨域

    WebClient 无传输数据获取 Uri uri = new Uri(allURL); WebClient wc = new WebClient(); wc.Encoding = System.Te ...

  6. TF-tf.nn.dropout介绍

    官方的接口是这样的 tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None) 根据给出的keep_prob参数,将输入te ...

  7. Oracle 函数 “数据控制,指定某些人只能查看他权限范围内的信息”

    create or replace function work_plan_mask (p_schema VARCHAR2,p_table VARCHAR2) return Varchar2 AS -- ...

  8. Spring框架的基本使用(AOP部分)

    AOP,Aspect Oriented Programming,意为面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP采取横向抽取机制,取代了传统纵向继承体系重复 ...

  9. Git系统学习网址

    https://code.csdn.net/help/CSDN_Code/progit/zh/07-customizing-git/01-chapter7

  10. HDU 3374 String Problem(KMP+最大(最小)表示)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目大意:给出一个字符串,依次左移一个单位形成一堆字符串,求其字典序最小和最大的字符串需要左移多 ...