居然补完了

组合 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. Struts2防止表单重复提交

    1.说明 系统拦截器的应用. 表单重复提交:当使用请求转化进行跳转的时候,存在着表单重复提交的问题. 2.在表单中加入s:token 如果页面加入了struts2的标签,页面的请求必须进入struts ...

  2. Maven Java EE Configuration Problem 的完美解决办法

    背景: 最近在修改项目的时候,发现修改了项目依赖以后会出现如下图:Maven Java EE Configuration Problem 的问题,对于有强迫症的我来说,看到项目上面有个很小的红色小叉号 ...

  3. [Android] 如何查看apk需要支持的Android版本

    reference to : http://blog.csdn.net/huiguixian/article/details/39928089 如果有一个apk,需要知道他最低安装支持的Android ...

  4. 魔法禁书目录2:回家(codevs 3024)

    题目描述 Description 大妈打完三战回家,我知道他是怎么回来的,欧洲到日本有L个站点他决定乘坐恰好n次飞机(不是学院都市的超音速飞机)和m次火车来从第一个站点到达最后一个站点.但是有一点很重 ...

  5. gcc创建和使用静态库、动态库

    http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155599.html 目录树结构: test/include/hello.h #ifdef ...

  6. 三、jQuery--jQuery基础--jQuery基础课程--第4章 jQuery表单选择器

    1.:input表单选择器 如何获取表单全部元素?:input表单选择器可以实现,它的功能是返回全部的表单元素,不仅包括所有<input>标记的表单元素,而且还包括<textarea ...

  7. HTTP1.0和HTTP1.1的主要区别是

    HTTP/.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象 HTTP/.1默认使用持久连接(然而,HTTP/.1协议的客户机和服务器可以配置成使用非持久连接)在持久连接下, ...

  8. Spring学习笔记—最小化Spring XML配置

    自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bean的依赖关系. 自动 ...

  9. MySQL 主从同步

    http://blog.csdn.net/z69183787/article/details/53897894

  10. SQL分页存储过程——表名、返回的列、排序字段、排序类型、条件、页尺寸、页码

    ALTER PROCEDURE [dbo].[SP_LGY_ICU_PAGECUT] ), -- 表名 ) = '*', -- 需要返回的列 )='''', -- 排序的欄位名 , -- 設置排序類型 ...