A - 中位数图

题面

题解

先找出题意中的\(b\)所在的位置。

再以这个位置为中心,向右\(for\)一遍有多少个大于/小于该数的数

大于就\(++cs\) 小于就\(--cs\)。

因为这个数是中位数,所以大于它的数小于它的数的数量是一样的。

然后每次以\(cs\)为下标的数\(++\)。

因为\(cs\)可能小于零,

所以需要将\(cs\)加上\(100000\)后再\(++\)。

统计答案时直接加上下标为\(0-cs+100000\)的数的值即可。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <map>
#define int long long
#define gI gi
#define itn int
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout) using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
return f * x;
} int n, b, a[100003], p[100003], c, s[100003], cs, cj, sum, ans, pp[200003]; signed main()
{
//File("A");
n = gi(), b = gi();
for (itn i = 1; i <= n; i+=1)
{
a[i] = gi();
if (a[i] == b) c = i;
}
for (int i = c; i <= n; i+=1)
{
if (a[i] > b) ++cs;
if (a[i] < b) --cs;
++pp[cs + 100000];
}
for (int i = c; i >= 1; i-=1)
{
if (a[i] > b) ++cj;
if (a[i] < b) --cj;
ans = ans + pp[0 - cj + 100000];
}
printf("%lld\n", ans);
return 0;
}

B - 树

题面

题解

直接暴力\(dfs\)即可\(AC\)。

数据很水啊……

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#define gI gi
#define itn int
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout) using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
return f * x;
} int n, m, s, a[100003], fa[100003], ans;
int tot, head[300003], nxt[300003], ver[300003]; inline void add(int u, int v)
{
ver[++tot] = v, nxt[tot] = head[u], head[u] = tot;
} void dfs(int u, int fa, int w)
{
if (w > s) return;
if (w == s) {++ans; return;}
for (int i = head[u]; i; i = nxt[i])
{
int v = ver[i];
if (v == fa) continue;
dfs(v, u, w + a[v]);
}
} int main()
{
//File("B");
n = gi(), s = gi();
for (int i = 1; i <= n; i+=1) a[i] = gi();
for (int i = 1; i < n; i+=1)
{
int u = gi(), v = gI();
add(u, v);
fa[v] = u;
}
for (int i = 1; i <= n; i+=1)
{
dfs(i, fa[i], a[i]);
}
printf("%d\n", ans);
return 0;
}

C - 松鼠的新家

题面

题解

倍增\(LCA+\)树上差分一遍过。

注意要判断两个房间是不是存在祖先关系。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <vector>
#define gI gi
#define itn int
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout) using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
return f * x;
} itn n, a[300003], dep[300003], w[300003], fa[300003][23], sum, ans, tot, head[1200003], nxt[1200003], ver[1200003];
int f[300003], logn; inline void add(int u, int v)
{
ver[++tot] = v, nxt[tot] = head[u], head[u] = tot;
} void dfs(int u, int baba, int step)
{
dep[u] = step; fa[u][0] = baba;
for (int i = 1; i <= logn; i+=1)
{
fa[u][i] = fa[fa[u][i - 1]][i - 1];
}
for (int i = head[u]; i; i = nxt[i])
{
int v = ver[i];
if (v == baba) continue;
dfs(v, u, step + 1);
}
} inline void getlca(int u, int v)
{
if (dep[u] < dep[v]) swap(u, v);
int x = u, y = v;
while (dep[u] > dep[v])
{
for (int i = logn; i >= 0; i-=1)
{
if (dep[fa[u][i]] > dep[v]) u = fa[u][i];
}
u = fa[u][0];
}
if (u == v)
{
++w[x], --w[fa[u][0]]; return;
}
for (itn i = logn; i >= 0; i-=1)
{
if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
}
u = fa[u][0];
++w[x], ++w[y], --w[u], --w[fa[u][0]];
} void getans(int u)
{
f[u] = w[u];
for (int i = head[u]; i; i = nxt[i])
{
int v = ver[i];
if (v == fa[u][0]) continue;
getans(v);
f[u] = f[u] + f[v];
}
} int main()
{
//File("C");
n = gi();
while ((1 << logn) < n) ++logn;
for (int i = 1; i <= n; i+=1)
{
a[i] = gi();
}
for (int i = 1; i < n; i+=1)
{
int u = gi(), v = gi();
add(u, v); add(v, u);
}
add(0, a[1]);
dfs(0, 0, 1);
for (int i = 1; i < n; i+=1)
{
getlca(a[i], a[i + 1]);
}
getans(a[1]);
for (int i = 1; i <= n; i+=1)
{
printf("%d\n", (i == a[1]) ? (f[i]) : (f[i] - 1));
}
return 0;
}

总结

为什么每次时间内\(0AC\),时间结束之后再切题呢?

思维要更活跃一点啊。

