首页 > 其他分享 >atcoder regular 176 (ARC176) A、B题解

atcoder regular 176 (ARC176) A、B题解

时间:2024-04-22 14:14:55浏览次数:24  
标签:atcoder const int 题解 LL long regular include col

 

A

很容易有一个错误想法,就是行从1~n,列从1~n拿,这样,第三个样例,最后,第7行,第7列,需要都增加两个数,但是(7,7)这个位置只能有一个数。

我的做法是优先队列/set队列,每次选择行、列之中当前已经有的数目最少的(这样它们最需要添加),这样能保证,行列需要添加的,不会出现只能选择多个行列一样的情况。因为优先队列的特性,剩下需要添加2个数的行/列肯定是优先被选取,它在需要添加1个数的行/列之前。

用set的话,删除一个数,要在遍历完这些数再删,

看到有3分钟做完这道题的……

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <cstdbool>
  6 #include <string>
  7 #include <algorithm>
  8 #include <iostream>
  9 #include <sstream>
 10 #include <ctime>
 11 #include <stack>
 12 #include <vector>
 13 #include <queue>
 14 #include <set>
 15 #include <map>
 16 #include <array>
 17 #include <bitset>
 18 using namespace std;
 19 #define LL long long
 20 #define ULL unsigned long long
 21 
 22 const LL mod_1=1e9+7;
 23 const LL mod_2=998244353;
 24 
 25 const double eps_1=1e-5;
 26 const double eps_2=1e-10;
 27 
 28 const int maxn=1e5+10;
 29 
 30 int row[maxn], col[maxn];
 31 set<pair<int,int> > choose_col;
 32 map<pair<int,int>, int > cannot;
 33 
 34 int main()
 35 {
 36     int n,m,x,y,i,j,k,geshu;
 37     set<pair<int,int> >::iterator z;
 38     memset(row,0,sizeof(row));
 39     memset(col,0,sizeof(col));
 40     cannot.clear();
 41     choose_col.clear();
 42 
 43     scanf("%d%d",&n,&m);
 44 
 45     printf("%d\n",n*m);
 46 
 47     for (i=1;i<=m;i++)
 48     {
 49         scanf("%d%d",&x,&y);
 50         row[x]++;
 51         col[y]++;
 52         cannot[make_pair(x,y)]=1;
 53         printf("%d %d\n",x,y);
 54     }
 55 
 56     for (j=1;j<=n;j++)
 57         if (col[j]!=m)
 58             choose_col.insert(make_pair(col[y], j));
 59 
 60     for (i=1;i<=n;i++)
 61     {
 62         for (j=1;j<=m-row[i];j++)
 63         {
 64             for (z=choose_col.begin();z!=choose_col.end();z++)
 65             {
 66                 geshu = z->first;
 67                 k = z->second;
 68                 if (cannot[ make_pair(i, k) ]==0)
 69                 {
 70                     choose_col.erase(make_pair(geshu, k) );
 71                     cannot[make_pair(i, k)]=1;
 72                     col[k]++;
 73                     if (col[k]!=m)
 74                         choose_col.insert(make_pair(geshu+1, k));
 75 
 76                     break;
 77                 }
 78 
 79             }
 80             printf("%d %d\n",i, k);
 81         }
 82     }
 83 
 84 
 85     return 0;
 86 }
 87 /*
 88 1 1
 89 1 1
 90 
 91 ======
 92 
 93 1 0
 94 
 95 ======
 96 
 97 4 0
 98 
 99 ======
100 
101 4 1
102 2 3
103 */
View Code

 

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <cstdbool>
  6 #include <string>
  7 #include <algorithm>
  8 #include <iostream>
  9 #include <sstream>
 10 #include <ctime>
 11 #include <stack>
 12 #include <vector>
 13 #include <queue>
 14 #include <set>
 15 #include <map>
 16 #include <array>
 17 #include <bitset>
 18 using namespace std;
 19 #define LL long long
 20 #define ULL unsigned long long
 21 
 22 const LL mod_1=1e9+7;
 23 const LL mod_2=998244353;
 24 
 25 const double eps_1=1e-5;
 26 const double eps_2=1e-10;
 27 
 28 const int maxn=1e5+10;
 29 
 30 int row[maxn], col[maxn];
 31 set<pair<int,int> > choose_col;
 32 map<pair<int,int>, int > cannot;
 33 
 34 int main()
 35 {
 36     int n,m,x,y,i,j,k,geshu;
 37     set<pair<int,int> >::iterator z;
 38     memset(row,0,sizeof(row));
 39     memset(col,0,sizeof(col));
 40     cannot.clear();
 41     choose_col.clear();
 42 
 43     scanf("%d%d",&n,&m);
 44 
 45     printf("%d\n",n*m);
 46 
 47     for (i=1;i<=m;i++)
 48     {
 49         scanf("%d%d",&x,&y);
 50         row[x]++;
 51         col[y]++;
 52         cannot[make_pair(x,y)]=1;
 53         printf("%d %d\n",x,y);
 54     }
 55 
 56     for (j=1;j<=n;j++)
 57         if (col[j]!=m)
 58             choose_col.insert(make_pair(col[y], j));
 59 
 60     for (i=1;i<=n;i++)
 61     {
 62         for (j=1;j<=m-row[i];j++)
 63         {
 64             for (z=choose_col.begin();z!=choose_col.end();z++)
 65             {
 66                 geshu = z->first;
 67                 k = z->second;
 68                 if (cannot[ make_pair(i, k) ]==0)
 69                     break;
 70             }
 71             printf("%d %d\n",i, k);
 72             choose_col.erase(make_pair(geshu, k) );
 73             cannot[make_pair(i, k)]=1;
 74 
 75             col[k]++;
 76             if (col[k]!=m)
 77                 choose_col.insert(make_pair(geshu+1, k));
 78         }
 79         //cout<<"ok"<<endl;
 80     }
 81 
 82 
 83     return 0;
 84 }
 85 /*
 86 1 1
 87 1 1
 88 
 89 ======
 90 
 91 1 0
 92 
 93 ======
 94 
 95 4 0
 96 
 97 ======
 98 
 99 4 1
100 2 3
101 */
View Code

 

 

