problem1 link

首先枚举长度$L$。然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字。然后不同段就可以比较他们的关键字,一样就是可以转化的。

problem2 link

对于那些一定要换的,把它们的places和cutoff拿出来,排个序。设它们为$p_{1},p_{2},..,p_{k},c_{1},c_{2},..,c_{k},$.最优的策略一定是从小到大挨个匹配。

如果到了某个位置不能匹配,比如$t$.那么需要从那些不需要交换的组里面拿出一个$(np,nc)$,这个需要满足$np\leq c_{t}$并且$nc$尽量大。

problem3 link

由于会有两个值不大于200,那么这两种最后会把整个序列最多分为401段。然后就是考虑把后面的两种也分成这么多段插进去就好。

第一个问题,假设$f[n][m][k]$表示第一个颜色和第二个颜色各有$n$和$m$个,分成$k$段的方案数。有一个性质是每一段两个是交错的,所以数量差不会超过1,那么可以得到转移方程:

(1)两个一样多组成一段:$n>0, m>0\rightarrow f[n][m][k]=2\sum_{i=1}^{min(n,m)}f[n-i][m-i][k-1]$

(2)第一个多一个组成一段:$n>0\rightarrow f[n][m][k]=\sum_{i=1}^{min(n-1,m)}f[n-1-i][m-i][k-1]$

(3)第二个多一个组成一段:$m>0\rightarrow f[n][m][k]=\sum_{i=1}^{min(n,m-1)}f[n-i][m-1-i][k-1]$

所以可以预处理对角线的前缀和可以在$O(nm(n+m))$的复杂度的计算完$f$

第二个问题,假设现在有$m$段,将后面两个插进去,有多少方法。这$m$段有三种情况,第一种第三个颜色的数量多一个,第二种第四个颜色的数量多一个,第三种两种颜色一样多。设第三种颜色第四种颜色的数量分别为$a,b,a\leq b$。这三种段的数量分别为$t,p,q$,那没有$t+p+q=m,p-t=b-a$。所以可以枚举$t$,然后$p,q$就可以都确定。令$X=a-t=b-p$,剩下的问题就是将$X$分成$m$个数字之和使得前$t+p$个数字可以为0,后面$q$个数字不能为0.这等价于将$Y=X+t+p-m$个数字分成$m$个数字之和,每个数字大于等于0.答案为$C_{Y+m-1}^{m-1}=C_{X+t+p-m-m-1}^{m-1}=C_{a-t+t+p-m+m-1}^{m-1}=C_{a+p-1}^{m-1}$

所以$G(m,a,b)=\sum_{t=0}^{min(a,m)}C_{m}^{t}*C_{m-t}^{p}*2^{q}*C_{a+p-1}^{m-1}[q\geq 0]$

code for problem1

#include <cmath>
#include <vector> class SimilarRatingGraph {
public:
double maxLength(const std::vector<int> &date,
const std::vector<int> &rating) {
int n = static_cast<int>(date.size());
auto Length = [&](int idx) {
double x = date[idx] - date[idx - 1];
double y = rating[idx] - rating[idx - 1];
return std::sqrt(x * x + y * y);
};
double result = 0;
for (int L = n - 1; L > 1; --L) {
int m = n - L + 1;
std::vector<std::pair<long long, long long>> sum(m);
for (int i = 0; i + L <= n; ++i) {
int g = 0;
for (int j = i + 1; j < i + L; ++j) {
g = Gcd(g, date[j] - date[j - 1]);
g = Gcd(g, std::abs(rating[j] - rating[j - 1]));
}
long long s0 = 0;
long long s1 = 0;
for (int j = i + 1; j < i + L; ++j) {
int t0 = (date[j] - date[j - 1]) / g;
int t1 = (rating[j] - rating[j - 1]) / g;
s0 = s0 * 100007 + t0 + (j - i);
s1 = s1 * 100007 + t1 + (j - i);
}
sum[i] = {s0, s1};
}
std::vector<double> sum_length(m, 0);
for (int i = 1; i < L; ++i) {
sum_length[0] += Length(i);
}
for (int i = 1; i < m; ++i) {
sum_length[i] = sum_length[i - 1] + Length(i + L - 1) - Length(i);
}
for (int i = 0; i < m; ++i) {
for (int j = i + 1; j < m; ++j) {
if (sum[i] == sum[j]) {
result = std::max(result, std::max(sum_length[i], sum_length[j]));
}
}
}
}
return result;
} private:
int Gcd(int x, int y) { return y == 0 ? x : Gcd(y, x % y); }
};

