ARC076

C - Reconciled?

如果\(N = M\)

答案是\(2N!M!\)

如果\(|N - M| = 1\)

答案是\(N!M!\)

否则答案是0

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define MAXN 100005
  11. //#define ivorysi
  12. using namespace std;
  13. typedef long long int64;
  14. typedef unsigned int u32;
  15. typedef double db;
  16. template<class T>
  17. void read(T &res) {
  18. res = 0;T f = 1;char c = getchar();
  19. while(c < '0' || c > '9') {
  20. if(c == '-') f = -1;
  21. c = getchar();
  22. }
  23. while(c >= '0' && c <= '9') {
  24. res = res * 10 +c - '0';
  25. c = getchar();
  26. }
  27. res *= f;
  28. }
  29. template<class T>
  30. void out(T x) {
  31. if(x < 0) {x = -x;putchar('-');}
  32. if(x >= 10) {
  33. out(x / 10);
  34. }
  35. putchar('0' + x % 10);
  36. }
  37. const int MOD = 1000000007;
  38. int N,M;
  39. int fac[MAXN];
  40. int inc(int a,int b) {
  41. return a + b >= MOD ? a + b - MOD : a + b;
  42. }
  43. int mul(int a,int b) {
  44. return 1LL * a * b % MOD;
  45. }
  46. void Solve() {
  47. read(N);read(M);
  48. if(abs(N - M) > 1) {puts("0");return;}
  49. fac[0] = 1;
  50. for(int i = 1 ; i <= max(N,M) ; ++i) {
  51. fac[i] = mul(fac[i - 1],i);
  52. }
  53. int ans = mul(fac[N],fac[M]);
  54. if(N == M) {
  55. ans = mul(ans,2);
  56. }
  57. out(ans);enter;
  58. }
  59. int main() {
  60. #ifdef ivorysi
  61. freopen("f1.in","r",stdin);
  62. #endif
  63. Solve();
  64. }

D - Built?

发现横坐标排序和纵坐标排序后,只有相邻的边会有边

然后跑最小生成树即可

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define MAXN 100005
  11. //#define ivorysi
  12. using namespace std;
  13. typedef long long int64;
  14. typedef unsigned int u32;
  15. typedef double db;
  16. template<class T>
  17. void read(T &res) {
  18. res = 0;T f = 1;char c = getchar();
  19. while(c < '0' || c > '9') {
  20. if(c == '-') f = -1;
  21. c = getchar();
  22. }
  23. while(c >= '0' && c <= '9') {
  24. res = res * 10 +c - '0';
  25. c = getchar();
  26. }
  27. res *= f;
  28. }
  29. template<class T>
  30. void out(T x) {
  31. if(x < 0) {x = -x;putchar('-');}
  32. if(x >= 10) {
  33. out(x / 10);
  34. }
  35. putchar('0' + x % 10);
  36. }
  37. const int MOD = 1000000007;
  38. int N;
  39. int x[MAXN],y[MAXN];
  40. int id[MAXN],cnt,fa[MAXN];
  41. struct node {
  42. int u,v,c;
  43. }E[MAXN * 10];
  44. int getfa(int u) {
  45. return fa[u] == u ? u : fa[u] = getfa(fa[u]);
  46. }
  47. void Solve() {
  48. read(N);
  49. for(int i = 1 ; i <= N ; ++i) {read(x[i]);read(y[i]);}
  50. for(int i = 1 ; i <= N ; ++i) id[i] = i;
  51. sort(id + 1,id + N + 1,[](int a,int b) {return x[a] < x[b];});
  52. for(int i = 1 ; i < N ; ++i) {
  53. E[++cnt] = (node){id[i],id[i + 1],x[id[i + 1]] - x[id[i]]};
  54. }
  55. for(int i = 1 ; i <= N ; ++i) id[i] = i;
  56. sort(id + 1,id + N + 1,[](int a,int b) {return y[a] < y[b];});
  57. for(int i = 1 ; i < N ; ++i) {
  58. E[++cnt] = (node){id[i],id[i + 1],y[id[i + 1]] - y[id[i]]};
  59. }
  60. sort(E + 1,E + cnt + 1,[](node a,node b){return a.c < b.c;});
  61. for(int i = 1 ; i <= N ; ++i) fa[i] = i;
  62. int ans = 0;
  63. for(int i = 1 ; i <= cnt ; ++i) {
  64. if(getfa(E[i].u) != getfa(E[i].v)) {
  65. ans += E[i].c;
  66. fa[getfa(E[i].u)] = getfa(E[i].v);
  67. }
  68. }
  69. out(ans);enter;
  70. }
  71. int main() {
  72. #ifdef ivorysi
  73. freopen("f1.in","r",stdin);
  74. #endif
  75. Solve();
  76. }

