A. Kyoya and Colored Balls

大意: 给定$k$种颜色的球, 第$i$种颜色有$c_i$个, 一个合法的排列方案满足最后一个第$i$种球的下一个球为第$i+1$种球, 求合法方案数.

简单组合, 添加第$i$种时必须在最后放一个$i$, 剩余任意放, 可重组合算下贡献即可.

#include <iostream>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
using namespace std;
typedef long long ll;
const int P = 1e9+7, P2 = 998244353, INF = 0x3f3f3f3f;
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
const int N = 1e6+10;
int n, fac[N], ifac[N];
int C(int n, int m) {if (m>n) return 0;int t = (ll)fac[n]*ifac[m]%P*ifac[n-m]%P;return t;
}
int main() {fac[0]=ifac[0]=1;REP(i,1,N-1) fac[i]=(ll)fac[i-1]*i%P;ifac[N-1] = inv(fac[N-1]);PER(i,1,N-2) ifac[i]=(ll)ifac[i+1]*(i+1)%P;scanf("%d", &n);int ans = 1, sum = 0;REP(i,1,n) {int t;scanf("%d", &t);ans = (ll)ans*C(sum+t-1,t-1)%P;sum += t;}printf("%d\n", ans);
}

B. Kyoya and Permutation

大意: 定义了一种对排列的操作, 若一个排列操作后不变则为一个好排列, 求第$k$个好排列.

找下规律发现每个好排列的每个置换大小不超过2, 且大小为2的置换两个数要相邻.

所以可以得到$n$的好排列个数$F(n)$是满足递推$F(1)=1,F(2)=2,F(n)=F(n-1)+F(n-2)$.

#include <iostream>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;typedef long long ll;
int n;
ll f[100], k;int main() {f[0] = 1, f[1] = 1;REP(i,2,88) f[i]=f[i-1]+f[i-2];scanf("%d%lld", &n, &k);REP(i,1,n) {if (k<=f[n-i]) printf("%d ",i);else {k -= f[n-i];printf("%d %d ", i+1, i);++i;}}puts("");
}

C. Love Triangles

大意: 给定$n$节点$m$条边无向图, 每条边为0或1, 求补全为完全图, 且任意一个三元环的三条边恰好全1或恰好一个1的方案数.

显然确定两边后第三条边就已经固定了, 所以可以检验出每个连通块是否合法, 假设共cnt个连通块, 答案就是$2^{cnt-1}$.

#include <iostream>
#include <cstdio>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
using namespace std;
typedef long long ll;
const int N = 1e6+10, P = 1e9+7;
int n, m, ans, vis[N];
struct _ {int to,w;};
vector<_> g[N];
void dfs(int x) {for (_ e:g[x]) {if (vis[e.to]==-1) {vis[e.to] = vis[x]^e.w;dfs(e.to);}else if (vis[e.to]!=(vis[x]^e.w)) ans = 0;}
}
int main() {scanf("%d%d", &n, &m);while (m--) {int u, v, w;scanf("%d%d%d", &u, &v, &w);g[u].pb({v,!w}),g[v].pb({u,!w});}memset(vis,-1,sizeof vis);ans = (P+1)/2;REP(i,1,n) if (vis[i]==-1) {vis[i] = 1, ans = (ll)ans*2%P, dfs(i);}printf("%d\n", ans);
}

D Nudist Beach

大意: 给定$n$节点$m$条边无向图, 标记了$k$个点. 要求从未标记的点中选出一个点集$S$, 每个点的价值是$\frac{A}{B}$, $A$为相邻的选中的点, $B$为相邻所有点, 整个点集的价值为所有点价值的最小值. 求$S$价值的最大值.

01分数规划问题, 转为二分答案即可.

