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\),时间结束之后再切题呢?

思维要更活跃一点啊。

最新文章

  1. java String 的+操作导致的问题
  2. STL : map函数的运用 --- hdu 4941 : Magical Forest
  3. 协程并发框架gevent及其用法
  4. Python科学计算&mdash;&mdash;前期准备
  5. 对人脑处理视觉的描述(摘《学习OpenCV(中文版)》)
  6. android Json 使用
  7. [转]bat批处理实现TXT文本合并
  8. 玩SSH,SFTP
  9. speex的基本编码和解码流程
  10. QF——iOS中的数据库操作:SQLite数据库,第三方封装库FMDB,CoreData
  11. Java Web开发中路径问题小结
  12. C# RichTextBox 滚动条 滚动到最新行
  13. [简洁]JavaScript中添加、移除、移动、复制、创建和查找节点元素
  14. bootstrap的tree控件
  15. IText实现对PDF文档属性的基本设置
  16. 【6集iCore3_ADP触摸屏驱动讲解视频】6-5 底层驱动之SDRAM读写(下)
  17. 关于MySQL大量数据分页查询优化
  18. 【386】operator 的 itemgetter、slice、and_、or_
  19. Oracle 11g 在audit_file_dest目录下产生大量的aud文件
  20. CSS-自定义高度的元素背景图如何自适应以及after伪元素在ie下的处理

热门文章

  1. Java集合之Arrays 剖析
  2. LeetCode 1046. 最后一块石头的重量 (贪心)
  3. sqli-labs less-9 --&gt; less-10
  4. 【剑指Offer】39:平衡二叉树
  5. C#继承是个啥
  6. LED Keychain-Ideal For Mass Promotions
  7. MyBatis的手动映射与模糊查询
  8. java 学习(day2) 时钟类
  9. 07 部署fastDFS文件数据库
  10. Python学习笔记9——异常处理