
计数问题
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Codeforces - AB-string
题目链接:AB-string考虑计算不合法的字符串。我们可以发现形式为:ABABBA______________BA用总方案减去即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=3e5+10;int n,res; char str[N];sign原创 2021-01-20 15:20:44 · 264 阅读 · 1 评论 -
CTOI10D2 - PIN
题目链接:CTOI10D2 - PIN我们枚举几个位置固定相等,然后其他位置不管,然后算出方案数。但是我们会发现计算重复了,比如3个位置一样会包含4个位置一样的。需要容斥掉。假设对于3个位置一样,因为对于某种3个位置的选择,会多计算一次4个位置的,然后有4种3个位置的,所以减去4倍的4个位置相同的方案数。对于2个位置一样,对于某种2个位置一样的选择,会有2种3个位置的,然后有6中2个位置的,然后3个位置的有4种,所以需要减去 2 * 6 / 4 种3个位置的方案数。其他同理。AC代码:#p原创 2021-01-06 15:28:30 · 151 阅读 · 0 评论 -
Jersey Number
题目链接:Jersey Number直接算有交集的不太好计算,我们可以选择计算不相交的,然后用总方案数减去。考虑不相交的,我们枚举每一种状态的区间,然后因为不相交,所以方案数为当前状态区间的方案数乘以当前状态取反的子集的方案数。对于一个状态的方案数,我们可以枚举右端点,对于左端点合法的一定最多只有16个。然后计数一下即可。对于一个状态的子集个数可以sos dp得到。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#includ原创 2021-01-06 09:01:52 · 673 阅读 · 0 评论 -
[HNOI2008]明明的烦恼
题目链接:[HNOI2008]明明的烦恼如果按照树形态dp,是不可做的。我们直接按照purfer序列组合数求即可。看成一个 n-2 长度的序列。对于固定的度,相当于盒子中放球,然后剩下的未定的,相当于从剩下位置中随便放。因为要高精度,所以用的pyAC代码:fac=[1]*(1010)def C(n,m): return fac[n]//fac[m]//fac[n-m]def main(): n=int(input()) a=[1]*(n+10) fac[0原创 2020-11-20 00:15:38 · 383 阅读 · 0 评论 -
置置置换
题目链接:置置置换令 dp[i] 为前 i 个数的排列的方案数。因为是一个排列,所以相对大小都是固定的。1 2 3 的方案数和 1 3 7 的方案数一样。所以我们枚举当前数字 i 加入到前面每个奇数位置 j 当中,从 i - 1 个数字当中选 j -1 个数字,然后再乘数字的方案数。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long lo原创 2020-11-16 11:19:19 · 264 阅读 · 0 评论 -
HDU - 4705
题目链接:HDU - 4705正难则反。考虑总方案减去为一条链的方案。这样我们枚举一条链中间的点即可。然后另外两个点从不同子树中选取,或者从父亲选一个。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10;int n,sz[N],s;vector&l原创 2020-08-30 15:31:31 · 295 阅读 · 0 评论 -
HDU - 6446
题目链接:HDU - 6446考虑每条边的使用次数。显然只有1-2,2-3,3-4这样穿过才是合法的,一共有 n-1 对。然后我们可以从子树当中选一个位置,和非子树的选一个位置,然后其他的随便放。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10,mo原创 2020-08-02 23:48:59 · 283 阅读 · 0 评论 -
HDU - 6044
题目链接:HDU - 6044分治区间,对于当前区间可以分成两边计算。特判无解的情况。AC代码:#pragma comment(linker, /STACK:102400000,102400000)#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+10,mod=原创 2020-08-01 11:30:53 · 239 阅读 · 0 评论 -
[CCO 2014]Troy 与三角形
题目链接:[CCO 2014]Troy 与三角形我们对每一个点作为三角形的最上面顶点然后向下考虑,并且利用前缀和优化。复杂度是n^3的。但是我们如果知道上一个点的答案,那么之后的就可以少判断很多,相当于是记忆化,每一行最多访问一次。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;c原创 2020-07-01 22:43:46 · 337 阅读 · 0 评论 -
夜游 ECNU
题目链接:夜游 ECNU显然有一个n*n的dp方程。但是我们可以按照x排序,之后用fenwick维护y的前缀和,然后计数即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=2e5+10,mod=1e9+7;int n,d[N],m,res[N];stru原创 2020-06-30 23:54:35 · 267 阅读 · 0 评论 -
子串问题2
题目链接:子串问题2考虑以每个点作为右端点的最长子串长度。即不包括最近的一个连续3个相同的字符串。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+10;int n,vis[N],pre=1; char str[N]; long long res;s原创 2020-06-25 00:24:44 · 241 阅读 · 0 评论 -
Codeforces - High Cry
题目链接:Codeforces - High Cry我们直接计算不合法的个数,也就是枚举每个点,当前点作为最大值的合法区间。作为最大值的区间之间正反两次单调栈即可。然后上一个异或>now的位置,我们可以对每一个二进制位递推预处理。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;原创 2020-06-22 23:07:38 · 267 阅读 · 0 评论 -
钢琴演奏家
题目链接:钢琴演奏家显然,直接枚举不好计算相同数字的情况,需要容斥。不过我们可以先排序,然后从左往右计算,计算当前这个数字的时候,只能弹之前的,这样相当于给了相同数字一个顺序。算是很简单的算贡献,计数了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+1原创 2020-05-23 08:54:00 · 183 阅读 · 0 评论 -
小H和游戏
题目链接:小H和游戏直接寻找满足距离的节点复杂度是O(n^2)的,因为菊花图每次都找n个点。但是我们可以利用父亲节点的唯一性来做。维护每个点的贡献。dp1,当前节点之间被轰炸的次数。dp2,当前节点的儿子被轰炸的次数。dp3,当前节点的二级儿子被轰炸的次数。每次更新一个点的时候,顺便更新父亲即可。AC代码:#pragma GCC optimize("-Ofast","-fun...原创 2020-04-14 20:15:56 · 8125 阅读 · 0 评论 -
Codeforces - Monotonic Renumeration
题目链接:Codeforces - Monotonic Renumeration因为任意两个相同的数字之间必须相等,其实就是这两个数之间只能填同一个数字。所以相当于就是把区间分成一个部分 答案就是 ans=2^(cnt-1)所以就是求多少部分,前缀和维护即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#inclu...原创 2020-04-02 17:23:54 · 261 阅读 · 0 评论 -
51NOD - 1677treecnt
题目链接:51NOD - 1677treecnt显然可以考虑每条边的贡献。假设这条边左边s个点,右边n-s个点。只有左右都有点,那么这条边就会贡献答案。然后容斥计算就是总方案减去全在左边或者全在右边。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define...原创 2020-04-02 14:07:56 · 204 阅读 · 0 评论 -
Codeforces - Lucky Tree
题目链接:Codeforces - Lucky Tree对于每个点,我们只要求出,这个点出去到某个点必经重要边的点的数量即可。所以我们直接用不重要的边建图,那么这个联通块到其他联通块肯定要经过重要边。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#defi...原创 2020-03-05 14:55:16 · 426 阅读 · 0 评论 -
Codeforces - Number of Components
题目链接:Codeforces - Number of Components对于这道题,我们可以发现:联通块数量 = 点数 - 边数所以我们分别对于点数和边数求和,然后相减也是正确的。点数:每个点如果可以贡献,那么L<=a[i] && R>=a[i] ,所以方案数位:a[i] * (n-a[i]+1)边数:考虑当前点和前面一个点形成的边:包括这两个点,那么边就...原创 2020-02-22 15:58:08 · 258 阅读 · 0 评论 -
Codeforces - Beautiful Graph
题目链接:Codeforces - Beautiful Graph显然,简单计数问题。如果存在奇环,肯定无解。否则对每个环依次计数,不同环相乘。因为可能多个环。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusin...原创 2020-02-20 13:36:48 · 206 阅读 · 0 评论 -
Codeforces - Palindrome Pairs
题目链接:Codeforces - Palindrome Pairs因为可以随意排列。所以,答案只与奇偶性有关。只有一个字母是奇数,或者没有。进而,我们可以发现“bbb”和“b”其实本质是一样的。所以我们可以对每个字符串状态压缩。然后枚举哪一位是1即可。因为状态很大,所以我们可以对状态离散化,或者直接用map存。AC代码:#pragma GCC optimize("-Ofast"...原创 2020-02-19 14:06:14 · 218 阅读 · 1 评论 -
Codeforces - Directed Roads
题目链接:Codeforces - Directed Roads可以发现给的是基环树,那么可能成环的,并且环的大小,我们提前处理出来。对于每个环的大小为sz,不成环的方案数为: 2 ^ sz - 2对于非环上的边,随便放 方案为 2 ^ sumAC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bi...原创 2020-02-03 21:03:25 · 171 阅读 · 0 评论