#include <iostream>
#include <cstdio>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;const double eps = 1e-8;
const int N = 1e5+10;
int n, m, k;
int deg[N], vis[N], cnt[N], used[N];
vector<int> g[N];
queue<int> q;
int chk(double x) {REP(i,1,n) cnt[i] = 0;REP(i,1,n) if (!vis[i]) { used[i] = 1;for (int j:g[i]) ++cnt[j];}REP(i,1,n) if (cnt[i]<x*deg[i]) q.push(i);while (q.size()) {int u = q.front(); q.pop();if (!used[u]) continue;used[u] = 0;for (int v:g[u]) if (--cnt[v]<x*deg[v]) q.push(v);}int tot = 0;REP(i,1,n) tot += used[i];return tot;
}int main() {scanf("%d%d%d", &n, &m, &k);REP(i,1,k) {int t;scanf("%d", &t);vis[t] = 1;}REP(i,1,m) {int u, v;scanf("%d%d", &u, &v);g[u].push_back(v),g[v].push_back(u);++deg[u],++deg[v];}double l = -eps, r = 1, ans;REP(i,1,200) {double mid = (l+r)/2;if (chk(mid)) ans=mid,l=mid+eps;else r=mid-eps;}chk(ans);int tot = 0;REP(i,1,n) tot += used[i];printf("%d\n", tot);REP(i,1,n) if (used[i]) printf("%d ", i);puts("");
}

E.

转载于:https://www.cnblogs.com/uid001/p/10952290.html

Codeforces Round #309 (Div. 1)相关推荐

  1. Codeforces Round #309 (Div. 2) A. Kyoya and Photobooks 字符串水题

    A. Kyoya and Photobooks Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

  2. Codeforces Round #309 (Div. 1)D. Nudist Beach 二分+bfs

    题目:http://codeforces.com/contest/553/problem/D 在一个无向图中,有若干坏点,选择一个不包含坏点的集合,使得集合中p值最小的点的p值最大.一个点的p值=集合 ...

  3. Codeforces Round #309 (Div. 2) C

    题意: 就是给出总共同拥有k种颜色.每种颜色有ki种,排列必须满足第i+1种的最后一种颜色必须在第i种最后一种颜色的后面,其它颜色任意.总共同拥有多少种排列点的方法. 分析: 如果d[i]表示前i种的 ...

  4. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  5. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  6. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  7. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  8. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  9. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

最新文章

  1. sp MySQL 导入_mysql数据导入redis
  2. 诺基亚7原生android,【IT之家出品】诺基亚7快速上手体验:蔡司镜头回归,原生Android味...
  3. boost::qvm::deduce_quat相关的测试程序
  4. Objective-c 创建类的使用
  5. oracle控制文件全备失败,Oracle数据库案例整理-恢复数据库失败-主备机控制文件所在目录不同...
  6. 信息学奥赛一本通(2028:【例4.14】百钱买百鸡)
  7. fcpx调整图层_【FCPX萌新系列】新手常遇到的4个基础调色问题
  8. nyoj-488-素数环
  9. 超级终端连接华为交换机_Win8系统如何使用超级终端连接华为交换机?
  10. 如何正确的寻找电影资源
  11. 成都11区+4县+5市高分辨率边界kml
  12. 蓝桥杯python组——明码
  13. 斯坦福大学自然语言处理第四课“语言模型(Language Modeling)”
  14. 沪牌学院-沪拍拍课堂4: 实拍前的演练
  15. Linq中Skip和Take用法(TakeWhile和SkipWhile用法)
  16. ICTCLAS代码学习笔记之CSpan类
  17. 王者荣耀: 史上最长对局, 无法打破的神话英雄, 10小时4千人头
  18. 前端开发工程师 - 02.JavaScript程序设计 - 第2章.进阶篇
  19. 【Web】1326- 深入浅出 Web Audio API
  20. 大数据背景下网络信息安全分析探讨

热门文章

  1. 《欧美剧集观看最佳索引》(US SHOWS GUIDE) 【2005-12-27 转verycd】
  2. 手机上看杂志 谁借道谁沾光?
  3. uni-app中本次登录完成后下次登录自动填入用户名和密码
  4. facebook新功能:资讯标签
  5. python如何判断小数_python中怎么识别判断是否是小数?
  6. 生成类似激活码的代码(C#)
  7. 利用百度api实现ocr识别发票
  8. mysql数据库中count的作用_详解 MySQL中count函数的正确使用方法
  9. 程序员自我修养-目标文件
  10. ASP.NET CausesValidation 属性