居然补完了

组合 A - Far Relative’s Birthday Cake

import java.util.*;
import java.io.*; public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner (new BufferedInputStream (System.in));
int n = cin.nextInt ();
int[] col = new int[105];
String str;
long ans = 0;
for (int i=0; i<n; ++i) {
str = cin.next ();
int num = 0;
for (int j=0; j<str.length (); ++j) {
if (str.charAt (j) == 'C') {
col[j]++; num++;
}
}
ans += num * (num - 1) / 2;
}
for (int i=0; i<n; ++i) ans += col[i] * (col[i] - 1) / 2;
System.out.println (ans);
}
}

枚举 B - Far Relative’s Problem

import java.util.*;
import java.io.*; public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner (new BufferedInputStream (System.in));
int n = cin.nextInt ();
String[] sex = new String[5005];
int[] btime = new int[5005];
int[] etime = new int[5005];
for (int i=0; i<n; ++i) {
sex[i] = cin.next ();
btime[i] = cin.nextInt ();
etime[i] = cin.nextInt ();
}
int ans = 0;
for (int i=1; i<=366; ++i) {
int male = 0, female = 0;
for (int j=0; j<n; ++j) {
if (i >= btime[j] && i <= etime[j]) {
if (sex[j].charAt (0) == 'M') male++;
else female++;
}
}
if (male < female) {
if (male * 2 > ans) ans = male * 2;
}
else {
if (female * 2 > ans) ans = female * 2;
}
}
System.out.println (ans);
}
}

DP C - Famil Door and Brackets

题意:n长的字符串有‘(’和‘)’组成,现在已知其中m长的字串,问满足任意前缀字串‘(’数量不小于‘)’数量且最后两者数量相等的原字符串的方案数。