E - Connected?

只有两个点都在边上的连线才有影响,我们把这些点按照顺时针(逆时针也可以)扔进栈里,栈顶元素和它相同则弹出,如果最后栈是空的就合法,否则就不合法

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define MAXN 100005
  11. //#define ivorysi
  12. using namespace std;
  13. typedef long long int64;
  14. typedef unsigned int u32;
  15. typedef double db;
  16. template<class T>
  17. void read(T &res) {
  18. res = 0;T f = 1;char c = getchar();
  19. while(c < '0' || c > '9') {
  20. if(c == '-') f = -1;
  21. c = getchar();
  22. }
  23. while(c >= '0' && c <= '9') {
  24. res = res * 10 +c - '0';
  25. c = getchar();
  26. }
  27. res *= f;
  28. }
  29. template<class T>
  30. void out(T x) {
  31. if(x < 0) {x = -x;putchar('-');}
  32. if(x >= 10) {
  33. out(x / 10);
  34. }
  35. putchar('0' + x % 10);
  36. }
  37. struct node {
  38. int x,y,p;
  39. };
  40. int R,C;
  41. int N;
  42. int x[MAXN][2],y[MAXN][2];
  43. vector<node> v[4];
  44. int sta[MAXN * 2],top;
  45. bool on_u(int x,int y) {
  46. return x == 0;
  47. }
  48. bool on_l(int x,int y) {
  49. return x != 0 && x != R && y == 0;
  50. }
  51. bool on_r(int x,int y) {
  52. return x != 0 && x != R && y == C;
  53. }
  54. bool on_d(int x,int y) {
  55. return x == R;
  56. }
  57. bool check(int x,int y) {
  58. return on_u(x,y) || on_l(x,y) || on_r(x,y) || on_d(x,y);
  59. }
  60. int id(int x,int y) {
  61. if(on_u(x,y)) return 0;
  62. else if(on_r(x,y)) return 1;
  63. else if(on_d(x,y)) return 2;
  64. else return 3;
  65. }
  66. void Solve() {
  67. read(R);read(C);read(N);
  68. for(int i = 1 ; i <= N ; ++i) {
  69. for(int j = 0 ; j <= 1 ; ++j) {read(x[i][j]);read(y[i][j]);}
  70. if(check(x[i][0],y[i][0]) && check(x[i][1],y[i][1])) {
  71. v[id(x[i][0],y[i][0])].pb((node){x[i][0],y[i][0],i});
  72. v[id(x[i][1],y[i][1])].pb((node){x[i][1],y[i][1],i});
  73. }
  74. }
  75. sort(v[0].begin(),v[0].end(),[](node a,node b){return a.y < b.y;});
  76. sort(v[1].begin(),v[1].end(),[](node a,node b){return a.x < b.x;});
  77. sort(v[2].begin(),v[2].end(),[](node a,node b){return a.y > b.y;});
  78. sort(v[3].begin(),v[3].end(),[](node a,node b){return a.x > b.x;});
  79. for(int i = 0 ; i < 4 ; ++i) {
  80. for(auto t : v[i]) {
  81. if(sta[top] == t.p) --top;
  82. else sta[++top] = t.p;
  83. }
  84. }
  85. if(top) puts("NO");
  86. else puts("YES");
  87. }
  88. int main() {
  89. #ifdef ivorysi
  90. freopen("f1.in","r",stdin);
  91. #endif
  92. Solve();
  93. }

