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. AEAI HR薪资汇总功能介绍

    1 概述 人力资源系统是一个公司重要的管理工具,而薪资管理是人力资源管理系统中最为核心的功能模块,它包括不同员工的薪资标准.薪资的组成部分,例如:对奖惩管理.保险和年假等员工必备的福利待遇进行统一管理 ...

  2. 解读《德勤2017年全球CIO报告》:顶级CIO的炼成之道

    文|水手 日前,德勤发布了<2016-2017年全球CIO调查报告>.在这份报告中,德勤从影响CIO为企业创造价值的能力的决定因素出发,探索了CIO为企业进行价值创造的方式,同时以CIO的 ...

  3. OpenCL:图像处理基础note

    使用图像对象的理由 虽然对于图像也可以把它的像素数据当做一般的缓存数据来处理,但是如果把它当做图像来处理有如下好处: 在GPU中,图像数据是保存在特殊的全局内存中,即纹理内存,它和一般的全局内存不相同 ...

  4. AndroidTV端的requestFocus()问题

    每次开机盒子或者电视的时候,发现给某些控件设置请求焦点 requestFocus 会失效 最终的解决办法就是延时请求 view.postDelayed(new Runnable() { @Overri ...

  5. Lcd(一)显示原理

    一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...

  6. 复制命令(COPY)

    COPY 命令: // 描述: 将一个或多个文件从一个位置复制到另一个位置. ### 注意:如果想复制文件夹,请使用 XCOPY . // 语法:  copy [/a] [/b] [/d] [/v] ...

  7. LeetCode算法题-Base 7(Java实现)

    这是悦乐书的第247次更新,第260篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第114题(顺位题号是504).给定一个整数,返回其基数为7的字符串表示.例如: 输入: ...

  8. 英语口语练习系列-C03-常用问句

    连接到英语口语系列总分类 连接到上一章抱怨 枫桥夜泊 How are you doing?你好吗? 美国人见面时候最常用的打招呼方式: "Hey! How are you doing?&qu ...

  9. Ajax概述和判断用户名是否存在的简单代码练习

    在本代码中主要体现,Ajax实现了部分位置的刷新.不需要重新刷新网页,重新请求服务器.下面用过代码来对Ajax更深的认识 这里需要创建,一个jsp文件(显示登录界面),js文件(对Ajax的主要设置) ...

  10. bat——批量删除文件文件夹

    bat批处理,在工作中会带来很多便利. 例如:想删除多个文件夹内的文件夹“Quality”及其子文件 同时删除所有Cyc*文件夹内的所有R00*.tif文件 则可如下操作 先建立父bat文件run_d ...