Warning: session_start(): open(/tmp/sess_20132c3b0dd713c98a9caab4c8c5f2bf, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430
Writing /data/wiki/data/cache/4/43994124a9168f34c03db2ff7cd35d94.captchaip failed

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:manespace:codeforces_round_644_div3 [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:manespace:codeforces_round_644_div3

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
2020-2021:teams:manespace:codeforces_round_644_div3 [2020/05/26 20:57]
iuiou [E]
2020-2021:teams:manespace:codeforces_round_644_div3 [2020/05/26 21:29] (当前版本)
iuiou
行 25: 行 25:
 题解:由1产生的特征,不难发现若非最后一行且非最右边一行出现1,则必有该点右边或者下边必定至少有一个1,因为1不可能凭空产生。将其作为合法的条件即可。代码略。 题解:由1产生的特征,不难发现若非最后一行且非最右边一行出现1,则必有该点右边或者下边必定至少有一个1,因为1不可能凭空产生。将其作为合法的条件即可。代码略。
  
 +===== F =====
 +题意:给定n个字符串,求一个字符串,使该字符串满足,与任意一个字符串都有按位不同的字符不超过1个。
 +
 +题解:这题居然卡了1个小时,<​del>​我不做人啦</​del>​,范围很小,以第一个字符串为基准,枚举即可,每次改变第一个字符串的一个位置的字符。
 +
 +<​hidden>​
 +<code c++>
 +#include <​bits/​stdc++.h>​
 +using namespace std;
 +char s[500][500];​
 +char ans[500];
 +int t,n,m;
 +bool check()
 +{
 + for(int i=1;​i<​=n;​i++)
 + {
 + int cnt=0;
 + for(int j=1;​j<​=m;​j++)
 + {
 + if(s[i][j]!=ans[j])
 + {
 + cnt++;
 + if(cnt>​=2) return false;
 + }
 + }
 + }
 + return true;
 +}
 +int main()
 +{
 + scanf("​%d",&​t);​
 + while(t--)
 + {
 + int yes=0;
 + scanf("​%d%d",&​n,&​m);​
 + for(int i=1;​i<​=n;​i++)
 + {
 + scanf("​%s",​s[i]+1);​
 + }
 +
 + for(int i=1;​i<​=m;​i++)
 + {
 + for(int j=1;​j<​=m;​j++) ans[j]=s[1][j];​
 + for(int j='​a';​j<​='​z';​j++)
 + {
 + ans[i]=j;​
 + if(check())
 + {
 + yes=1;
 +     break;
 + }
 + }
 + if(yes) {
 + break;}
 + }
 + if(yes)
 + {
 + for(int i=1;​i<​=m;​i++) printf("​%c",​ans[i]);​
 + puts(""​);​
 + }
 + else printf("​-1\n"​);​
 + }
 +}
 +</​code>​
 +</​hidden>​
 +
 +===== G =====
 +题意:给定义1个$n*m$的矩阵,初始全为0,问有没有每一种填充1的方案,能满足每一行都有$a$个1,且每一列都有$b$个1。
 +
 +题解:要满足根据数量关系一定有$m*a=n*b$,值就可以用作判断成不成立的条件。若成立,考虑一种构造方案,从第1列开始,每次在向右填充1,若填满了则从改行的第一个开始填充起,每填满a个则换行,这样构造出来的矩阵一定是合法的(<​del>​别问为啥,问就是观察法</​del>​)
 +
 +<​hidden>​
 +<code c++>
 +#include <​bits/​stdc++.h>​
 +using namespace std;
 +char s[100][100];​
 +int main()
 +{
 + int t,n,m,a,b;
 + scanf("​%d",&​t);​
 + while(t--)
 + {
 + memset(s,'​0',​sizeof(s));​
 + scanf("​%d%d%d%d",&​n,&​m,&​a,&​b);​
 + if(n*a!=m*b)
 + {
 + printf("​NO\n"​);​
 + continue;​
 + }
 + for(int j=0,​i=0;​i<​n;​i++)
 + {
 + for(int k=1;​k<​=a;​j++,​k++)
 + {
 + s[i][j%m]='​1';​
 + }
 + }
 + printf("​YES\n"​);​
 + for(int i=0;​i<​n;​i++)
 + {
 + for(int j=0;​j<​m;​j++) printf("​%c",​s[i][j]);​
 + puts(""​);​
 + }
 + }
 + ​} ​
 +</​code>​
 +</​hidden>​
 +
 +===== H =====
 +题意:定义长度为m的01字符串,其按照字典序排序,去除给定的$n$个字符串后,问最中间的字符串(即第$\lfloor\frac{n-1}{2}\rfloor$位)是哪一个。
 +
 +题解:观察字符串由01组成,立刻就能想到2进制,可以考虑把所给数全部转化为十进制数,问题即转化为求一系列数中位数问题,可以二分去做,一定要注意边界条件(每次check小于等于目标的数,只是检查小于目标的数会wa……),要不然会死也调不出来……。然后最后注意要转化为2进制输出,缺0补齐。
 +
 +<​hidden>​
 +<code c++>
 +#include <​bits/​stdc++.h>​
 +using namespace std;
 +typedef long long ll;
 +ll a[400];
 +int n,t,m;
 +char s[400];
 +int ans[400];
 +bool check(ll x) { //​检查是否为中位数
 + ll res=x+1;//​小于等于x的数(为了去除等于x的数)
 + for(int i=1; i<=n; i++) {
 + if(a[i]<​=x) {
 + res--;
 + }
 + }
 + return res>​=((1ll<<​m)-1-n)/​2+1;​
 +}
 +int main() {
 + scanf("​%d",&​t);​
 + while(t--) {
 + scanf("​%d%d",&​n,&​m);​
 + memset(a,​0,​sizeof(a));​
 + memset(ans,​0,​sizeof(ans));​
 + for(int i=1; i<=n; i++) {
 + scanf("​%s",​s);​
 + for(int j=0; s[j]; j++) a[i]=1ll*a[i]*2+s[j]-'​0';​
 + }
 + ll l=0,​r=1ll<<​m;​
 + while(l<​r) {
 + ll mid=(l+r)>>​1;​
 + if(check(mid)) r=mid;
 + else l=mid+1;
 + }
 + int cnt=0;
 + while(l) {
 + ans[++cnt]=l%2;​
 + l/=2;
 + }
 + for(int i=m; i>=1; i--) printf("​%d",​ans[i]);​
 + puts(""​);​
 + }
 +}
 +</​code>​
 +</​hidden>​
2020-2021/teams/manespace/codeforces_round_644_div3.1590497831.txt.gz · 最后更改: 2020/05/26 20:57 由 iuiou