Maximum Remaining

题意:给n个数,取出两个数$a_{i}$,$a_{j}$,求$a_{i}\% a_{j}$取模的最大值

直接排个序,第二大(严格的第二大)模第一大就是答案了。

#include <bits/stdc++.h>
using namespace std; int a[(int)1e6]; int main() {
ios::sync_with_stdio(false);
cin.tie();
int n;
cin >> n;
for (int i = ; i < n; i++)
cin >> a[i];
sort(a, a + n, greater<int>());
for (int i = ; i < n; i++)
if (a[i] != a[]) {
cout << a[i] % a[] << '\n';
return ;
}
cout << "" << '\n';
return ;
}

Friend or Girlfriend

题意:给一个字符串还有一个字母,问字符串里有多少个子串是这个字母

对于字符串 abcbcafdcde 给定字母为c

首先每到一个位置i 如果s[i]是c 答案就加上这个位置 表示以s[i]为结尾的子串

比如到s[3]是c 答案就加3 分别是abc bc c

到了s[5] 答案加上5 明显不止这么少

因为中间的b可以作为子串结尾 然后以位置3以前的任意一个字母为起点都是一个合法的子串

所以记录一下last的位置 ans += (i - last - 1) * last 就好了

因为最后一个位置不是给定字母的话不会被统计进去 特判一下就好了

#include <bits/stdc++.h>
using namespace std; char s[(int)1e6 + ]; int main() {
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
scanf("%s", s + );
char x[];
scanf("%s", x);
long long ans = ;
int last = ;
for (int i = ; i <= n; i++) {
if (s[i] == x[]) {
ans += (long long)i;
if (i - last - != ) {
ans += (long long)(i - last - ) * last;
}
last = i;
}
if (i == n && s[i] != x[]) {
ans += (long long)(i - last) * last;
}
}
printf("%lld\n", ans);
}
}

Fencing

题意:给一个$N\times M$的矩阵,有 K 格是菜,求最少用多长的篱笆能把这些菜围起来(不能有边与边界或杂草相连)N,M都是1e9

最多肯定就是4 * K啦。然后连通的两个菜格子答案就-2

我是用了结构体和map来映射一个点的下标 然后dfs搜K个格子 只搜右和下两个方向 否则就会因为环跑不出来或者答案统计不全

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e5 + ;
int n, m, k, ans;
struct Point {
int x, y;
bool operator < (const Point &a) const {
if (x == a.x) return y < a.y;
return x < a.x;
}
} p[maxn];
map<Point, int> mp;
bool vis[maxn];
void dfs(int x, int y, int index) {
vis[index] = true;
Point temp;
temp.x = x + , temp.y = y;
if (mp.count(temp)) {
ans -= ;
if (!vis[mp[temp]]) dfs(x + , y, mp[temp]);
}
temp.x = x, temp.y = y + ;
if (mp.count(temp)) {
ans -= ;
if (!vis[mp[temp]]) dfs(x, y + , mp[temp]);
}
} int main() {
int T;
scanf("%d", &T);
while (T--) {
mp.clear();
memset(vis, , sizeof vis);
scanf("%d%d", &n, &m);
scanf("%d", &k);
for (int i = ; i <= k; i++){
scanf("%d%d", &p[i].x, &p[i].y);
mp[p[i]] = i;
}
int index = ;
ans = * k;
for (int i = ; i <= k; i++) {
if (!vis[i])
dfs(p[i].x, p[i].y, i);
}
printf("%d\n", ans);
}
return ;
}

Subtree Removal

题意:给一棵带权的树和一个值X,可以执行k次操作,每次选择一个节点,删去它与它的子树,求剩下的节点权值和 - k * X

当时想的很复杂,不知道怎么写。

现在一想,其实是被这个k给限制住了,把k个X给拆出来,就相当于可以把k个节点包括它的子树的权值和给替换成 -X

这样想就是很简单了。(我好菜啊...

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int maxn = 1e5 + ;
vector<int> G[maxn];
int n;
ll x;
ll a[maxn];
ll f[maxn]; void dfs(int u, int fa) {
f[u] = a[u];
for (int v : G[u]) {
if (v == fa) continue;
dfs(v, u);
f[u] += f[v];
}
f[u] = max(f[u], -x);
} int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &x);
// for (int i = 1; i <= n; i++) G[i].clear();
for (int i = ; i <= n; i++) {
G[i].clear();
scanf("%lld", &a[i]);
// sum += 1LL * a[i];
}
for (int i = ; i < n - ; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(, );
printf("%lld\n", f[]);
}
return ;
}

Playing with Numbers

题意:给一棵树,每个节点有一个权值还有一个模数,求每个叶子,从根到它的路上所有节点的权值的线性组合模上模数的最大值