分析:‘(’看作+1,‘(’看作-1。dp[i][j]表示前i个字符,和为j(j >= 0)的方案数,然后枚举m字符串前的字符个数p,那么m后q的个数也知道,根据总和为0可以得到前后组合,这里dp[n-m-i][j+now]用到对称思想。

import java.util.*;
import java.io.*; public class Main {
public static final int MOD = 1000000007;
public static void main(String[] args) {
Scanner cin = new Scanner (new BufferedInputStream (System.in));
Main ma = new Main ();
int n = cin.nextInt ();
int m = cin.nextInt ();
char[] str = cin.next ().toCharArray ();
long[][] dp = new long[2005][2005];
dp[0][0] = 1;
for (int i=1; i<=n-m; ++i) {
for (int j=0; j<=i; ++j) {
if (j > 0) {
dp[i][j] = ma.add (dp[i][j], dp[i-1][j-1]);
}
dp[i][j] = ma.add (dp[i][j], dp[i-1][j+1]);
}
}
int mn = 10000000;
int now = 0;
for (int i=0; i<m; ++i) {
if (str[i] == '(') now++;
else now--;
if (now < mn) mn = now;
}
long ans = 0;
for (int i=0; i<=n-m; ++i) {
for (int j=0; j<=i; ++j) {
if (j + mn >= 0 && j + now <= n - m - i) {
ans = ma.add (ans, dp[i][j] * dp[n-m-i][j+now] % MOD);
}
}
}
System.out.println (ans);
}
public long add(long a, long b) {
a += b;
if (a >= MOD) a -= MOD;
return a;
}
}
线段树+DP D - Babaei and Birthday Cake
题意:求最大上升序列和
分析:dp[i] 表示前i得到的最大上升序列和,dp[i] = dp[j] + vol[i] (vol[i] > vol[j])。用线段树优化动态统计前rk[i] - 1的最大值即dp[j],rk[i]是vol[i]离散化后的排名。
#include <bits/stdc++.h>

#define lson l, mid, o << 1
#define rson mid + 1, r, o << 1 | 1
const double PI = acos (-1.0);
const int N = 1e5 + 5;
struct Segment_Tree {
double v[N<<2], mx[N<<2];
void push_up(int o) {
mx[o] = std::max (mx[o<<1], mx[o<<1|1]);
}
void build(int l, int r, int o) {
if (l == r) {
v[o] = mx[o] = 0;
return ;
}
int mid = l + r >> 1;
build (lson); build (rson);
push_up (o);
}
void updata(int p, double x, int l, int r, int o) {
if (l == r && l == p) {
v[o] = mx[o] = x;
return ;
}
int mid = l + r >> 1;
if (p <= mid) updata (p, x, lson);
else updata (p, x, rson);
push_up (o);
}
double query(int ql, int qr, int l, int r, int o) {
if (ql <= l && r <= qr) {
return mx[o];
}
int mid = l + r >> 1; double ret = 0;
if (ql <= mid) ret = std::max (ret, query (ql, qr, lson));
if (qr > mid) ret = std::max (ret, query (ql, qr, rson));
return ret;
}
};
double dp[N];
int r[N], h[N];
double vol[N], V[N]; int main(void) {
int n; scanf ("%d", &n);
for (int i=0; i<n; ++i) {
scanf ("%d%d", r + i, h + i);
vol[i] = PI * r[i] * r[i] * h[i];
V[i] = vol[i];
}
std::sort (V, V+n);
Segment_Tree st;
st.build (1, n, 1);
for (int i=0; i<n; ++i) {
int pos = std::lower_bound (V, V+n, vol[i]) - V + 1;
if (pos == 1) dp[i] = vol[i];
else dp[i] = st.query (1, pos - 1, 1, n, 1) + vol[i];
st.updata (pos, dp[i], 1, n, 1);
}
double ans = 0;
for (int i=0; i<n; ++i) {
if (ans < dp[i]) ans = dp[i];
}
printf ("%.10f\n", ans); return 0;
}

LCA + DP + DFS E - Famil Door and Roads

题意:加一条边,使形成简单环(无重边),u和v在其中的方案数

分析:加一条边一定是从u或v引出一条边到w而且w能到另一个点。无重边就是w不能选择u到v路径上的点。

  dep[u]:根节点1到u的距离   sz[u]:u的子树包括u的结点数  sdown[u]:在u的子树下到u的距离和,树形dp

  sall[u]:所有点到u的距离和,由sdown[u]得到,也是树形DP

  一共有3种情况:1.LCA (u, v) == v,除v子树外所有点到v的距离和/点数 + u子树所有点到u的距离 / 点数

          2.LCA (v, u) == u,同1

          3.除1,2的情况,只能在u或v的子树选择一节点才能构成环,u子树所有点到u的距离 / 点数 + v子树所有点到v的距离 / 点数

  最后还要加上不变的距离 dis (u, v) + 1。学习大牛的代码,获益匪浅

#include <bits/stdc++.h>

const int N = 1e5 + 5;
const int D = 20;
std::vector<int> G[N];
int dep[N], sz[N];
long long sdown[N], sall[N];
int rt[N][D];
int n, m; void DFS(int u, int fa) { //get rt[v][0], sdown[u] and dep[v]
sdown[u] = 0; sz[u] = 1;
for (int i=0; i<G[u].size (); ++i) {
int v = G[u][i];
if (v == fa || dep[v] != 0) continue;
rt[v][0] = u;
dep[v] = dep[u] + 1;
DFS (v, u);
sdown[u] += sdown[v] + sz[v];
sz[u] += sz[v];
}
} void DFS2(int u, int fa) { //get sall[v]
for (int i=0; i<G[u].size (); ++i) {
int v = G[u][i];
if (v == fa) continue;
sall[v] = sall[u] + n - 2 * sz[v];
DFS2 (v, u);
}
} void init_LCA(void) {
for (int i=1; i<D; ++i) {
for (int j=1; j<=n; ++j) {
rt[j][i] = rt[j][i-1] == 0 ? 0 : rt[rt[j][i-1]][i-1];
}
}
} int up(int u, int d) {
for (int i=D-1; i>=0; --i) {
if (d < (1 << i)) continue;
u = rt[u][i]; d -= (1 << i);
}
return u;
} int LCA(int u, int v) {
if (dep[u] < dep[v]) std::swap (u, v);
for (int i=0; i<D; ++i) {
if ((dep[u] - dep[v]) >> i & 1) {
u = rt[u][i];
}
}
if (u == v) return u;
for (int i=D-1; i>=0; --i) {
if (rt[u][i] != rt[v][i]) {
u = rt[u][i];
v = rt[v][i];
}
}
return rt[u][0];
} int main(void) {
scanf ("%d%d", &n, &m);
for (int u, v, i=0; i<n-1; ++i) {
scanf ("%d%d", &u, &v);
G[u].push_back (v);
G[v].push_back (u);
}
dep[1] = 0;
DFS (1, 0);
sall[1] = sdown[1];
DFS2 (1, 0);
init_LCA ();
while (m--) {
int u, v; scanf ("%d%d", &u, &v);
int lca = LCA (u, v);
double ans = dep[u] + dep[v] - 2 * dep[lca] + 1;
if (lca == v || lca == u) {
if (lca == u) std::swap (u, v);
int v2 = up (u, dep[u] - dep[v] - 1);
long long supv = sall[v] - sdown[v2] - sz[v2];
ans += 1.0 * supv / (n - sz[v2]) + 1.0 * sdown[u] / sz[u];
}
else {
ans += 1.0 * sdown[u] / sz[u] + 1.0 * sdown[v] / sz[v];
}
printf ("%.12f\n", ans);
} return 0;
}

  

Codeforces Round #343 (Div. 2)的更多相关文章

  1. Codeforces Round #343 (Div. 2) C. Famil Door and Brackets dp

    C. Famil Door and Brackets 题目连接: http://www.codeforces.com/contest/629/problem/C Description As Fami ...

  2. Codeforces Round #343 (Div. 2) B. Far Relative’s Problem 暴力

    B. Far Relative's Problem 题目连接: http://www.codeforces.com/contest/629/problem/B Description Famil Do ...

  3. Codeforces Round #343 (Div. 2) E. Famil Door and Roads

    题目链接: http://www.codeforces.com/contest/629/problem/E 题解: 树形dp. siz[x]为x这颗子树的节点个数(包括x自己) dep[x]表示x这个 ...

  4. Codeforces Round #343 (Div. 2) C. Famil Door and Brackets

    题目链接: http://codeforces.com/contest/629/problem/C 题意: 长度为n的括号,已经知道的部分的长度为m,现在其前面和后面补充‘(',或')',使得其长度为 ...

  5. Codeforces Round #343 (Div. 2) B

    B. Far Relative’s Problem time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  6. Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp

    E. Famil Door and Roads 题目连接: http://www.codeforces.com/contest/629/problem/E Description Famil Door ...

  7. Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp

    D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...

  8. Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake 水题

    A. Far Relative's Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/A Description Do ...

  9. Codeforces Round #343 (Div. 2) D - Babaei and Birthday Cake 线段树+DP

    题意:做蛋糕,给出N个半径,和高的圆柱,要求后面的体积比前面大的可以堆在前一个的上面,求最大的体积和. 思路:首先离散化蛋糕体积,以蛋糕数量建树建树,每个节点维护最大值,也就是假如节点i放在最上层情况 ...

随机推荐

  1. 用jquery怎么实现点击显示,再一次点击隐藏

    html代码: <button>点击</button> <div class="div"></div> css代码: <sty ...

  2. ios cell左滑删除

    iOS项目开发小技能 (三) -UITableView实现Cell左划删除等自定义功能 www.MyException.Cn  网友分享于:2015-06-05  浏览:0次   iOS项目开发小技巧 ...

  3. 奶牛健美操(codevs 3279)

    题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点 ...

  4. 瞧一瞧迷一般的SQLDA

    With static SQL, host variables used in embedded SQL statements are known at application compile tim ...

  5. 学习JNDI

    既然datasource对象有tomcat提供,那么我们如何在应用程序中获得它呢,tomcat把这个对象放在JNDI服务中, 并用一个名字把它关联起来,我们在应用程序中,只需通过JNDI搜索这个名字, ...

  6. Loadrunner之API测试

    //API函数 web_submit_data web_custom_request   //支持https请求 web_set_sockets_option("SSL_VERSION&qu ...

  7. Delphi面向对象---接口

    从Delphi3开始支持接口.接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两个方面的内容: 1)一方面是实现这个接口 2)另一方面是定义接口的客户 一个类能够实现多个接 ...

  8. poj 1003:Hangover(水题,数学模拟)

    Hangover Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 99450   Accepted: 48213 Descri ...

  9. jQuery函数attr()和prop()的区别

    在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法也几乎完全相同. 但不得不说的是,这两个函数的用处却并不相同.下面我们来详细介绍这两个函数之间的区别. ...

  10. GitHub 中国区前 100 名到底是什么样的人?

    本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员 ...