【bestcoder #35】AB题解

DZY Loves Balls

Accepts: 371

Submissions: 988

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

问题描述

一个盒子里有。DZY现在想知道,’01’在串中出现的期望次数。

输入描述

输入有多组测试数据。 ()每行两个整数,

输出描述

对于每个测试数据,输出一行答案,格式为(互质)。

输入样例

1 12 3

输出样例

1/26/5

Hint

Case 1: S=’01’ or S=’10’, 所以期望次数 = 1/2Case 2: S=’00011′ or S=’00101′ or S=’00110′ or S=’01001′ or S=’01010′ or S=’01100′ or S=’10001′ or S=’10010′ or S=’10100′ or S=’11000′,所以期望次数 = (1+2+1+2+2+1+1+1+1+0)/10 = 12/10 = 6/5

排列组合。

一共有C(n+m,n)种排列。

01出现的次数:枚举01的位置然后计算其他位置的摆放方案数(n+m-1)*C(n+m-2,n-1)

期望(n+m-1)*C(n+m-2,n-1)/C(n+m,n)=(n*m)/(n+m)

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace std;int main(){int n,m;while (scanf("%d%d",&n,&m)!=EOF){int k=__gcd(n*m,n+m);cout<<n*m/k<<"/"<<(n+m)/k<<endl;}return 0;}

DZY Loves Topological Sorting

Accepts: 112

Submissions: 586

Time Limit: 4000/2000 MS (Java/Others)

Memory Limit: 131072/131072 K (Java/Others)

问题描述

一张有向图的拓扑序列是图中点的一个排列,满足对于图中的每条有向边之前。现在,DZY有一张有向无环图(DAG)。你要在最多删去条边之后,求出字典序最大的拓扑序列。

输入描述

输入有多组数据。 ()第一行,三个正整数 .接下来.

输出描述

对于每组测试数据,输出一行字典序最大的拓扑序列。

输入样例

5 5 21 24 52 43 42 33 2 01 21 3

输出样例

5 3 1 2 41 3 2

Hint

数据1. 删除(2->3),(4->5)两条边,可以得到字典序最大的拓扑序列:(5,3,1,2,4).

(思路并不难的一道题,可是我在结束的前15分钟才想出来正解。。写出来了没调对。。)

首先计算出每个点的度数。

使拓扑序最大的数字就是当前度数<=k的最大数字,k-=他的度数,他所连得点度数减1。

然后重复这个过程。

问题就变成了查找<=k的最大数字,,在线段树中维护区间最小值,直接二分就可以了。

修改的复杂度是O(mlogn),查询的复杂度是O(nlogn),总复杂度O((m+n)logn)

注意:此题不写读入优化就TLE了。。

#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cmath>#define inf 0x3f3f3f3fusing namespace std;int cnt,tot,h[150005],d[150005],n,m,k;struct edge{int y,ne;}e[150005];struct Segtree{int l,r,m;}a[500000];void read(int &tmp){tmp=0;int fu=1;char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar())if (ch=='-') fu=-1;for (;ch>='0'&&ch<='9';ch=getchar())tmp=tmp*10+ch-'0';tmp*=fu;}void Addedge(int x,int y){e[++tot].y=y;e[tot].ne=h[x];h[x]=tot;d[y]++;}void P(int x){if (a[x<<1].m<a[(x<<1)+1].m) a[x].m=a[x<<1].m;else a[x].m=a[(x<<1)+1].m;}void Build(int x,int l,int r){a[x].l=l,a[x].r=r;if (l==r){a[x].m=d[l];return;}int m=(l+r)>>1;Build(x<<1,l,m);Build((x<<1)+1,m+1,r);P(x);}int Find(int x,int k){if (a[x].l==a[x].r)return a[x].l;if (a[(x<<1)+1].m<=k) return Find((x<<1)+1,k);return Find(x<<1,k);}void M(int x,int y,int k){if (a[x].l==a[x].r){a[x].m+=k;return;}int m=(a[x].l+a[x].r)>>1;if (y<=m) M(x<<1,y,k);else M((x<<1)+1,y,k);P(x);}int main(){while (scanf("%d%d%d",&n,&m,&k)!=EOF){tot=0;for (int i=1;i<=n;i++)d[i]=0,h[i]=0;int x,y;for (int i=1;i<=m;i++){read(x),read(y);Addedge(x,y);}Build(1,1,n);for (int i=1;i<=n;i++){x=Find(1,k);k-=d[x];M(1,x,inf);d[x]=inf;if (i==1) printf("%d",x);else printf(" %d",x);for (int j=h[x];j;j=e[j].ne)if (d[e[j].y]!=inf)M(1,e[j].y,-1),d[e[j].y]–;}printf("\n");}return 0;}

积极思考造成积极人生,消极思考造成消极人生。

【bestcoder #35】AB题解

相关文章:

你感兴趣的文章:

标签云: