Codechef April Challenge 2019 Division 2
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的更多相关文章
- Codechef April Challenge 2019 游记
Codechef April Challenge 2019 游记 Subtree Removal 题目大意: 一棵\(n(n\le10^5)\)个结点的有根树,每个结点有一个权值\(w_i(|w_i\ ...
- CodeChef April Challenge 2019题解
传送门 \(Maximum\ Remaining\) 对于两个数\(a,b\),如果\(a=b\)没贡献,所以不妨假设\(a<b\),有\(a\%b=a\),而\(b\%a<a\).综上, ...
- Codechef November Challenge 2019 Division 1
Preface 这场CC好难的说,后面的都不会做QAQ 还因为不会三进制位运算卷积被曲明姐姐欺负了,我真是太菜了QAQ PS:最后还是狗上了六星的说,期待两(三)场之内可以上七星 Physical E ...
- Codechef October Challenge 2019 Division 1
Preface 这次CC难度较上两场升高了许多,后面两题都只能借着曲明姐姐和jz姐姐的仙气来做 值得一提的是原来的F大概需要大力分类讨论,结果我写了一大半题目就因为原题被ban了233 最后勉强涨了近 ...
- Codechef September Challenge 2019 Division 2
Preface 这确实应该是我打过的比较水的CC了(其实就打过两场) 但由于我太弱了打的都是Div2,所以会认为上一场更简单,其实上一场Div的数据结构是真的毒 好了废话不多说快速地讲一下 A Eas ...
- Codechef August Challenge 2019 Division 2
Preface 老年菜鸡终于开始打CC了,由于他太弱了所以只能打Div2 因为台风的原因challenge并没有写,所以水了个Rank7 A Football SB模拟题不解释 #include< ...
- CodeChef November Challenge 2019 Division 1题解
传送门 AFO前的最后一场CC了--好好打吧-- \(SIMGAM\) 偶数行的必定两人平分,所以只要抢奇数行中间那个就行了 这题怎么被爆破了 //quming #include<bits/st ...
- Codechef July Challenge 2019 Division 1题解
题面 \(CIRMERGE\) 破环成链搞个裸的区间\(dp\)就行了 //quming #include<bits/stdc++.h> #define R register #defin ...
- Codechef May Challenge 2020 Division 1 记录
目录 Triple Sort Sorting Vases Buying a New String Chef and Bitwise Product Binary Land Not a Real Wor ...
随机推荐
- 委托(4).net 3.5中的委托
.net 3.5引入了Linq,lambda表达式,所以委托的创建变得更加简单和优雅了. .net 3.5中的委托 引入lambda表达式后,就不需要再使用匿名方法了,使得创建委托的方式更加简单和优雅 ...
- 自定义Progress小控件
progress各种各样的都有,自定义大多数也是简单的,根据业务需求来自己定义,记录一下,先上效果图 本来想找个第三方改改就上的,不过自己的业务需求有点不搭,一下子没找到合适的,也没这么多时间去找了, ...
- Android相机启动crash错误排查
一个Android的用到相机的service程序,在比较少的情况下会出现在系统启动时crash.log显示是在调用ACameraDevice_createCaptureSession时返回错误ACAM ...
- 使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署
目录 目录 1.基本概念 1.1.什么是智能合约? 1.2.什么是Solidity? 1.2.1.Solidity的语言特性 1.3.什么是 Browser-solidity? 2.Browser-s ...
- 【公众号系列】SAP将裁员4400人,颤抖吧!
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP将裁员4400人,颤抖吧! ...
- go语言打造个人博客系统(二)
go语言打造个人博客系统(二) 在上篇文章go语言打造个人博客系统(一)中,我们了解了go语言的优点和go语言的数据库操作,本次我们会完成博客系统的后端开发. 博客系统后端接口开发 路由测试 ht ...
- c/c++ 多线程 boost的读写(reader-writer)锁
多线程 boost的读写(reader-writer)锁 背景:保护很少更新的数据结构时,c++标准库没有提供相应的功能. 例如:有个DNS条目缓存的map,基本上很少有更新,大部分都是读取,但是偶尔 ...
- SQLServer之创建全文索引
创建全文索引的必须条件 必须具有全文目录,然后才能创建全文索引. 目录是包含一个或多个全文索引的虚拟容器. 使用SSMS数据库管理工具创建全文索引 1.连接数据库,选择数据库,选择数据表->右键 ...
- java 非访问修饰符 final 的用法
final 修饰符,用来修饰类.方法和变量 final修饰的类不能被继承 举例,String类是final类,不可以被继承: final修饰的方法不能被重写 只是不能重写,也就是不能被子类修改,但是可 ...
- 英语口语练习系列-C03-常用问句
连接到英语口语系列总分类 连接到上一章抱怨 枫桥夜泊 How are you doing?你好吗? 美国人见面时候最常用的打招呼方式: "Hey! How are you doing?&qu ...