B

把数字都看成2进制分析。

其实这道题比A好写得多。

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <cstdbool>
 6 #include <string>
 7 #include <algorithm>
 8 #include <iostream>
 9 #include <sstream>
10 #include <ctime>
11 #include <stack>
12 #include <vector>
13 #include <queue>
14 #include <set>
15 #include <map>
16 #include <array>
17 #include <bitset>
18 using namespace std;
19 #define LL long long
20 #define ULL unsigned long long
21 
22 const LL mod_1=1e9+7;
23 const LL mod_2=998244353;
24 
25 const double eps_1=1e-5;
26 const double eps_2=1e-10;
27 
28 const int maxn=2e5+10;
29 
30 LL xs[4]={6,2,4,8};
31 
32 int main()
33 {
34     LL T,n,k,m,r,restn, loop, cnt_zero;
35     cin>>T;
36     while (T--)
37     {
38         cin>>n>>m>>k;
39         r=m-k;
40 
41         if (m==k+1)
42         {
43             ///2^n % 2^k
44             if (n<k)
45                 cout<<xs[n%4]<<endl;
46             else
47                 cout<<0<<endl;
48             continue;
49         }
50         if (n<m)
51         {
52             cout<<xs[n%4]<<endl;
53             continue;
54         }
55 
56         restn = n-m;
57 
58         loop = restn / r;
59         cnt_zero = n - r * loop;
60         if (cnt_zero>=m)
61             cnt_zero -= r;
62 
63         cout<<xs[cnt_zero%4]<<endl;
64     }
65 
66     return 0;
67 }
68 /*
69 7 5 4
70 3 5 4
71 4 5 4
72 4 5 3
73 1 5 3
74 
75 1 2 1
76 1 3 2
77 
78 
79 10 6 2
80 */
View Code

 

标签:atcoder,const,int,题解,LL,long,regular,include,col
From: https://www.cnblogs.com/cmyg/p/18150519

