Codeforces Round #554 (Div. 2)自闭记
A
签到
#include<bits/stdc++.h>
using namespace std;
int n,m,s[],t[],ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x;i<=n;i++)scanf("%d",&x),s[x&]++;
for(int i=,x;i<=m;i++)scanf("%d",&x),t[x&]++;
ans=min(s[],t[])+min(s[],t[]);
printf("%d",ans);
}
B
要求40次,而log(1e6)≈20,也就是说最多20个二进制位,可以每次翻转最高的“0”位,然后再+1即可。证明:若为11...10...00,则翻转最高0位后直接结束;若为全1,也是直接结束;若后面存在1,翻转后必然存在0,使得最高位向后走。
#include<bits/stdc++.h>
using namespace std;
int n,m,tim,a[];
bool judge(int x)
{
int flag=;
for(int i=;i>=;i--)
if(x&(<<i))flag=;
else if(!flag)return ;
return ;
}
int main()
{
cin>>n;
while(!judge(n))
{
tim++;
if(tim&)
{
int flag=;
for(int i=;i>=;i--)if(n&(<<i))flag=;else if(!flag){a[++m]=i+;break;}
n^=(<<a[m]+)-;
}
else n++;
}
printf("%d\n",tim);
for(int i=;i<=m;i++)printf("%d ",a[i]);
}
C
签到,开始还看成了最大公约数,自闭。其实就是枚举差值的每个因数,暴力加一下即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,d,ans,mn;
void work(ll x)
{
ll t=(x-a%x)%x,A=a+t,B=b+t,g=A/__gcd(A,B)*B;
if(g<mn)mn=g,ans=t;
else if(g==mn&&t<ans)ans=t;
}
int main()
{
cin>>a>>b;
if(a==b){cout<<;return ;}
if(a>b)d=a-b;else d=b-a;
mn=a/__gcd(a,b)*b;
for(ll i=;i*i<=d;i++)
if(d%i==)work(i),work(d/i);
cout<<ans;
}
D
被这题搞自闭了,看到什么最大值对1e9+7取模以为是个神仙题,后来才发现是个SB贪心题,其实就是能选的边尽量选,后来证明了一下:只有一个儿子显然,有两个儿子可以证明:如果自己能选没选,那么两个儿子的边也只能选1个,还会影响后面,如果自己不能选,随机选一个是也是对的。然后可以f[i][j][0/1]表示走了i步,前缀和为j,该点与父亲的边是否被选的节点数有几个,直接暴力转移即可。
#include<bits/stdc++.h>
using namespace std;
const int N=,mod=1e9+;
int n,ans,f[*N][N][];
void add(int&x,int y){x=(x+y)%mod;}
int main()
{
scanf("%d",&n);
f[][][]=;
for(int i=;i<=*n;i++)
for(int j=;j<=n;j++)
{
int lc=n+,rc=n+;
if(j+<=*n-i-)lc=j+;
if(j)rc=j-;
if(lc>n&&rc>n)continue;
if(f[i][j][])
{
if(lc<=n&&rc<=n)add(f[i+][lc][],f[i][j][]),add(f[i+][rc][],f[i][j][]);
else if(lc<=n)add(f[i+][lc][],f[i][j][]);
else add(f[i+][rc][],f[i][j][]);
}
if(f[i][j][])
{
if(lc<=n)add(f[i+][lc][],f[i][j][]);
if(rc<=n)add(f[i+][rc][],f[i][j][]);
}
}
for(int i=;i<=*n;i++)
for(int j=;j<=n;j++)
if(f[i][j][])add(ans,f[i][j][]);
printf("%d",ans);
}
E
被D搞自闭了,E也不会了。其实这道题有一种很神奇的做法:首先当然把b[i]>c[i]的判掉,然后不难发现相邻2个值中一定一个是最大值,另一个是最小值,然后连接(n-1)条(b[i],c[i])的无向边,然后跑一遍欧拉路,若存在长度为n的欧拉路就可以输出解了。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
int n,m,cnt,tot,a[N],b[N],c[N],w[N],hd[N],v[N<<],nxt[N<<],vis[N],du[N];
map<int,int>id;
void add(int x,int y)
{
v[++cnt]=y,nxt[cnt]=hd[x],hd[x]=cnt,du[x]++;
v[++cnt]=x,nxt[cnt]=hd[y],hd[y]=cnt,du[y]++;
}
int getid(int x)
{
if(!id[x])w[id[x]=++tot]=x;
return id[x];
}
void euler(int u)
{
for(int &i=hd[u];i;i=nxt[i])
if(!vis[i>>])vis[i>>]=,euler(v[i]);
a[++m]=u;
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)scanf("%d",&b[i]);
for(int i=;i<n;i++)scanf("%d",&c[i]);
cnt=;
for(int i=;i<n;i++)
if(b[i]>c[i]){puts("-1");return ;}
else add(getid(b[i]),getid(c[i]));
int S=,num=;
for(int i=;i<=tot;i++)if(du[i]&)S=i,num++;
if(num&&num!=){puts("-1");return ;}
euler(S);
if(m!=n){puts("-1");return ;}
for(int i=;i<=n;i++)printf("%d ",w[a[i]]);
}
F
神仙题,看某AC代码写了F1,大概是f[i][j][k]表示长为i,走j步,后面覆盖集合为k的方案数,直接根据题意转移状态。后来发现F2也没意思就是一样的做法,加个矩阵快速幂就行了,不过懒得写了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+,mod=1e9+;
int n,k,m,ans,sz[],f[N][][];
int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=;i<<<m;i++)sz[i]=sz[i>>]+(i&);
f[][][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<k;j++)
for(int S=;S<<<m;S++)
if(f[i][j][S])
{
int nS=((S<<)&((<<m)-));
f[i+][j][nS]=(f[i+][j][nS]+f[i][j][S])%mod;
f[i+][j+][nS|]=(f[i+][j+][nS|]+1ll*f[i][j][S]*(sz[S]+))%mod;
}
int sum=;
for(int S=;S<(<<m);S++)sum=(sum+f[i][k][S])%mod;
ans=(ans+1ll*sum*(n-i+))%mod;
}
printf("%d",ans);
}
新号打的,初始语言默认C差评,被卡了十几分钟CE不知道,十分不爽。
result:rank95 rating+=225 now_rating=1725
Codeforces Round #554 (Div. 2)自闭记的更多相关文章
- Educational Codeforces Round 58 Div. 2 自闭记
明明多个几秒就能场上AK了.自闭. A:签到. #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- Codeforces Round #545 Div. 1自闭记
A:求出该行该列各有多少个比其小的取max,该行该列各有多少个比其大的取max,加起来即可. #include<iostream> #include<cstdio> #incl ...
- Codeforces Round #528 Div. 1 自闭记
整天自闭. A:有各种讨论方式.我按横坐标排了下然后讨论了下纵坐标单调和不单调两种情况.写了15min也就算了,谁能告诉我printf和cout输出不一样是咋回事啊?又调了10min啊?upd:突然想 ...
- Codeforces Round #526 Div. 1 自闭记
日常猝死. A:f[i]表示子树内包含根且可以继续向上延伸的路径的最大价值,统计答案考虑合并两条路径即可. #include<iostream> #include<cstdio> ...
- Codeforces Round #567 (Div. 2)自闭记
嘿嘿嘿,第一篇文章,感觉代码可以缩起来简直不要太爽 打个div2发挥都这么差... 平均一题fail一次,还调不出错,自闭了 又一次跳A开B,又一次B傻逼错误调不出来 罚时上天,E还傻逼了..本来这场 ...
- Codeforces Round #530 Div. 1 自闭记
A:显然应该让未确定的大小尽量大.不知道写了啥就wa了一发. #include<iostream> #include<cstdio> #include<cmath> ...
- Codeforces Round #525 Div. 2 自闭记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)
题目:http://codeforces.com/contest/1152/problem/C 题意:给你a,b, 你可以找任意一个k 算出a+k,b+k的最小公倍数,让最小公倍数尽量小,求出 ...
- Codeforces Round #554 (Div. 2) 1152B. Neko Performs Cat Furrier Transform
学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152B. Neko Performs Cat Furrier Transform 题目链接:"ht ...
随机推荐
- maven+springMVC(一)
[目录]
- Fragment嵌套Fragment时候。子类fragment调用父容器Fragment方法
业务场景:有的时候我们的页面可能是Activity 嵌套多个Fragment ..其中某个Fragment 又嵌套多个Fragment. 其中某个子Fragment 定义为 NewsFragmen ...
- TestLink-Windows安装教程
TestLink-Windows安装教程 QQ群交流:585499566 一.这篇文章的目的 以后工作中要使用Testlink来管理测试的流程,需要在本地或者Testlink服务器上练习使用,在个人本 ...
- 用Jenkins搭建自动构建服务
Jenkins是BS跨平台构建工具,之前名为Hundson.wiki [chs en] 最新windows安装包:下载 下文以1.593版本为例,讲述Jenkins的Windows版本的一些要注意 ...
- python之定义类创建实例
https://www.cnblogs.com/evablogs/p/6688938.html 类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 1 2 >>&g ...
- .net core 命令行(仅作记录)
命令大全:dotnet 命令 创建NuGet包:如何使用 .NET Core 命令行接口 (CLI) 工具创建 NuGet 包
- url获取整理
$_SERVER['DOCUMENT_ROOT']; //网站的根目录 echo $_SERVER['SERVER_NAME']; //当前的服务器域名 echo $_SERVER['HTTP_H ...
- #035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)
实际题目 本题要求实现一个打印非负整数阶乘的函数. 函数接口定义: void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000.如果N是非负 ...
- objective-c高级编程 笔记
引用计数:通过给对象计数标志,来判断是否释放对象 注:只能释放自己持有的对象 id obj = [NSMutableArray array] 如obj这个对象,并不是你所持有的对象,所以你无法进行释放 ...
- 03 前端篇(JS)
参考博客:http://www.cnblogs.com/yuanchenqi/articles/5980312.html JavaScript包括三部分: ECMAScript.DOM.BOM Jav ...