题目来源于牛客竞赛:https://ac.nowcoder.com/acm/contest/discuss
题目描述:

输入描述:

输出描述:

示例1:

题解:

代码:

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>using namespace std;
using namespace __gnu_pbds;#define fi first
#define se second
#define mp make_pair
#define pb push_backtypedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<int> vi;
typedef unsigned long long ull;
typedef long double ld;
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;vector<int> fact;
vector<int> ifact;
vector<int> inv;
vector<int> pow2;
const int MOD = (1e9 + 7);
int add(int a, int b)
{a+=b;while(a>=MOD) a-=MOD;return a;
}
int mult(int a, int b)
{return (a*1LL*b)%MOD;
}
int modpow(int a, int b)
{int r=1;while(b){if(b&1) r=mult(r,a);a=mult(a,a);b>>=1;}return r;
}
int choose(int a, int b)
{if(a<b) return 0;if(b==0) return 1;if(a==b) return 1;return mult(fact[a],mult(ifact[b],ifact[a-b]));
}
int inverse(int a)
{return modpow(a,MOD-2);
}
void init(int _n)
{fact.clear(); ifact.clear(); inv.clear(); pow2.clear();fact.resize(_n+1);ifact.resize(_n+1);inv.resize(_n+1);pow2.resize(_n+1);pow2[0]=1;ifact[0]=1;fact[0]=1;for(int i=1;i<=_n;i++){pow2[i]=add(pow2[i-1],pow2[i-1]);fact[i]=mult(fact[i-1],i);//ifact[i]=mult(ifact[i-1],inv[i]);}ifact[_n] = inverse(fact[_n]);for(int i=_n-1;i>=1;i--){ifact[i] = mult(ifact[i + 1], i + 1);}for(int i=1;i<=_n;i++){inv[i] = mult(fact[i-1],ifact[i]);}
}int cnt[13];
vi v;
vi perm;void dfs(int u)
{if(cnt[u]>=3) return ;cnt[u]++;v[perm[u]]=min(v[perm[u]],v[u]+1);dfs(perm[u]);
}int solve_naive(vi t)
{int n=t.size();for(int i=0;i<n;i++){if(t[i]==-1) t[i]=int(1e9);}perm.resize(n);set<vi> S;for(int i=0;i<n;i++) perm[i]=i;do{v=t;memset(cnt,0,sizeof(cnt));for(int i=0;i<n;i++){if(cnt[i]==0) dfs(i);}sort(v.begin(),v.end());for(int i=0;i<n;i++){if(v[i]>=int(1e9)) v[i]=-1;assert(v[i]<10000);}//for(int x:v) cerr<<x<<' ';//cerr<<'\n';S.insert(v);}while(next_permutation(perm.begin(),perm.end()));return S.size();
}const int C = 200;
int dp[C+2][C+2][C+2]; //cur node, sum, last, # of badvoid radd(int &a, int b)
{a=add(a,b);
}int solve_fast(vi t)
{memset(dp,0,sizeof(dp));vi cnt(C,0);vi pref(C,0);int n=t.size();for(int i=0;i<t.size();i++){if(t[i]==-1) t[i]=C-1;assert(t[i]>=0&&t[i]<C);cnt[t[i]]++;}for(int i=1;i<C;i++) pref[i]=cnt[i]+pref[i-1];dp[0][0][0]=1;for(int i=0;i<C;i++){for(int j=0;j<=n;j++){for(int k=0;k<=n;k++){if(dp[i][j][k]==0) continue;int v=dp[i][j][k];for(int c=0;j+c<=n;c++){int realc = cnt[i+1];int newbad=j-pref[i];if(c>=realc){//need to borrow from front//we need c-realc more to hook with the frontint needed=c-realc;if(k<needed) continue;//exist >= needed to hook with//# of bad person increases by needednewbad+=needed;}else{//need to finally "use up the needed ones"int extra = realc-c;if(extra>newbad) continue;//extra<=lnewbad-=extra;}radd(dp[i+1][j+c][c],v);}}}}int ans=0;for(int k=0;k<=n;k++){radd(ans,dp[C-1][n][k]);}return ans;
}void read_solve()
{int n; cin>>n;vi t(n);for(int i=0;i<n;i++) cin>>t[i];//int naive = solve_naive(t);int fast = solve_fast(t);cout<<fast<<'\n';
}void gen_solve()
{int n = rand()%8+1;vi t(n);int p=rand()%100+1;int C=rand()%6+1;for(int i=0;i<n;i++){t[i]=rand()%C+1;if(rand()%100<=p) t[i]=-1;}int naive = solve_naive(t);cerr<<"NAIVE : "<<naive<<'\n';int fast = solve_fast(t);cerr<<"FAST : "<<fast<<'\n';if(naive!=fast){freopen("birthday-wishes.in","w",stdout);cout<<n<<'\n';for(int i=0;i<n;i++){cout<<t[i]<<' ';}cout<<'\n';exit(0);}
}int main()
{ios_base::sync_with_stdio(0); cin.tie(0);init(123333);read_solve();
}

更多问题,更详细题解可关注牛客竞赛区,一个刷题、比赛、分享的社区。
传送门:https://ac.nowcoder.com/acm/contest/discuss

题解 | Birthday Reminders-2019牛客暑期多校训练营第九场F题相关推荐

  1. 2020牛客暑期多校训练营(第九场)E题 Groundhog Chasing Death

    题意 计算 ∏ i = a b ∏ j = c d g c d ( x i , y j ) \prod_{i=a}^{b}\prod_{j=c}^{d}gcd(x^i,y^j) i=a∏b​j=c∏d ...

  2. [题解] 2019牛客暑期多校第三场H题 Magic Line

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...

  3. 2019牛客暑期多校训练营(第一场场)_I题Points Division(线段树+DP维护区间最大值)

    题目链接: https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点的坐标为(xi,yi),有两个权值ai,bi. 现在要你将它分成A,B两部分, ...

  4. 2019牛客暑期多校训练营(第五场)C generator 2 (BSGS)

    2019牛客暑期多校训练营(第五场)C generator 2 思路 x0=x0x_0 = x_0x0​=x0​ x1=a∗x0∗bx_1 = a * x_0 * bx1​=a∗x0​∗b x2=a∗ ...

  5. 2019牛客暑期多校训练营(第四场)----E- triples II

    首先发出题目链接: 链接:https://ac.nowcoder.com/acm/contest/884/E 来源:牛客网 涉及:位运算,容斥定义,dp 点击这里回到2019牛客暑期多校训练营解题-目 ...

  6. 2019牛客暑期多校训练营(第三场)H.Magic Line

    2019牛客暑期多校训练营(第三场)H.Magic Line 题目链接 题目描述 There are always some problems that seem simple but is diff ...

  7. 2021牛客暑期多校训练营2,签到题CDFKI

    2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...

  8. 2019牛客暑期多校训练营(第一场)

    传送门 参考资料: [1]:官方题解(提取码:t050 ) [2]:标程(提取码:rvxr ) [3]:牛客题解汇总 A.Equivalent Prefixes(单调栈) •题意 定义两个数组 u,v ...

  9. 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...

  10. 【2019牛客暑期多校训练营(第二场) - D】Kth Minimum Clique(bfs,tricks)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/D 来源:牛客网 Given a vertex-weighted graph with N vertice ...

最新文章

  1. as3自定义加载图片类
  2. 目标检测之线段检测---lsd line segment detector
  3. Zabbix Linux 客户端安装
  4. 一个小老板从小公司创业开始做起的过程记录
  5. 研发项目管理中需注意的人性弱点(Z)
  6. Android 动画效果及Interpolator和AnimationListener的使用
  7. 以表达式作为参数传入SQL的存储过程中去
  8. Java 8中的StringJoiner与String.join的示例
  9. 谷歌爬虫ua_Python爬虫,实战爬取腾讯视频评论!
  10. python基础学习笔记(十二)
  11. 清翔电子单片机原理图stc89c52_1000. 电子编程入门到工程师--从看得到开始
  12. 10月份出版图书《玩转虚拟机基于VMware+Windows》
  13. zynq文档阅读之GPIO的中断
  14. 用户名 不在 sudoers 文件中。此事将被报告。
  15. linux打印重定向并打印机,将虚拟打印机的输出重定向到Python脚本
  16. ping 丢包 网络摄像头_ping丢包故障处理方法
  17. maximo跟java_Maximo7.5远程调用maximo的手动输入节点工作流
  18. 屏幕背光的PWM控制
  19. Loki 学习总结(1)—— Loki 中小项目日志系统的不二之选
  20. 初始C语言——成绩等级划分

热门文章

  1. C# 中通过CancellationTokenSource实现对超时任务的取消
  2. 读博与怠工(在北航硕博连读)——转载
  3. Unity简单麻将胡牌算法
  4. Everything+Wox介绍和使用方式
  5. Crate 数据库安装与使用
  6. iOS常见错误1-SQLite错误-SQLITE_CANTOPEN,SQLITE_MISUSE和SQLITE_BUSY
  7. Android 应用多开/分身检测
  8. 单片机延时程序分析(汇编详细版)
  9. 闲鱼上卖什么东西一年赚了18万?
  10. 翻转单词顺序(python)