code for problem2

#include <algorithm>
#include <vector> class StoryFromTCO {
public:
int minimumChanges(const std::vector<int> &places,
const std::vector<int> &cutoff) {
std::vector<std::pair<std::pair<int, int>, bool>> good;
std::vector<int> bad_places;
std::vector<int> bad_cutoff;
for (size_t i = 0; i < places.size(); ++i) {
if (places[i] <= cutoff[i]) {
good.push_back({{places[i], cutoff[i]}, false});
} else {
bad_places.push_back(places[i]);
bad_cutoff.push_back(cutoff[i]);
}
}
auto Sort = [&](size_t idx) {
std::sort(bad_places.begin() + idx, bad_places.end());
std::sort(bad_cutoff.begin() + idx, bad_cutoff.end());
};
auto FindBest = [&](int cut) -> int {
int n = static_cast<int>(good.size());
int bst = -1;
for (int i = 0; i < n; ++i) {
if (!good[i].second && good[i].first.first <= cut &&
(bst == -1 || good[bst].first.second < good[i].first.second)) {
bst = i;
}
}
return bst;
};
Sort(0);
size_t idx = 0;
while (idx < bad_places.size()) {
if (bad_places[idx] <= bad_cutoff[idx]) {
++idx;
continue;
}
int bst = FindBest(bad_cutoff[idx]);
if (bst == -1) {
return -1;
}
bad_places.push_back(good[bst].first.first);
bad_cutoff.push_back(good[bst].first.second);
good[bst].second = true;
Sort(idx);
}
return static_cast<int>(bad_cutoff.size());
}
};

code for problem3

#include <algorithm>
#include <vector> constexpr int kMAXN = 100000;
constexpr int kMAXM = 400;
constexpr int kMod = 1000000009; long long fact[kMAXN + kMAXM + 1];
long long fact_inv[kMAXN + kMAXM + 1];
long long fpow[kMAXM + 2]; int f[kMAXM / 2 + 1][kMAXM / 2 + 1][kMAXM + 1]; class ColourHolic {
public:
int countSequences(std::vector<int> all) {
std::sort(all.begin(), all.end());
Initialize(all[2] + all[3] + all[0] + all[1]);
if (all[2] == 0) {
if (all[3] > 1) {
return 0;
} else {
return 1;
}
}
if (all[1] == 0) {
if (all[2] == all[3]) {
return 2;
} else if (all[2] + 1 == all[3]) {
return 1;
} else {
return 0;
}
} auto Get = [&](int m, int mul) {
long long r = Compute(m + 1, all[2], all[3]);
r += Compute(m, all[2], all[3]) * 2;
r += Compute(m - 1, all[2], all[3]);
return static_cast<int>(r % kMod * mul % kMod);
}; if (all[0] == 0) {
return Get(all[1], 1);
}
int n = all[0];
int m = all[1];
f[0][1][1] = 1;
for (int i = 1; i <= n; ++i) {
f[i][i][1] = 2;
f[i][i - 1][1] = 1;
if (i + 1 <= m) {
f[i][i + 1][1] = 1;
}
}
int result = Get(1, f[n][m][1]);
for (int k = 2; k <= n + m; ++k) {
for (int i = 0; i <= n; ++i) {
int t = 1;
while (t <= m && i + t <= n) {
Add(f[i + t][t][k - 1], f[i + t - 1][t - 1][k - 1]);
++t;
}
}
for (int j = 1; j <= m; ++j) {
int t = 1;
while (t <= n && j + t <= m) {
Add(f[t][j + t][k - 1], f[t - 1][j + t - 1][k - 1]);
++t;
}
}
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= m; ++j) {
if (i > 0 && j > 0) {
Add(f[i][j][k], f[i - 1][j - 1][k - 1] * 2);
}
if (i > 0) {
Add(f[i][j][k], f[i - 1][j][k - 1]);
}
if (j > 0) {
Add(f[i][j][k], f[i][j - 1][k - 1]);
}
}
}
Add(result, Get(k, f[n][m][k]));
}
return result;
} private:
void Add(int &x, int y) {
if (y >= kMod) {
y -= kMod;
}
x += y;
if (x >= kMod) {
x -= kMod;
}
} long long Compute(int m, int a, int b) {
if (m == 0) {
return 0;
}
long long result = 0;
for (int t = 0; t <= a && t <= m; ++t) {
int p = b - a + t;
int q = m - p - t;
if (q < 0) {
continue;
}
result += C(m, t) * C(m - t, p) % kMod * fpow[q] % kMod *
C(a + p - 1, m - 1) % kMod;
}
return result % kMod;
} void Initialize(int n) {
fact[0] = fact_inv[0] = 1;
fact[1] = fact_inv[1] = 1;
for (int i = 2; i <= n; ++i) {
fact[i] = fact[i - 1] * i % kMod;
fact_inv[i] = GetInv(fact[i]);
}
fpow[0] = 1;
for (int i = 1; i <= kMAXM + 1; ++i) {
fpow[i] = fpow[i - 1] * 2 % kMod;
}
} long long C(int n, int m) {
if (n < m || m < 0) {
return 0;
}
return fact[n] * fact_inv[m] % kMod * fact_inv[n - m] % kMod;
} long long GetInv(long long n) {
int m = kMod - 2;
long long r = 1;
while (m != 0) {
if ((m & 1) == 1) {
r = r * n % kMod;
}
m >>= 1;
n = n * n % kMod;
}
return r;
}
};

