Atcoder arc093
D-Grid Components
在一个100*100的网格图上染色,问黑格四连通块的个数为A,白格四连通块的个数为B的一种构造方案?(A,B<=500)
将整个平面分成50*100的两部分,分别以黑白为背景,一块背景算一个连通块,然后在一种背景上用另一种颜色上去点彩,连通块大小为1,无八连通。
#include<bits/stdc++.h>
using namespace std;
int a,b;
int main()
{
scanf("%d%d",&a,&b);
a--;b--;
puts("100 100");
for (int i=;i<=;i++)
{
for (int j=;j<=;j++)
if (i%==&&j%==&&a>) printf("."),a--;
else printf("#");
puts("");
}
for (int i=;i<=;i++)
{
for (int j=;j<=;j++)
if (i%==&&j%==&&b>) printf("#"),b--;
else printf(".");
puts("");
}
return ;
}
E-Bichrome Spanning Tree
在一张图上黑白染色,使得所有同时包含有黑白边的最小生成树权值恰好为X。问有多少种染色方法?
讨论一下嘛,设原树的mst值为sum。若sum>X,答案为0。
若sum=X,那么设原树所有最小生成树的边集为S,只要其中不全为同色边,一定存在一棵黑白mst,答案为(2^(m-|S|))*(2^|S|-2)。
若sum<X。那么S中的边一定都是同色边。考虑加入一条异色边,包含这条异色边的mst一定只包含这条异色边。换边求mst法。定义w[i]为在mst上强加i这条边的贡献=该边权-链上最大。当sum+w[i]<X时,必须同色。当sum+w[i]=X时,至少有一条边要和之前的同色块不同色,有z个。当sum+w[i]>X时,随便染色,有t个。答案为(2^t)*((2^z)-1)*2。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
const int mod=1e9+;
struct node{int u,v,w;}e[N<<];
struct _node{int to,next,w;}num[N<<];
int cnt,head[N],n,m,fa[N][],dep[N],Max[N][],f[N],tag[N<<],t1,t2;
ll sum,x;
bool operator < (const node &A,const node &B) {return A.w<B.w;}
int find(int x) {return x==f[x]?x:f[x]=find(f[x]);}
void add(int x,int y,int w)
{num[++cnt].to=y;num[cnt].next=head[x];num[cnt].w=w;head[x]=cnt;}
void mst()
{
sort(e+,e+m+);
for (int i=;i<=n;i++) f[i]=i;
for (int i=;i<=m;i++)
if (find(e[i].u)!=find(e[i].v))
sum+=e[i].w,f[find(e[i].u)]=find(e[i].v),tag[i]=,add(e[i].u,e[i].v,e[i].w),add(e[i].v,e[i].u,e[i].w);
}
void dfs(int x)
{
for (int i=head[x];i;i=num[i].next)
if (num[i].to!=fa[x][])
{
dep[num[i].to]=dep[x]+;
fa[num[i].to][]=x;
Max[num[i].to][]=num[i].w;
dfs(num[i].to);
}
}
void init()
{
for (int j=;j<=;j++)
for (int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-],Max[i][j]=max(Max[i][j-],Max[fa[i][j-]][j-]);
}
int jump(int x,int y)
{
if (dep[x]<dep[y]) swap(x,y);
int del=dep[x]-dep[y],ans=;
for (int i=;i<=;i++)
if (del&(<<i)) ans=max(ans,Max[x][i]),x=fa[x][i];
if (x==y) return ans;
for (int i=;i>=;i--)
if (fa[x][i]!=fa[y][i]) ans=max(ans,Max[x][i]),ans=max(ans,Max[y][i]),x=fa[x][i],y=fa[y][i];
return max(max(ans,Max[x][]),Max[y][]);//一不小心把Max写成fa了!
}
int ksm(int x,int y)
{
int res=;
for (;y;x=(ll)x*x%mod,y>>=)
if (y&) res=(ll)res*x%mod;
return res;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%lld",&x);
for (int i=;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
mst();
if (sum>x) return puts(""),;
else{
dfs();init();
for (int i=;i<=m;i++)
if (!tag[i])
{
int t=jump(e[i].u,e[i].v);
if (e[i].w-t==x-sum) t1++;
else if (e[i].w-t>x-sum) t2++;
}
if (x==sum) printf("%lld\n",((ll)ksm(,t2)*(ksm(,t1+n-)-+mod)%mod)%mod);
else printf("%lld\n",(ll)ksm(,t2)*(ksm(,t1)-+mod)%mod*%mod);
}
return ;
}
F-Dark Horse
一共有2^n个数。每次相邻两个pk。给你一个数组A,如果x=1,y=Ai,那么y赢,否则1赢。其他的都是较小的赢。问最后剩下的数为1的方案数?n<=16。
固定1在第一个位置,其他情况都是可以转换的,最后*2^n。那么1最后剩下来当且仅当[2,2],[3,4],[5,8],[9,16],...这些区间中的最小值都不是A中元素。
可以容斥。dp[i][j]表示放进了i个数,j表示有哪几个区间的最小值已经被确定。
从大到小枚举元素:1.该元素不作为某个区间的最小值,dp[i][j]<-dp[i-1][j]。2.该元素成为k区间的最小值,用比当前元素大的未被使用的元素填满该区间。
dp[i][j|(1<<k)]<-dp[i][j]*C(Max-a[i]-j,(1<<k)-1)*jc[1<<k].那么dp[n][i]*jc[(1<<n)-i-1]就是至少有popcount(i)个区间最小值为A中元素,容斥。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+;
typedef long long ll;
const int N=;
int jc[N],inv[N],n,m,ans,Max,num,dp[][N],a[N];
void up(int &x,int y) {x=((ll)x+y)%mod;}
int calc(int x){int res=;while (x) x-=(x&(-x)),res++;return res;}
void init()
{
jc[]=jc[]=inv[]=inv[]=;
for (int i=;i<Max;i++) jc[i]=(ll)jc[i-]*i%mod,inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
for (int i=;i<Max;i++) inv[i]=(ll)inv[i]*inv[i-]%mod;
}
int C(int n,int m)
{
if (n<m) return ;
return (ll)jc[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++) scanf("%d",&a[m-i+]);//从大到小
Max=<<n;init();
dp[][]=;
for (int i=;i<=m;i++)
for (int j=;j<Max;j++)
if (dp[i-][j])
{
up(dp[i][j],dp[i-][j]);
for (int k=;k<n;k++)
if (!(j&(<<k)))
up(dp[i][j|(<<k)],(ll)C(Max-a[i]-j,(<<k)-)*jc[<<k]%mod*dp[i-][j]%mod);
}
for (int i=;i<Max;i++)
{
num=calc(i);
if (num&) up(ans,(mod-(ll)dp[m][i]*jc[Max-i-]%mod)%mod);
else up(ans,(ll)dp[m][i]*jc[Max-i-]%mod);
}
printf("%lld\n",(ll)ans*Max%mod);
return ;
}
Atcoder arc093的更多相关文章
- 【AtCoder】ARC093
C - Traveling Plan 相当于一个环,每次删掉i点到两边的距离,加上新相邻的两个点的距离 代码 #include <bits/stdc++.h> #define fi fir ...
- AtCoder整理(持续更新中……)
做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...
- ARC093 F - Dark Horse
https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 先钦定\(1\)号站在第一个位置上,那么他第一轮要和\((2)\)打,第二轮要和\((3,4) ...
- ARC093 F Dark Horse——容斥
题目:https://atcoder.jp/contests/arc093/tasks/arc093_d #include<cstdio> #include<cstring> ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识
链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...
- AtCoder Regular Contest 082
我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...
- AtCoder Regular Contest 069 D
D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...
- AtCoder Regular Contest 076
在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了. 任意门 C - Reconciled? 题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方 ...
随机推荐
- 【转】Git的安装与使用
Git作为分布式的版本控制器有其独特的优势,可以不依赖与网络而进行版本控制,而SVN则必须有网才可以.今天咱们不讨论Git与SVN的具体区别.咱们先看看Git这个分布式版本控制器是怎么玩的.下面的内容 ...
- jvm主要组成部分及其作用
1.类加载器(Class Loader):加载类文件到内存.Class loader只管加载,只要符合文件结构就加载,至于能否运行,它不负责,那是有Exectution Engine 负责的. 2.执 ...
- mac 格式化U盘
作者:Bailm链接:https://www.zhihu.com/question/27888608/answer/486347894来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- hdu 1402 A * B Problem Plus (FFT模板)
A * B Problem Plus Problem Description Calculate A * B. Input Each line will contain two integers A ...
- sql 基础语法 alter用法和视图,透视
--查询没有被删除的学生 alter table StuInfo --修改列属性 alter column isdelete bit null alter table StuInfo --删除列 dr ...
- Python基础(一):程序输入输出、判断合法用户、编写判断成绩的程序
一.程序输入输出 目标: 编写login.py脚本,实现以下目标: 提示用户输入用户名 将用户名保存在变量中 在屏幕上显示欢迎用户的信息 方案: 编写程序时,很多情况下都需要程序与用户交互.在pyth ...
- element-ul 处理 组件内的弹出框close问题
<el-dialog custom-class="rental-pop" :close-on-click-modal="false" :append-to ...
- oracle服务端导出/导入方式expdp/impdp
1. expdp导出步骤 1.1 用sys管理员登录sqlplus [root@hxjk_test_mysql_redis_file oracle]# sqlplus SQL*Plus: Releas ...
- mybatis的sqlprovider用法扩展自定义sql
SqlProvider使用 public class MemberRewardSqlProvider { private static final Logger log = LoggerFactory ...
- (转)Git 提交的正确姿势:Commit message 编写指南
Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交. $ git commit -m "hello world" 上面代码的-m参数,就是用来 ...