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. 【leetcode】923. 3Sum With Multiplicity

    题目如下: Given an integer array A, and an integer target, return the number of tuples i, j, k  such tha ...

  2. 【纪中集训】2019.08.01【NOIP提高组】模拟 A 组TJ

    T1 Description 给定一个\(N*N(N≤8)\)的矩阵,每一格有一个0~5的颜色.每次可将左上角的格子所在连通块变为一种颜色,求最少操作数. Solution IDA*=启发式迭代加深 ...

  3. SCP-Py-001

    项目编号:Py-001 项目等级:Euclid 特殊收容措施: Py-001必须被存储于基金会主站的网络硬盘中,并切断一切与互联网的连接. Py-001突破收容在网络上传播后,一旦在一台计算机上被下载 ...

  4. BN和正则化一起使用的后果

    就是因为 batch norm 过后, weight 影响没那么重了,所以 l2 weight decay 的效果就不明显了. 证明了L2正则化与归一化相结合时没有正则化效应.相反,正则化会影响权重的 ...

  5. BZOJ 4545

    bzoj 4545 给定一个踹树,支持几种操作. 本质不同子串询问 加入子树 询问字符串\(S\) 在树上的出现次数. 好码好码 重点就是维护\(parent\) 树,考虑用\(LCT\)维护此树. ...

  6. xcode Delete current line

    Delete a line like eclipse CTRL+D (tested on Xcode 4.5.1) : First of all, change these rights : sudo ...

  7. 13.JMeter 参数化、检查点、集合点

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  8. _cdecl 与 _stdcall 区别

    前段时间编程时遇到过这么一个问题,我写了一个DLL,把里面的一个函数导出来,然后再定义一个签名与其匹配的函数指针,动态地把这个DLL加载起来(LoadLibrary),得到函数指针后,一调用,结果报错 ...

  9. Cocos2d-x之Scene

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. Scene场景也是cocos2dx中必不可少的元素,游戏中通常我们需要构建不同的场景(至少一个),游戏里关卡.版块的切换也就是一个一个场景 ...

  10. os.fork()----linux

    fork() 函数,它也属于一个内建并 且只在 Linux 系统下存在. 它非常特殊普通的函数调用,一次返 回但是 fork() 调用一次,返回两次.因为操作系统自动把当前进程(称为父)复制了一份(称 ...