NOIP做题练习(day5)的更多相关文章

  1. noip做题记录+挑战一句话题解?

    因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...

  2. NOIP做题练习(day2)

    A - Reign 题面 题解 最大子段和+\(DP\). 预处理两个数组: \(p[i]\)表示 \(i\) 之前的最大子段和. \(l[i]\)表示 \(i\) 之后的最大子段和. 最后直接输出即 ...

  3. NOIP做题练习(day1)

    A - Xenny and Alternating Tasks 题面 题解 枚举第一天是谁做,将两个答案取\(min\)即可. 代码 #include <iostream> #includ ...

  4. $NOIp$做题记录

    虽然去年做了挺多了也写了篇一句话题解了但一年过去也忘得差不多了$kk$ 所以重新来整理下$kk$ $2018(4/6$ [X]积木大赛 大概讲下$O(n)$的数学方法. 我是从分治类比来的$QwQ$. ...

  5. NOIP做题练习(day4)

    A - 同花顺 题面 题解 30分做法 爆搜即可. 60分做法 去重+贪心. 100分做法 去重+贪心后,我们要寻找一段符合条件的最长同花上升子序列 \(L\),\(n-L\) 即为所求的答案. 首先 ...

  6. NOIP做题练习(day3)

    A - 军队 问题描述 给定一个有 \(n\) 个队伍的人组成的序列,第 \(i\) 个队伍 \(i\) 有 \(s[i]\)个人组成,一个 \(l\) 到 \(r\)的子序列是合法的,当且仅当\(( ...

  7. NOIP初赛:完善程序做题技巧

    最近写的文章好像还很多的.那么今天我们来讨论NOIP初赛的题型--完善程序.完善程序相对是比较难的题目了.全卷100分,完善程序占了大概26分,占比非常大.如果和英语考试试卷做比较,相当于首字母填空( ...

  8. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  9. CodeM美团点评编程大赛复赛 做题感悟&题解

    [T1] [简要题意]   长度为N的括号序列,随机确定括号的方向:对于一个已确定的序列,每次消除相邻的左右括号(右左不行),消除后可以进一步合并和消除直到不能消为止.求剩下的括号的期望.\(N \l ...

随机推荐

  1. javaweb 使用页面模板CSS或者Js修改失效的解决办法(Tomcat缓存问题)

    原因是:浏览器的自动缓存机制导致的. 浏览器会自动缓存静态文件以加快访问速度,但是这导致了他不会再从服务器端接收静态文档了,这就导致我在idea里面改的css和js文档,浏览器根本没下载下来. 所以解 ...

  2. gulp常用插件之gulp-beautify使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-beautify这是一款使用js-beautify进行资产美化插件. 更多使用文档请点击访问gulp-beautify工具官网. 安装 ...

  3. gulp常用插件之bower使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 bower这是一款客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源. 更多使用文档请点击访 ...

  4. 如果在vscode 中用运行快捷键(Ctrl+Alt+N)出现中文的乱码

    在VSCODE中,运行代码的快捷方式是Ctrl+Alt+N,终止 代码运行的方式是Ctrl+Alt+M,但是有时候会出现汉字的乱码,这种情况并不是代码有问题,只要在terminal 中运行代码就可以了 ...

  5. Laravel框架中通过EasyWeChat发送公众号模板消息

    环境要求 PHP >= 7.0 PHP cURL 扩展 PHP OpenSSL 扩展 PHP SimpleXML 扩展 PHP fileinfo 拓展 使用composer安装: $ compo ...

  6. AI 所需的数学基础

    一.[微积分] 基础概念(极限.可微与可导.全导数与偏导数):只要学微积分,就必须要明白的概念,否则后面什么都无法继续学习. 函数求导:求导是梯度的基础,而梯度是 AI 算法的基础,因此求导非常重要! ...

  7. ElementUI的Table-column_render-header自定义表头

    ElementUI的Table表格,官方网站上提供了很多样式,但是在日常开发中还会碰到各种情况,显然官方提供的是不能满足需求的.那么,我们就根据自己的需求对table进行改造. 先丢出关于Table的 ...

  8. 查询避免Unknown column ‘xxx’ in ‘where clause

    问题: 单从字面理解,我们很容易得出列名称不存在的结论, 但是,很多时候并不是列名出错造成的,而是由于拼凑sql语句时对字符类型数据没有用引号引起来造成的. 例子: 例如:  String sql=& ...

  9. 小白月赛22 D : 收集纸片

    D:收集纸片 考察点 : 全排列,对数据范围的估计程度 坑点 : 注意算最后回到初始的那步距离 析题得侃 : 一看题目最短路,诶呦,这不是最拿手的 BFS 走最短路吗?哈哈,定睛一看 这么多目的地,这 ...

  10. TensorFlow入门(常量变量及其基本运算)

    1.tensorflow常量变量的定义 测试代码如下: # encoding:utf-8 # OpenCV tensorflow # 类比 语法 api 原理 # 基础数据类型 运算符 流程 字典 数 ...