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 ...
随机推荐
- vue关闭代码检查eslint
confing/index.js 文件里面的 useEslint 改成false就可以关闭代码检查了 不过为了代码的规范性,不建议关闭!
- Snapman系统中TCC执行效率和C#执行效率对比
Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面4方面: 1.函数执行效率 2.数字转换成字符串 3.字符串的叠加 4.MD5算法 这是C ...
- USGS-EROS项目espa-surface-reflectance中的Landsat8 大气校正LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本(四)
,支持一些关键问题: 1 数据初始化问题.该问题是指在linux环境下编程标准c并编译,用户定义的变量默认初始值是0,但在windows 64 win7环境中,变量默认初始值是负值极小.... ...
- Python常用模块:datetime
使用前提: >>> from datetime import datetime 常见用法: 1.获取当前日期和时间 >>> now = datetime.now() ...
- python集合使用范例的代码
在代码过程中中,将代码过程中比较好的代码段珍藏起来,如下的代码是关于python集合使用范例的代码,希望能对大伙有用. # sets are unordered collections of uniq ...
- 下拉框 JComboBox,文本框JTextField
1. 下拉框 JComboBox //导入Java类 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEven ...
- 微信小程序(五) 利用模板动态加载数据
利用模板动态加载数据,其实是对上一节静态数据替换成动态数据:
- Javascript数组系列五之增删改和强大的 splice()
今天是我们介绍数组系列文章的第五篇,也是我们数组系列的最后一篇文章,只是数据系列的结束,所以大家不用担心,我们会持续的更新干货文章. 生命不息,更新不止! 今天我们就不那么多废话了,直接干货开始. 我 ...
- logback日志配置
第一步:加入jar包.要加入slf4j和logback的jar包,slf4j需要的jar包为slf4j-api,logback需要2个jar包(logback-classic.logback-core ...
- js 学习之路7:switch/case语句的使用
语法格式: switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: n 与 case 1 和 case 2 不同时执行的代 ...