F - Exhausted?

线段树维护hall定理,好像之前遇到过类似的但是没有写这个做法。。。

hall定理是什么呢

\(X,Y\)为两边的点集,\(X\)和\(Y\)之间存在完美匹配,仅当\(X\)中任意\(k\)个点组成的点集和\(Y\)中的至少\(k
\)个点相连

这是充分必要的

那么我们求的是人数-最大匹配,也就是每个点集减去匹配\(Y\)点集椅子个数的最大值,初始的答案先设成\(max(N - M,0)\)

设点集大小为\(|X|\),匹配\(Y\)点集的椅子数是\(\Gamma(X)\)

答案显然不小于\((|X| - |\Gamma(X)|)_{max}\)

如果答案大于\((|X| - |\Gamma(X)|)_{max}\),设\(t > (|X| - |\Gamma(X)|)_{max}\),如果当前存在一个大于t的未匹配点,那么选这t个点一定与对面至少一个点相连,设为\(v\),若v被匹配,找到匹配点u,u与这t个点组成的点集匹配至少两个点,所以可以增加一个匹配点,可以证明答案不大于\((|X| - |\Gamma(X)|)_{max}\)

所以只要考虑怎么求\((|X| - |\Gamma(X)|)_{max}\)

显然是对于一个固定的区间,计算多少个点的\(L_{i},R_{i}\)覆盖了这个区间,所以把区间按左端点排序,然后线段树维护即可

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define MAXN 200005
  11. //#define ivorysi
  12. using namespace std;
  13. typedef long long int64;
  14. typedef unsigned int u32;
  15. typedef double db;
  16. template<class T>
  17. void read(T &res) {
  18. res = 0;T f = 1;char c = getchar();
  19. while(c < '0' || c > '9') {
  20. if(c == '-') f = -1;
  21. c = getchar();
  22. }
  23. while(c >= '0' && c <= '9') {
  24. res = res * 10 +c - '0';
  25. c = getchar();
  26. }
  27. res *= f;
  28. }
  29. template<class T>
  30. void out(T x) {
  31. if(x < 0) {x = -x;putchar('-');}
  32. if(x >= 10) {
  33. out(x / 10);
  34. }
  35. putchar('0' + x % 10);
  36. }
  37. int N,M;
  38. struct node {
  39. int l,r;
  40. }p[MAXN];
  41. struct seg_tree {
  42. int l,r;
  43. int lz,mx;
  44. }tr[MAXN * 4];
  45. void update(int u) {
  46. tr[u].mx = max(tr[u << 1 | 1].mx,tr[u << 1].mx);
  47. }
  48. void addlz(int u,int v) {
  49. tr[u].mx += v;tr[u].lz += v;
  50. }
  51. void pushdown(int u) {
  52. if(tr[u].lz) {
  53. addlz(u << 1,tr[u].lz);
  54. addlz(u << 1 | 1,tr[u].lz);
  55. tr[u].lz = 0;
  56. }
  57. }
  58. void build(int u,int l,int r) {
  59. tr[u].l = l;tr[u].r = r;
  60. if(l == r) {
  61. tr[u].mx = r;
  62. return;
  63. }
  64. int mid = (l + r) >> 1;
  65. build(u << 1,l,mid);
  66. build(u << 1 | 1,mid + 1,r);
  67. update(u);
  68. }
  69. void Change(int u,int l,int r,int v) {
  70. if(tr[u].l == l && tr[u].r == r) {addlz(u,v);return;}
  71. pushdown(u);
  72. int mid = (tr[u].l + tr[u].r) >> 1;
  73. if(r <= mid) Change(u << 1,l,r,v);
  74. else if(l > mid) Change(u << 1 | 1,l,r,v);
  75. else {Change(u << 1,l,mid,v);Change(u << 1 | 1,mid + 1,r,v);}
  76. update(u);
  77. }
  78. int Query(int u,int l,int r) {
  79. if(tr[u].l == l && tr[u].r == r) {return tr[u].mx;}
  80. pushdown(u);
  81. int mid = (tr[u].l + tr[u].r) >> 1;
  82. if(r <= mid) return Query(u << 1,l,r);
  83. else if(l > mid) return Query(u << 1 | 1,l,r);
  84. else return max(Query(u << 1,l,mid),Query(u << 1 | 1,mid + 1,r));
  85. }
  86. void Solve() {
  87. read(N);read(M);
  88. for(int i = 1 ; i <= N ; ++i) {
  89. read(p[i].l);read(p[i].r);
  90. }
  91. build(1,1,M + 1);
  92. sort(p + 1,p + N + 1,[](node a,node b){return a.l < b.l || (a.l == b.l && a.r > b.r);});
  93. int ans = max(0,N - M);
  94. for(int i = 1 ; i <= N ; ++i) {
  95. Change(1,p[i].l + 1,p[i].r,1);
  96. int t = Query(1,p[i].l + 1,M + 1) - M - p[i].l - 1;
  97. ans = max(ans,t);
  98. }
  99. out(ans);enter;
  100. }
  101. int main() {
  102. #ifdef ivorysi
  103. freopen("f1.in","r",stdin);
  104. #endif
  105. Solve();
  106. }

