【uoj#209】[UER #6]票数统计 组合数+乱搞
一个长度为 $n$ 的序列,每个位置为 $0$ 或 $1$ 两种。现在给出 $m$ 个限制条件,第 $i$ 个限制条件给出 $x_i$ 、$y_i$ ,要求至少满足以下两个条件之一:
- 序列的前 $x_i$ 个位置中,恰好有 $y_i$ 个 $1$ ;
- 序列的后 $y_i$ 个位置中,恰好有 $x_i$ 个 $1$ ;
求有多少个序列满足所有限制条件。答案可能很大,只需要输出它对 $998244353$ 取模后的结果即可。
题解
组合数+乱搞
显然当 $x>y$ 时条件为前缀限制,$x<y$ 时条件为后缀限制。
既有前缀限制,又有后缀限制的情况下,我们枚举总共1的个数,把后缀限制转化为前缀限制。
如果所有限制均有 $x\ne y$ 则可以直接使用组合数计算。预处理组合数,单次计算的时间复杂度是 $O(n)$ 的。
当有 $x=y$ 时,显然只需要考虑所有 $x=y$ 限制中 $x$ 最大的限制即可,总方案数为 满足前缀+满足后缀-满足前缀和后缀。
时间复杂度 $O(n^2)$ 。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1010
#define M 5010
#define mod 998244353
using namespace std;
int n , ax[N] , ay[N] , at , bx[N] , by[N] , bt , c[M][M] , v[M];
int solve(int x)
{
int i , last = 0 , ans = 1;
memset(v , -1 , sizeof(v));
v[0] = 0 , v[n] = x;
for(i = 1 ; i <= at ; i ++ )
{
if(v[ax[i]] != -1 && v[ax[i]] != ay[i]) return 0;
v[ax[i]] = ay[i];
}
for(i = 1 ; i <= bt ; i ++ )
{
if(v[n - bx[i]] != -1 && v[n - bx[i]] != x - by[i]) return 0;
v[n - bx[i]] = x - by[i];
}
for(i = 1 ; i <= n ; i ++ )
{
if(v[i] != -1)
{
if(v[i] < v[last]) return 0;
ans = 1ll * ans * c[i - last][v[i] - v[last]] % mod , last = i;
}
}
return ans;
}
int main()
{
int T;
scanf("%d" , &T);
while(T -- )
{
at = bt = 0;
int m , i , j , x , y , p = 0 , mx = 0 , ans = 0;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= m ; i ++ )
{
scanf("%d%d" , &x , &y) , mx = max(mx , min(x , y));
if(x > y) ax[++at] = x , ay[at] = y;
else if(x < y) bx[++bt] = y , by[bt] = x;
else p = max(p , x);
}
c[0][0] = 1;
for(i = 1 ; i <= n ; i ++ )
{
c[i][0] = 1;
for(j = 1 ; j <= i ; j ++ )
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
for(i = mx ; i <= n ; i ++ )
{
at ++ , ax[at] = ay[at] = p , ans = (ans + solve(i)) % mod;
bt ++ , bx[bt] = by[bt] = p , ans = (ans - solve(i) + mod) % mod;
at -- , ans = (ans + solve(i)) % mod , bt -- ;
}
printf("%d\n" , ans);
}
return 0;
}
【uoj#209】[UER #6]票数统计 组合数+乱搞的更多相关文章
- 种树 & 乱搞
题意: 在一个(n+1)*(m+1)的网格点上种k棵树,树必须成一条直线,相邻两棵树距离不少于D,求方案数. SOL: 这题吧...巨坑无比,本来我的思路是枚举每一个从(0,0)到(i,j)的矩形,然 ...
- 【uoj#142】【UER #5】万圣节的南瓜灯 乱搞+并查集
题目描述 给出一张 $n\times m$ 的网格图,两个格子之间有一条双向边,当且仅当它们相邻,即在网格图中有一条公共边. 特殊地,对于 $1\le x\le n$ ,$(x,1)$ 和 $(x ...
- [CSP-S模拟测试]:统计(树状数组+乱搞)
题目传送门(内部题120) 输入格式 第一行,两个正整数$n,m$. 第二行,$n$个正整数$a_1,a_2,...,a_n$,保证$1\leqslant a_i\leqslant n$,可能存在相同 ...
- 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 159[Submit][Status][ ...
- BZOJ-1491 社交网络 FLoyd+乱搞
感觉这两天一直在做乱搞的题... 1491: [NOI2007]社交网络 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1279 Solved: 732 ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- BZOJ4401:块的计数(乱搞)
Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...
- BZOJ4236:JOIOJI(乱搞)
Description JOIOJI桑是JOI君的叔叔.“JOIOJI”这个名字是由“J.O.I”三个字母各两个构成的. 最近,JOIOJI桑有了一个孩子.JOIOJI桑想让自己孩子的名字和自己一样由 ...
- 洛谷P5211 [ZJOI2017]字符串(线段树+乱搞)
题面 传送门 题解 为什么大佬们全都是乱搞的--莫非这就是传说中的暴力能进队,乱搞能AC-- 似乎有位大佬能有纯暴力+玄学优化\(AC\)(不算上\(uoj\)的\(Hack\)数据的话--这要是放到 ...
随机推荐
- 程序员,Python 这次彻底上位了!
在 2018 年底,我们迎来了编程语言的最后一波洗礼.近期 TIOBE 公布了 12 月编程语言排行榜,前三名变为: Java.C.Python. 而在 PYPL 榜单上 Python 在今年 5 月 ...
- 神器 Tmux 的超绝便利
服务器的任务不间断运行,就是利用了 tmux 的特性.就是说,一般 ssh 是断开就会停止所有之前连接 ssh 期间运行的所有 processes,而 tmux 的核心业务不在于把屏幕分成几块好看,而 ...
- vs2015新功能和其他
1.自2011版本开始开发式编译器发布:Roslyn,其提供的API可以侦测dll编译过程中访问和分析编译数据,传统的编译器都是黑盒子:源代码从黑盒子的一端进入,目标文件/程序集从另一端出来. 2.最 ...
- APP性能测试中的几个重要概念
转载一篇文章,关于app性能测试的几个概念,对于想要接触app测试的朋友或许有些帮助. 我们在使用各种 App 的时候基本会关注到:这款软件挺耗流量的?运行起来设备掉电有点快嘛?切换页面的时候还会有卡 ...
- oracle数据库数据字典应用
oracle数据字典 数据字典是由oracle服务器创建和维护的一组只读的系统表.数据字典分为两类:一是基表,二是数据字典视图. 数据字典视图包括用户名.用户权限.对象名.约束和审计等信息,是通过运行 ...
- 5. 使用Flask蓝图(blueprint)
一直到现在都没有怎么写代码,可能更得比较慢. 作业回顾 先来看一下文章4的作业吧,使用logbook的时候,遇到了时区不对的情况.那么我们怎么去解决这个问题呢? 实际上logbook默认采用的是世界标 ...
- 琴声不等式--jensen
(来自百度百科) 1. 凹函数,不加权 2. 凹函数,加权 3. 凸函数,不加权 4. 凸函数,加权 应用 在EM算法Q函数的推导中,用到了第二个不等式(凹函数,加权)
- jQuery的基本使用
一.jQuery简介 jQuery是一个快速.简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动 ...
- hostname命令详解
基础命令学习目录首页 原文链接:https://idc.wanyunshuju.com/cym/68.html Linux操作系统的hostname是一个kernel变量,可以通过hostname命令 ...
- 查看jdk使用的是什么垃圾收集器
一.方法一 打印虚拟机所有参数 [root@localhost ~]# java -XX:+PrintFlagsFinal -version | grep : uintx InitialHeap ...