$a_{1}$ $a_{2}$ $a_{3}$...$a_{n}$ 考虑一下它们的gcd 设为g

这n个数的线性组合本来是 $k_{1}a_{1}+k_{2}a_{2}+k_{3}a,+\ldots +k_{n}a_{n}$

全考虑成gcd后直接就变成了 k'g

所以说其实一些数的线性组合莫非就是它们的gcd的整数倍

现在就是直接看g和模数$m_{i}$

比如g = 4,模数为6 这样最大值就是2

g = 5,模数为7 最大值是6 (5 * 4 % 7 = 6)

多考虑几组就会发现答案就是$m_{i} - gcd(m_{i}, g)$

其实现在这个g,也可以进一步看成 $k_{1}g'$ g‘表示$m_{i}$和g的gcd $m_{i}$看成$k_{2}g'$

两个数相差$\Delta k$我们总有一个k可以让他们的$\Delta k$ = 1

所以就是边dfs边gcd 到叶子就统计答案就好了

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int maxn = 1e5 + ;
int n;
vector<int> G[maxn];
int tol;
ll a[maxn];
ll m[maxn];
pair<int, ll> ans[maxn]; inline void init() {
for (int i = ; i <= n; i++) G[i].clear();
tol = ;
} inline void addedge(int u, int v) {
G[u].push_back(v);
G[v].push_back(u);
} ll gcd(ll a, ll b) {
while (b) {
a %= b;
swap(a, b);
}
return a;
} inline void get_ans(ll g, int index) {
pair<int, ll> temp;
temp.first = index;
temp.second = m[index] - gcd(g, m[index]);
ans[++tol] = temp;
} void dfs(int u, int fa, ll g) {
bool flag = false;
for (int v : G[u]) {
if (v == fa) continue;
flag = true;
dfs(v, u, gcd(g, a[v]));
}
if (!flag) get_ans(g, u);
} int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
init();
for (int i = ; i < n - ; i++) {
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v);
}
for (int i = ; i <= n; i++) scanf("%lld", &a[i]);
for (int i = ; i <= n; i++) scanf("%lld", &m[i]);
dfs(, , a[]);
sort(ans + , ans + + tol);
for (int i = ; i <= tol; i++) {
if (i != ) putchar(' ');
printf("%lld", ans[i].second);
}
puts("");
}
return ;
}

Kira Loves Palindromes

题意:给一个字符串,求字符串的两个子串拼接起来后是回文串的方案数(两个子串不相交也不重复取)

区间dp

$dp_{ij}$表示第一个子串以$s_{i}$开头,第二个子串以$s_{j}$结尾符合的方案数

转移方程

$dp_{ij} = dp_{i+1,j-1} + f_{i + 1, j - 1} + b_{i + 1, j - 1} + 1$

其中$f_{ij}$表示以$s_{i}$为开头的回文串个数

$b_{ij}$表示以$s_{j}$为结尾的回文串个数

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int maxn = 1e3 + ;
bool ok[maxn][maxn];
int f[maxn][maxn], b[maxn][maxn];
ll dp[maxn][maxn], ans;
char s[maxn];
int n; void pre() {
for (int i = n - ; i >= ; i--) {
for (int j = i; j < n; j++) {
ok[i][j] = ((s[i] == s[j]) && (j - i < || ok[i+][j-]));
}
}
for (int i = ; i < n; i++) f[i][i] = b[i][i] = ;
for (int i = ; i < n; i++) {
for (int j = i + ; j < n; j++) {
if (ok[i][j]) f[i][j] = f[i][j-] + ;
else f[i][j] = f[i][j-];
}
}
for (int j = n - ; j >= ; j--) {
for (int i = j - ; i >= ; i--) {
b[i][j] = b[i+][j];
if (ok[i][j]) b[i][j]++;
}
}
} int main() {
scanf("%s", s);
n = strlen(s);
pre();
for (int i = ; i < n - ; i++) {
if (s[i] == s[i+])
dp[i][i+] = , ans++;
}
for (int l = ; l <= n; l++) {
for (int i = ; i + l - < n; i++) {
int j = i + l - ;
if (s[i] == s[j]) {
dp[i][j] = f[i+][j-] + b[i+][j-] + dp[i+][j-] + ;
ans += dp[i][j];
}
}
}
printf("%lld\n", ans);
return ;
}

Mininum XOR over Tree

可持久化字典树...待补...

