题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个)

n<=5000

[HNOI2015]实验比较 的加强版

g(i,j,k)其实可以递推:g(i,j,k)=g(i-1,j,k-1)+g(i,j-1,k-1)+g(i-1,j-1,k-1)

代码:

判断无解的时候可能比较混乱

1.先保证不要连有向重边

2.如果不是树形图,就是有环,vis过了

#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=;
const int mod=1e9+;
int jie[N],inv[N];
int n,m;
int qm(int x,int y){
int ret=;
while(y){
if(y&) ret=(ll)ret*x%mod;
x=(ll)x*x%mod;
y>>=;
}
return ret;
}
int C(int n,int m){
return (ll)jie[n]*inv[m]%mod*inv[n-m]%mod;
}
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
int du[N];
bool fl;
void add(int x,int y){
// cout<<" x to y "<<x<<" "<<y<<endl;
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int fa[N];
struct con{
int x,y;
int typ;//1:x<y 2:x=y 3:x>y
}q[N];
map<pair<int,int>,int>mp,con;
int fin(int x){
return fa[x]==x?x:fa[x]=fin(fa[x]);
}
int f[N][N];
int mo(int x){
return x>=mod?x-mod:x;
//return x%mod;
}
bool vis[N];
void dfs(int x,int ff){
// cout<<" x ff "<<x<<" "<<ff<<" fl "<<fl<<endl;
if(!fl) return;
int son=;
if(vis[x]) {
fl=false;return;
}
vis[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
if(!fl) return;
int y=e[i].to;
++son;
dfs(y,x);
}
if(son){
for(reg j=;j<=n;++j){
f[x][j]=;
}
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
for(reg j=;j<=n;++j){
f[x][j]=(ll)f[x][j]*f[y][j-]%mod;
}
}
for(reg j=;j<=n;++j){
f[x][j]=mo(f[x][j]+f[x][j-]);
// printf("f[%d][%d] : %d\n",x,j,f[x][j]);
}
}else{
for(reg i=;i<=n;++i) f[x][i]=i;
}
}
int main(){
rd(n);rd(m);
char ch[];
for(reg i=;i<=n;++i){
fa[i]=i;
}
fl=true;
for(reg i=;i<=m;++i){
rd(q[i].x);
scanf("%s",ch);
rd(q[i].y);
if(ch[]=='>') q[i].typ=;
else{
int k1=fin(q[i].x),k2=fin(q[i].y);
q[i].typ=;
fa[k1]=k2;
}
}
for(reg i=;i<=m;++i){
if(!fl) break;
// cout<<q[i].x<<" "<<q[i].y<<" "<<q[i].typ<<endl;
int k1=fin(q[i].x),k2=fin(q[i].y);
// if(!che(k1,k2,q[i].typ)) fl=false;
// cmp[k1][k2]=q[i].typ;
// cmp[k2][k1]=4-q[i].typ; if(q[i].typ==){
if(mp[make_pair(k1,k2)]==){
add(k1,k2);
mp[make_pair(k1,k2)]=;
}
++du[k2];
}else if(q[i].typ==){
if(mp[make_pair(k2,k1)]==){
add(k2,k1);
mp[make_pair(k2,k1)]=;
}
++du[k1];
}
}
if(!fl){
// cout<<" no "<<endl;
puts("");return ;
}
for(reg i=;i<=n;++i){
if(fin(i)==i&&du[i]==){
add(,i);
}
}
// cout<<" fl "<<fl<<endl;
++n;//warning!! 0~n-1
dfs(,-); for(reg i=;i<=n-;++i){
if(!vis[fin(i)]) fl=false;
}
if(!fl){
// cout<<" no "<<endl;
puts("");return ;
}
jie[]=;
for(reg i=;i<=n;++i) jie[i]=(ll)jie[i-]*i%mod;
inv[n]=qm(jie[n],mod-);
for(reg i=n-;i>=;--i){
inv[i]=(ll)inv[i+]*(i+)%mod;
}
ll ans=;
for(reg i=;i<=n;++i){
for(reg j=;j<=i;++j){
if(j&) ans=mo(ans+mod-(ll)C(i,j)*f[][i-j]%mod);
else ans=mo(ans+(ll)C(i,j)*f[][i-j]%mod);
}
}
printf("%lld",ans);
return ;
} }
signed main(){
// freopen("4.in","r",stdin);
// freopen("4.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/9 21:08:53
*/

总结:

建出树形结构

考虑链的拼凑情况。——O(n^3)

神仙二项式反演——O(n^2)

二项式反演这里,利用“前i个编号分配”其实是容易考虑的。因为不用“恰好”,所以不用枚举具体用哪几个

把   恰好->前i个 然后容斥(二项式反演本身就是容斥(也可以大力推式子))

我们实际上把“恰好”放在了外面,最后二项式反演时候再考虑。

fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试的更多相关文章

  1. fzyzojP3618 -- [校内训练-互测20180412]士兵的游戏

    二分图匈牙利也可以 判断必须点就看能不能通过偶数长度的增广路翻过去 代码: (最后一个点4s多才行,,,卡不过算了) 开始边数写少了RE,应该是4*N*N M-R随手开了一堆int?都要是long l ...

  2. 【CH 弱省互测 Round #1 】OVOO(可持久化可并堆)

    Description 给定一颗 \(n\) 个点的树,带边权. 你可以选出一个包含 \(1\) 顶点的连通块,连通块的权值为连接块内这些点的边权和. 求一种选法,使得这个选法的权值是所有选法中第 \ ...

  3. 洛谷 P4463 - [集训队互测 2012] calc(多项式)

    题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...

  4. 【loj2461】【2018集训队互测Day 1】完美的队列

    #2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...

  5. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  6. 【阿里云产品公测】简单粗暴30S完成PTS测试配置附tornado服务器测试结果

    作者:阿里云用户morenocjm [阿里云产品公测]简单粗暴 30S完成PTS测试配置(附tornado服务器测试结果) -------------------------------------- ...

  7. 3D深色金属哥特3D项目工具小图标icon高清设计素材

    3D深色金属哥特3D项目工具小图标icon高清设计素材

  8. ;~ 小部分AutoHotkey源代码片段测试模板2019年10月9日.ahk

    ;~ 小部分AutoHotkey源代码片段测试模板2019年10月9日.ahk ;~ 此脚本用于测试执行一行或多行AHK脚本源代码的效果;~ 此脚本最后修改于2019年9月22日20时03分;~ 把此 ...

  9. ;~ 小部分AutoHotkey脚本源代码测试模板样板.ahk

    ; ;~ 小部分AutoHotkey脚本源代码测试模板样板.ahk ;~ 请把一行或几行少量代码放到此文件中实际测试一下,;~ 看看测试结果如何,等到能够实现代码功能时再复制到自己的脚本代码文件中;~ ...

随机推荐

  1. Sony深度学习框架 - Neural Network Console - 教程(1)- 原来深度学习可以如此简单

    “什么情况!?居然不是黑色背景+白色文字的命令行.对,今天要介绍的是一个拥有白嫩的用户界面的深度学习框架.” 人工智能.神经网络.深度学习,这些概念近年已经涌入每个人的生活中,我想很多人早就按捺不住想 ...

  2. hwconfig命令详解

    基础命令学习目录首页 转载自系统技术非业余研究 本文链接地址: hwconfig查看硬件信息 最近经常要测试新硬件,了解硬件的具体型号和参数就非常重要,过去经常透过lspci, dmidecode, ...

  3. 第14讲:嵌入式SQL语言(基本技巧)

    一.交互式SQL的局限 & 嵌入式SQL的必要性 专业人员(如DBA)可以熟练地运用交互式SQL语言,但普通用户却不是那么容易上手,所以需要通过数据库应用程序来使用数据库.编写一个可以与数据库 ...

  4. map的运用

    一.map是一种关联容器,支持高效的查找和访问 map中的元素是一些关键字-值(key-value)对: 关键字起索引作用: 值表示与索引相关联的数据. 关联容器中元素是根据关键字存储的,故其不支持位 ...

  5. sprint2 (第八天)

    今天课多,没做什么功能.这个sprint定的目标比较高,要实现的功能较多,可能完成不了目标值.因为GitHub下载和上传很慢,经常失败,所以这几天都没有更新GitHub,功能明天早点实现然后上传到Gi ...

  6. 第38次Scrum会议(12/4)【欢迎来怼】

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/12/4 17:50~18:20,总计30min. 地点 ...

  7. Linux上安装设置mysql 5.7.24

    一,准备 1,先查看Linux是32位还是64位 getconf LONG_BIT 如果返回的是32,那么就是32位 如果返回的是64,那么就是64位 2,如果服务器不能联网,就先去官网下载好压缩包, ...

  8. TeamWork#2,Week 2,We are sixsix!

    We are sixsix! (从左至右依次是:郝倩.张志浩.高雅智[高哥].牛强.张明培育.彭林江.王卓) 郝倩,来自120617班,我们组7个成员中唯一一个6行政班以外的成员.为了达成组队条件,彭 ...

  9. jquery前端第一讲

    1.bootstrap里面的文件是什么意思: bootstrap.cssbootstrap.min.cssbootstrap-responsive.cssbootstrap-responsive.mi ...

  10. Java 线程结束 & 守护线程

    /* 停止线程: 1,stop方法. 2,run方法结束. 怎么控制线程的任务结束呢? 任务中都会有循环结构,只要控制住循环就可以结束任务. 控制循环通常就用定义标记来完成. 但是如果线程处于了冻结状 ...