Codeforces 985G. Team Players
Description
有 \(n\) 个人 , \(m\) 对人有冲突 , 你要从这 \(n\) 个人中选出三个人成为一组 , 使得同一组的人不存在一对有冲突
题面
Solution
容斥
答案=总方案-至少有一个与 \(i\) 相连的+至少有 \(2\) 个与 \(i\) 相连的-\(i,j,k\) 都互相连接的方案数
前面三种都比较好求,讨论一下 \(i,j,k\) 的偏序关系就行了
关于第三种情况,需要 \(O(m^2)\) 枚举 , 只需要枚举度数较小的两个,最大的那个直接判断是否与前面两个相连就好了
这样做最坏复杂度是 \(O(n*\sqrt{n})\) 的 ,\(CF\) 的 \(Tutorial\) 有证明.
#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
typedef unsigned long long ll;
const int N=2e5+10;
int n,m,head[N],nxt[N*4],to[N*4],num=0,Head[N],b[N],a[N];
ll s[N],ss[N],A,B,C,ans=0,in[N];
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline void Link(int x,int y){nxt[++num]=Head[x];to[num]=y;Head[x]=num;}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int x,y;
cin>>n>>m>>A>>B>>C;
for(int i=1;i<=m;i++)gi(x),gi(y),link(x,y),link(y,x),in[x]++,in[y]++;
for(int i=0,u;i<n;i++)
for(int j=head[i];j;j=nxt[j])
if(in[u=to[j]]>in[i]|| (in[u]==in[i] && u>i))Link(i,u);
//+0
for(int i=0;i<n;i++){
s[i]=s[i-1]+i*A;
ss[i]=ss[i-1]+s[i-1]+B*i*i;
ans+=ss[i-1]+1ll*i*(i-1)/2*C*i;
}
for(int i=0;i<n;i++){
m=0;
for(int j=head[i];j;j=nxt[j])b[a[++m]=to[j]]=i+1;
sort(a+1,a+m+1);s[m+1]=0;
//-1
for(int j=1;j<=m && a[j]<i;j++){
ans-=(a[j]*A+i*B)*(n-i-1)+1ll*(i+n)*(n-i-1)/2*C;
ans-=(a[j]*A+i*C)*(i-a[j]-1)+1ll*(a[j]+i)*(i-a[j]-1)/2*B;
ans-=(a[j]*B+i*C)*a[j]+1ll*a[j]*(a[j]-1)/2*A;
}
//+2
for(int j=1;j<=m && a[j]<i;j++){
s[j]=s[j-1]+a[j];
ans+=s[j-1]*A+(j-1)*(a[j]*B+C*i);
}
for(int j=m;j>=1 && a[j]>i;j--){
s[j]=s[j+1]+a[j];
ans+=s[j+1]*C+(m-j)*(a[j]*B+A*i);
}
for(int j=1;j<m;j++)
if(a[j]<i && a[j+1]>i)ans+=s[j]*A*(m-j)+i*B*j*(m-j)+s[j+1]*C*j;
//-3
for(int j=Head[i];j;j=nxt[j])
for(int k=Head[to[j]];k;k=nxt[k]){
if(b[to[k]]!=i+1)continue;
int c[3]={i,to[j],to[k]};
sort(c,c+3);
ans-=A*c[0]+B*c[1]+C*c[2];
}
}
cout<<ans<<endl;
return 0;
}
Codeforces 985G. Team Players的更多相关文章
- Codeforces 985G - Team Players(三元环)
Codeforces 题目传送门 & 洛谷题目传送门 真·ycx 做啥题我就做啥题 考虑枚举 \(j\),我们预处理出 \(c1_i\) 表示与 \(i\) 相连的编号 \(<i\) 的 ...
- codeforces 932E Team Work(组合数学、dp)
codeforces 932E Team Work 题意 给定 \(n(1e9)\).\(k(5000)\).求 \(\Sigma_{x=1}^{n}C_n^xx^k\). 题解 解法一 官方题解 的 ...
- Codeforces 932E Team work 【组合计数+斯特林数】
Codeforces 932E Team work You have a team of N people. For a particular task, you can pick any non-e ...
- CodeForces985G Team Players
G. Team Players time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces 410C.Team[构造]
C. Team time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- codeforces 757F Team Rocket Rises Again
链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短 ...
- Codeforces 932E Team Work 数学
Team Work 发现网上没有我这种写法.. i ^ k我们可以理解为对于每个子集我们k个for套在一起数有多少个. 那么我们问题就变成了 任意可重复位置的k个物品属于多少个子集. 然后我们枚举k个 ...
- Codeforces 401C Team 贪心法
本题使用贪心法.关键是考贪心策略.同一时候要求要细心,我提交的时候也WA了几次.大意题目就是怎样依照给定的规则排列一个01字符串,引用原题例如以下: C. Team time limit per te ...
- codeforces C. Team 解题报告
题目链接:http://codeforces.com/problemset/problem/401/C 题目意思:给出0和1的数目(分别为n和m个),问是否能构造一条同时满足连续两个0不能再一起和连续 ...
随机推荐
- C#学习(2):委托
1.疑问: 1.委托是什么? 2.为什么需要委托? 3.委托能用来做什么? 4.如何自定义委托? 5..NET默认的委托类型有哪几种? 6.怎样使用委托? 7.多播委托是什么? 8什么是泛型委托? 9 ...
- 数据库表结构文档查看器 基于netcore
前言 日常开发业务代码,新接手一块不熟悉的业务时需要频繁的查看对应业务的数据库表设计文档.相比于直接翻看业务代码,有必要提供一个数据库表结构文档查看器来解决这些繁琐的问题. CML.SqlDoc CM ...
- WPF 触摸屏多点触控图像的缩放旋转和移动
<dxc:DXWindow xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:d ...
- java中集合
一. List集合: 一次只存储一个元素 1.常用的list集合是ArrayList (1)在创建这个集合的对象时, 需要指定这个集合存储的数据类型! 否则这个集合的数据是不安全的. (2)与数组的 ...
- bzoj1047理想的正方形
题目链接 纪念又双叒叕的一道暴力碾标算的题 我们考虑纯暴力 #include<iostream> #include<cstdio> #include<algorithm& ...
- django_jquery中使用ajax发送post请求变成get请求
今天在进行js开发的过程中出现了一个奇怪的问题,就是使用ajax向后端发送post请求时,在浏览器network中查看response时,显示400 bad request 并且请求方式变成get,因 ...
- Kali Linux安全渗透-从入门到精通
Kali-Linux是基于Debian Linux发行版 针对高级渗透测试和安全审计系统.带你一起从入门到精通. 什么是Kali-Linux? kali 包含几百个软件用来执行各种信息安全的任务,如渗 ...
- linux系统解决boot空间不足
有时候更新Linux系统是会碰到boot空间不足的错误,原因基本上是安装时boot空间设置问题可以通过删除旧的内核来释放boot空间. ubuntu: 1.查看当前使用内核版本号 unam ...
- Leetcode 88 合并两个有序数组 Python
合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分 ...
- Linux之Ubuntu系统安装搜狗输入法
如何在Ubuntu系统中安装搜狗输入法? 1.第一步 下载搜狗输入法文件for Linux 2.检查更新 update 如果没有更新的话,需要做这一步 3.语言支持 选择fcitx,然后关闭界面 4 ...