Codechef April Challenge 2019 Division 2的更多相关文章

  1. Codechef April Challenge 2019 游记

    Codechef April Challenge 2019 游记 Subtree Removal 题目大意: 一棵\(n(n\le10^5)\)个结点的有根树,每个结点有一个权值\(w_i(|w_i\ ...

  2. CodeChef April Challenge 2019题解

    传送门 \(Maximum\ Remaining\) 对于两个数\(a,b\),如果\(a=b\)没贡献,所以不妨假设\(a<b\),有\(a\%b=a\),而\(b\%a<a\).综上, ...

  3. Codechef November Challenge 2019 Division 1

    Preface 这场CC好难的说,后面的都不会做QAQ 还因为不会三进制位运算卷积被曲明姐姐欺负了,我真是太菜了QAQ PS:最后还是狗上了六星的说,期待两(三)场之内可以上七星 Physical E ...

  4. Codechef October Challenge 2019 Division 1

    Preface 这次CC难度较上两场升高了许多,后面两题都只能借着曲明姐姐和jz姐姐的仙气来做 值得一提的是原来的F大概需要大力分类讨论,结果我写了一大半题目就因为原题被ban了233 最后勉强涨了近 ...

  5. Codechef September Challenge 2019 Division 2

    Preface 这确实应该是我打过的比较水的CC了(其实就打过两场) 但由于我太弱了打的都是Div2,所以会认为上一场更简单,其实上一场Div的数据结构是真的毒 好了废话不多说快速地讲一下 A Eas ...

  6. Codechef August Challenge 2019 Division 2

    Preface 老年菜鸡终于开始打CC了,由于他太弱了所以只能打Div2 因为台风的原因challenge并没有写,所以水了个Rank7 A Football SB模拟题不解释 #include< ...

  7. CodeChef November Challenge 2019 Division 1题解

    传送门 AFO前的最后一场CC了--好好打吧-- \(SIMGAM\) 偶数行的必定两人平分,所以只要抢奇数行中间那个就行了 这题怎么被爆破了 //quming #include<bits/st ...

  8. Codechef July Challenge 2019 Division 1题解

    题面 \(CIRMERGE\) 破环成链搞个裸的区间\(dp\)就行了 //quming #include<bits/stdc++.h> #define R register #defin ...

  9. Codechef May Challenge 2020 Division 1 记录

    目录 Triple Sort Sorting Vases Buying a New String Chef and Bitwise Product Binary Land Not a Real Wor ...

随机推荐

  1. Web 性能优化: 使用 Webpack 分离数据的正确方法

    摘要: Webpack骚操作. 原文:Web 性能优化: 使用 Webpack 分离数据的正确方法 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 制定向用户提供文件的最佳方式可能是一 ...

  2. Error: No PostCSS Config found in... 报错 踩坑记

    项目在本地运行不报错,上传到 GitHub 之后,再 clone 到本地,执行: npm install 安装完成之后再执行: npm run dev 这时报错 Error: No PostCSS C ...

  3. 把vux中的@font-face为base64格式的字体信息解码成可用的字体文件

    在最近移动端项目中用到了vux,感觉用着还习惯,当把vux使用到PC端的时候出现了IE浏览器出现,这样的错误信息: CSS3114: @font-face 未能完成 OpenType 嵌入权限检查.权 ...

  4. jquery中点击切换的实现

    项目中经常会遇到一种情况,就是点击切换,比如点击按钮,div样式为1,再点击一下按钮,div样式为2,再点击一下按钮,div样式为1.需要自定义jQuery方法toggle. // toggle方法 ...

  5. ArcGIS 10.0发布缓存地图服务(详细版)

    1.软件准备ArcGIS Destop10.0,ArcGIS Server10.0,Windows系统下自带的IIS6.0以上服务器 1)安装ArcGIS Destop10.0软件,选择完全安装,安装 ...

  6. 微信小程序控件 横/纵向排列

    控件(按钮)横向排列 wxss .view_class { display: flex; flex-direction: row; justify-content: center; } 控件(按钮)纵 ...

  7. 网上都没有提到的教程:python捕获异常后,怎么输出错误文件和行号

    1.假设输出不存在的变量 a try: print(a) except NameError as e: print('发生错误的文件:', e.__traceback__.tb_frame.f_glo ...

  8. 使用Connector/C++(VS2015)连接MySQL的完整例子

    完整示例代码1 /* Copyright 2008, 2010, Oracle and/or its affiliates. All rights reserved. This program is ...

  9. 【重新发布,代码开源】FPGA设计千兆以太网MAC(1)——通过MDIO接口配置与检测PHY芯片

    原创博客,转载请注明出处:[重新发布,代码开源]FPGA设计千兆以太网MAC(1)——通过MDIO接口配置与检测PHY芯片 - 没落骑士 - 博客园 https://www.cnblogs.com/m ...

  10. Java实现Sunday百万级数据量的字符串快速匹配算法

    背景       在平时的项目中,几乎都会用到比较两个字符串时候相等的问题,通常是用==或者equals()进行,这是在数据相对比较少的情况下是没问题的,当数据库中的数据达到几十万甚至是上百万千万的数 ...