相关文章

  • P1637 题解
    一道绿写2.5h,我是什么效率哥。Solution提供一种不使用线段树/树状数组的方法。前置知识:分治,二分,前缀和。考虑分治。我们假设有一个分治函数solve(l,r)可以统计区间\([l,r]\)中的thair。对于一个区间\([l,r]\)中的thair\(=\{a_i,a_j,a_k|i<j<k\) 且\(a_......
  • AtCoder Beginner Contest 350 G - Mediator
    链接:https://atcoder.jp/contests/abc350/tasks/abc350_g大致题意:给出n个点,q个询问1号询问要求u,v之前加一条无向边图始终是一个森林2号询问询问是否有一个点与u,v都相邻,若有则输出该点,若无则输出0。询问强制在线。思路:在题目要求的图中,满足2号询问的点只有三种情况:要么这个......
  • P8207 [THUPC2022 初赛] 最小公倍树 题解
    题目大意有编号为\([L,R]\)区间的点,连接两个点\(x,y\)边权的为\(LCM(x,y)\),求这张图的最小生成树。\[1\leqL\leqR\leq10^6,R-L\leq10^5\]解题思路我们有一个结论:对于张图\(G\)中的一个生成子图\(E\),\(E\)之中的一条边\(k\)如果不在\(E\)最小生成树中,那么\(......
  • P7431【THUPC2017】小 L 的计算题 (牛顿恒等式)(分治NTT)(多项式求逆)题解
    知识点涉及:牛顿恒等式,分治\(NTT\),多项式求逆。这道题有一个推式子之后分治\(NTT+Ln+Exp\)的做法,不过也有一个不用\(Ln+Exp\)的做法(理论常数要小点,实际差不多)。题解:这道题可以牛顿恒等式直接推出一个非常好写的东西。首先看一下牛顿恒等式的描述:对于\(n\)次多项式\(A(......
  • CF1067E Random Forest Rank 题解
    这道题涉及了组合分析和概率。本质上,当以一定的概率从给定的树中删除边时,您需要找到结果林的邻接矩阵的期望秩。要解决这个问题,可以使用动态规划。我们用\(f(u,v)\)表示当删除边\((u,v)\)时,由以顶点\(v\)为根的子树中的顶点形成的林的期望秩。这里,\(u\)和\(v\)是树中的......
  • 2024年GPLT团体程序设计比赛L2-D吉利矩阵题解
    只能说比赛时前期做得太慢了,后面导致题目只能捞点分数(IOI赛制),当时这道题是我不剪枝DFS拿了4分,压线拿铜牌!考完试一做,发现是个大水题(bushi)主要原理:DFS(深度优先搜索)+剪枝名言:学搜索核心就是学剪枝废话不说了,见代码点击查看代码//原理:DFS+剪枝#include<bi......
  • AtCoder Beginner Contest 350
    B-DentistAoki难度:⭐题目大意现在有数列1~n,现在有m次操作,每次给出一个x,如果x存在就是删去,不存在就加上;问最后数列还剩多少个;解题思路数据很小,暴力就行;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio......
  • Atcoder ABC 350 全题解
    题外话别以为博主之前几场ABC都咕咕咕了,最近状态不好,这次ABC终于回来了(也有可能是题目变容易了,有图为证)P.S.请耐心看到最后!!否则后果自负!!!AB这年头谁不会AB啊当然有。不学OI的人。C考虑选择排序,依次将$1,2,3\cdots$与它们应该在的位置进行交换。那如果真的......
  • 题解:CF17D Notepad
    由于首位不能是\(0\),因此首位有\(b-1\)种可能性。其他\(n-1\)位有\(b^{n-1}\)种可能。因此这些数总计\((b-1)b^{n-1}\)每页\(c\)个数,求最后一页有多少个数,即求\(\text{ans}=(b-1)b^{n-1}\quad\bmodc\)注意到题目中\(b,n\)都非常大,采用扩展欧拉定理进行降......
  • [ZJOI2019] 语言 题解
    不愧是\(ZJOI\),《最可做的一道题》都让人一头雾水……首先将问题转化到链上。可以将总共的组数转化为每个点可以到达的城市。明显给每个点建一棵动态开点线段树,维护可以和他通商的点。很明显,可以通商的点的标号连续的一段。我们可以将可以将每一次传播语言的工作当作区间修改......