topcoder srm 635 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. 音频 m4a 转 wav

    背景 最近做智能家居,需要用到一些应答词 需要自己录制.但是在mac下面通过 QuickTime 录制的是 m4a格式.但是应答词需要 wav格式.所以就需要转化了 解决方法 # sox 不行, ff ...

  2. es6下 vue实例属性template不能使用

    esm模式下 不能使用template,需要引入非esm的vue.js,查看vue源码的包的dist目录下 文件标有esm是支持ems,没有标记,就是不支持(这个知识,怎么说了,应该属于webpack ...

  3. org.springframework.boot.web.server.WebServerException: Unable to create tempDir. java.io.tmpdir is set to C:\Users\ADMINI~1\AppData\Local\Temp\2\

    问题原因:springboot创建临时文件找不到对应的目录 解决办法:1. 重新指定临时文件位置  java -Djava.io.tempdir=D:/tmpdir -jar -my_project. ...

  4. Json对象扩展

    1.JSON.stringify(obj/arr) js对象(数组)转换为json对象(数组) 2.JSON.parse(json) json对象(数组)转换为js对象(数组)

  5. Django---请求、响应

    Django的请求和响应 一.客户端向服务器的请求简介 二.响应对象构造 回到顶部 一.客户端向服务器的请求简介 1.c-->s的传参的4中途径 提取的URL的特定部分,如/天气/北京/ 201 ...

  6. 解析key值不确定的json数据

    遇到一个奇葩的需求,一段json的key值是动态的,并且这个key还是有作用的.这就要求在不知道key是多少的情况下去把这段json解析出来. 我用到的方法是迭代器.具体代码如下 JSONObject ...

  7. python smtp 发邮件 添加附件

    # -*- coding:utf-8 -*- # __author__ = 'justing' import os import smtplib from email.mime.multipart i ...

  8. python发送邮件心得体会

    利用本地smtp server发送 windows下尝试装了两个smtp server大概配置了下,发现没法生效,也没时间仔细研究了.装上foxmail发现以前可以本地发送的选项已经无法找到. 不带附 ...

  9. Jmeter笔记(Ⅲ) Jmeter的非GUI操作

    在启动Jmeter时,我们会看到这样一句提示: 不要使用GUI模式(界面模式)进行负载测试,GUI模式只能用于创建测试和调试.进行负载测试时,需要时用非GUI模式. 那么为什么进行负载测试时一定要用非 ...

  10. Android -- Glide框架详解(一)

    1,使用这个框架快两年了,今天去github上去看了一下,貌似已经从3.X升级到4.X了,想着自己还没有对这个框架在博客上做过总结,所以这里打算出三篇博客来介绍,内容有基本使用.3.X与4.X的不通. ...