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的更多相关文章

  1. 【AtCoder】ARC093

    C - Traveling Plan 相当于一个环,每次删掉i点到两边的距离,加上新相邻的两个点的距离 代码 #include <bits/stdc++.h> #define fi fir ...

  2. AtCoder整理(持续更新中……)

    做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...

  3. ARC093 F - Dark Horse

    https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 先钦定\(1\)号站在第一个位置上,那么他第一轮要和\((2)\)打,第二轮要和\((3,4) ...

  4. ARC093 F Dark Horse——容斥

    题目:https://atcoder.jp/contests/arc093/tasks/arc093_d #include<cstdio> #include<cstring> ...

  5. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  6. AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识

    链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...

  7. AtCoder Regular Contest 082

    我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...

  8. AtCoder Regular Contest 069 D

    D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...

  9. AtCoder Regular Contest 076

    在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了. 任意门 C - Reconciled? 题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方 ...

随机推荐

  1. 前端学习(二十八)es6&ajax(笔记)

    ES6    let    块级作用域    const    解构赋值    字符串拼接    扩展运算符    ------------------------------------------ ...

  2. java容器中 哪些是线程安全的

    容器中线程安全的如:vectory,hashtable,非线程安全的如:hashmap,arrylist等.      对于原定义非线程的容器如:hashmap,arraylist可以使用Collec ...

  3. 【leetcode】940. Distinct Subsequences II

    题目如下: Given a string S, count the number of distinct, non-empty subsequences of S . Since the result ...

  4. HashMap常见面试题

    1.HashMap底层是通过什么来实现的? 在JDK1.7中是通过数组+链表来实现的: 在JDK1.8中是通过数组+链表+红黑树来实现的 2.HashMap在JDK1.8中为什么使用红黑树? 为了弥补 ...

  5. 【Flutter学习】基本组件之上下刷新列表(一)

    一,概述 RefreshIndicator是Flutter基于Material设计语言内置的控件,集合了下拉手势.加载指示器和刷新操作一体,可玩性比FutureBuilder差了一大截,不过大家也用过 ...

  6. Python之-异常处理

    1.python中处理异常的方式 #coding:utf8 filename=raw_input("请输入你要操作的文件") try: f=open(filename) print ...

  7. centos6 sersync2使用

    接收端rsyncd搭建 http://www.cnblogs.com/hanxiaohui/p/8675409.html 推送端sersync2使用 安装 源码包D:\share\src\sersyn ...

  8. I/O 优化

    数字的读入优化: /* I/O * Au: GG */ #include <cstdio> #include <cstdlib> #include <cmath> ...

  9. python selenium 自动化流程的一些总结与思考

    首先要考虑的项目为什么要做自动化测试?(主要从自动化测试的优点着手) 其次是什么项目才适合做自动化测试? 自动化测试覆盖率要达到什么样的程度?因为都知道不可能达到100%的,不然脚本太臃肿,反而会失去 ...

  10. CSS 设置鼠标显示形状

    CSS 设置鼠标显示形状 <style type="text/css"><!-- span {display:block;line-height:30px;mar ...