【AtCoder】ARC076的更多相关文章

  1. 【AtCoder】ARC092 D - Two Sequences

    [题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...

  2. 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring

    [题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...

  3. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  4. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  5. 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

    [题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...

  6. 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分

    [题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...

  7. 【AtCoder】ARC095 E - Symmetric Grid 模拟

    [题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...

  8. 【Atcoder】AGC022 C - Remainder Game 搜索

    [题目]C - Remainder Game [题意]给定n个数字的序列A,每次可以选择一个数字k并选择一些数字对k取模,花费2^k的代价.要求最终变成序列B,求最小代价或无解.n<=50,0& ...

  9. 【Atcoder】AGC 020 B - Ice Rink Game 递推

    [题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...

随机推荐

  1. 浅谈2017noip信息奥赛普及组试题

    [话前叨叨] 一些日常刷题策略(转载): PS:本题的题目信息来自洛谷平台 下面就是进入正题了(其实这也是我第一次在csdn写博客,所以写的不好的地方也请大家多多谅解和提点/微笑/) 一.score ...

  2. UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset

    UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...

  3. 【翻译】Chemkin - Chapter 1

    [这段文字是2013年3月翻译的,整理老文档时发现就拿出来,提醒我们:任何试图翻译英文手册的尝试都是徒劳的] 第一章   介绍 Chemkin理论手册提供了一个对关系和公式的宽泛的概览,这些关系和公式 ...

  4. linux ln 命令使用参数详解(ln -s 软链接)

    ln是linux中一个非常重要的命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  5. IPFS环境安装

    IPFS是一个分布式的P2P的协议,可能会取代这个http,全球的点都可能存储这个数据 IPFS搭建环境 1.首先是下载节点软件到官网下载windows版本的ipfs节点软件,如果不能访问官网的话,可 ...

  6. 关于const修饰指针

    const修饰指针,一般分为如下四种情况: int b = 500; const int *a = &b;   //情况1 int const *a = &b //        2 ...

  7. liunx 安装jdk1.8

    采用解压压缩文件形式安装 第一步:将jdk压缩文件上传至home目录下面 第二步:目录切换至/usr目录下   cd /usr 创建java目录   mkdir   java 第三步:将jdk 压缩文 ...

  8. Windows添加.NET Framework 3.0 NetFx3 失败 - 状态为:0x800f0950

    原文链接:https://answers.microsoft.com/zh-hans/insider/forum/all/win10-dism%E9%94%99%E8%AF%AF-0x800f0950 ...

  9. Confluence 6 设置 Oracle 数据库准备

    请查看 Supported Platforms 页面来获得 Confluence 系统支持的 Oracle 数据库版本.你需要在安装 Confluence 之前升级你的 Oracle 数据库. 如果你 ...

  10. python并发编程之IO模型,

    了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...