题意

题目链接

分析

不难发现终态一定是 \([2,n-2]\) 中的每个点都与 \(n\) 连边。

关于凸多边形的划分问题,可以将它看作一棵二叉树:每个树点可以看做点可以看做边。

本题中看做点来处理,并将与 \(n\) 号点相连的所有节点看作一次分割(这些点之间一定有连边),每个分割出的区间(也是一棵树)里的根连到树的根。

对于第一问,答案为 \(n-3\) 条边中未连接 \(n\) 号点的边数。容易构造一种方案达到下界:

对于树的根,不同的子树每一步有且仅有一个位置满足可以旋转。这个点没有和 \(n\) 相连,且与 \(n\) 的连线 和 1 条线段相交。

所以对每个非根节点有: \(f_u=(s_u-1)!\prod \frac{f_v}{s_v!}\)

对于根节点有:\(f_{rt}=s_{rt}!\prod \frac{f_v}{s_v!}\)

所以对于每个非根节点,在 \(f_{rt}\) 中的贡献都是 \(\frac{(s_u-1)!}{s_u!}=\frac{1}{s_u}\)

所以答案可以写成:\(\frac{ans1!}{\prod\limits_{(l,r)\in E,r \ne n}(r-l-1)}\)

对于 \(m\) 个拓展状态,可以考虑删边和加边,\(a,b,c,d\) 中一定满足 \(b\) 是 \(c\) 所有出边中的次小值, \(d\) 是 \(c\) 所有出边中的最大值,所以每次确定 \(b,d\) 就可以 \(O(1)\) 了。

复杂度 \(O(n+m)\) 。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define rep(i, a, b) for(int i = a; i <= b; ++i)
inline int gi() {
int x = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar();}
while(isdigit(ch)) { x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}
return x * f;
}
template <typename T> inline bool Max(T &a, T b){return a < b ? a = b, 1 : 0;}
template <typename T> inline bool Min(T &a, T b){return a > b ? a = b, 1 : 0;}
const int N = 1e5 + 7, mod = 1e9 + 7;
int type, n, ans1, m, ans2 = 1;
int inv[N], L[N], R[N], L2[N];
void upd(int l, int r, int v) {
if(r == n) return;
if(v == 1)
ans2 = (LL) ans2 * inv[r - l - 1] % mod * (++ans1) % mod;
else
ans2 = (LL) ans2 * (r - l - 1) % mod * inv[ans1--] % mod;
}
short num[100];
void print(int x) {
short len = 0;
do {
num[len++] = x % 10;
x /= 10;
}while(x);
for(short i = len - 1; ~i; --i) putchar(num[i] + '0');
}
int main() {
type = gi(), n = gi();
inv[1] = 1;
rep(i, 2, n) inv[i] = (LL) (mod - mod / i) * inv[mod % i] % mod;
R[1] = n, L[n] = 1;
rep(i, 2, n - 1) L[i] = i - 1, L2[i] = i, R[i] = i + 1;
rep(i, 1, n - 3) {
int x = gi(), y = gi();
Max(R[x], y);
if(x < L[y]) {
L2[y] = L[y], L[y] = x;
}else Min(L2[y], x);
upd(x, y, 1);
}
m = gi();
print(ans1); if(type) putchar(' '), print(ans2); puts("");
while(m--) {
int a = gi(), c = gi(), b = L2[c], d = R[c];
upd(a, c, -1);
upd(b, d, 1);
print(ans1); if(type) putchar(' '), print(ans2); puts("");
upd(b, d, -1);
upd(a, c, 1);
}
return 0;
}

[HNOI2019]多边形[二叉树建模、组合计数]的更多相关文章

  1. 长沙理工大学第十二届ACM大赛-重现赛 大家一起来数二叉树吧 (组合计数)

    大意: 求n结点m叶子二叉树个数. 直接暴力, $dp[i][j][k][l]$表示第$i$层共$j$节点, 共$k$叶子, 第$i$层有$l$个叶子的方案数, 然后暴力枚举第$i$层出度为1和出度为 ...

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

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

  3. FJOI2020 的两道组合计数题

    最近细品了 FJOI2020 的两道计数题,感觉抛开数据范围不清还卡常不谈里面的组合计数技巧还是挺不错的.由于这两道题都基于卡特兰数的拓展,所以我们把它们一并研究掉. 首先是 D1T3 ,先给出简要题 ...

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

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

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

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

  6. 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是第二类斯特林 ...

  7. 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是第二类斯特林 ...

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

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

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

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

随机推荐

  1. ArrayMap 和HashMap的区别

    在以往android开发中,我们常常用key-value存储数据时,随手就会打出HashMap的代码,当数据量较小时,这种方法还不错还可以,当数据量比较多的时候,如果是PC机上,也还阔以.但是如果使用 ...

  2. 「Android」SurfaceFlinger分析

    本篇针对surfaceFlinger模块进行分析,目录如下: 1.SurfaceFlinger功能 1.1.BufferQueue原理(native/libs/gui模块) 1.2   layer显示 ...

  3. sdk manager闪退

    ,1确认好sdk环境变量是否都正确 命令行:android 来验证 2确定jdk是否安装正确 命令行:java   和  javac 都没有问题,就将sdk安装版覆盖安装下不要卸载,不然下载的太慢了 ...

  4. HanLP汉语言分析框架

    HanLP(Han Language Processing)是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用. HanLP具备功能完善.性能高效.架构清晰.语料时新. ...

  5. 【PSR规范专题(6)】PSR-7 HTTP消息接口【转】

    PSR-5 和 PSR-6 投票未通过所以直接跳到PSR-7了 本文档描述了在RFC 7230和RFC 7231中被描述来代表HTTP消息通用接口,以及在RFC 3986中规定的URIs语法. HTT ...

  6. openstack nova工作流程

    工作流程请求:nova boot --image ttylinux --flavor 1 i-01nova-api 接受请求,一个tcp REST请求.nova-api 发送一个创建虚拟机的请求到消息 ...

  7. [20190401]关于semtimedop函数调用.txt

    [20190401]关于semtimedop函数调用.txt --//上个星期测试,链接http://blog.itpub.net/267265/viewspace-2639675/--//关于sql ...

  8. 数据库之mysql篇(4)—— navicat操作mysql

    navicat 1.简介: navicat是一个软件,旗下针对不同数据库有不同的软件版本,支持以下数据库,还是挺厉害的: 这里我采用navicat for mysql版本.实现图形化的操作mysql, ...

  9. 数据库之mysql篇(2)—— mysql常识引入/用户授权

    常识引入 1.概念: 数据库:本质上是一个文件夹 1)查看本机所有数据库:show databases; 结束符:分号[:],一切数据行的结尾都以分号作为结束 2)创建数据库:create  数据库名 ...

  10. 洗礼灵魂,修炼python(64)--爬虫篇—re模块/正则表达式(2)

    前面学习了元家军以及其他的字符匹配方法,那得会用啊对吧?本篇博文就简单的解析怎么运用 正则表达式使用 前面说了正则表达式的知识点,本篇博文就是针对常用的正则表达式进行举例解析.相信你知道要用正则表达式 ...