牛客-DongDong数颜色 及其相似题
大佬博客
ps:在牛客上做到这题不会,学会之后补了两道相关题。顺便记录一下。
牛客-DongDong数颜色
sol:dfs序+莫队,先把树上的点标上dfs序,因为子树的dfs序是连续的,所以子树可以表示为id[x]到id[x] + size[x] + 1,然后就是序列上莫队了(引用自官方题解)
- dfs序 + 莫队
#include "bits/stdc++.h"
using namespace std;
typedef pair<int, int> PII;
const int MAXN = 1e5 + ;
int c1[MAXN], c2[MAXN], c3[MAXN];
vector<int> edge[MAXN];
PII node[MAXN];
int pos, size;
int ans[MAXN];
struct Query {
int l, r;
int index;
} q[MAXN];
void dfs(int u, int f) {
c2[++pos] = c1[u];
node[u].first = pos;
for (int i = ; i < edge[u].size(); i++) {
int v = edge[u][i];
if (v == f) continue;
dfs(v, u);
}
node[u].second = pos;
}
bool cmp(Query a, Query b) {
if ((a.l - ) / size != (b.l - ) / size)
return (a.l - ) / size < (b.l - ) / size;
return a.r < b.r;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
size = sqrt(n);
for (int i = ; i <= n; i++)
scanf("%d", &c1[i]);
for (int i = ; i < n; i++) {
int u, v;
scanf("%d%d", &u, &v);
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs(, -);
for (int i = ; i <= m; i++) {
int x;
scanf("%d", &x);
q[i].l = node[x].first;
q[i].r = node[x].second;
q[i].index = i;
}
sort (q + , q + + m, cmp);
int l = , r = , k = ;
for (int i = ; i <= m; i++) {
while (r < q[i].r) if (++c3[c2[++r]] == ) k++;
while (l > q[i].l) if (++c3[c2[--l]] == ) k++;
while (r > q[i].r) if (--c3[c2[r--]] == ) k--;
while (l < q[i].l) if (--c3[c2[l++]] == ) k--;
ans[q[i].index] = k;
}
for (int i = ; i <= m; i++)
printf("%d\n", ans[i]);
return ;
}
ps:由于我菜,官方题解上的另外两种解法没补出来,但是去网上看了其他博主的博客发现可以用树状数组代替莫队的功能,效率更高。数组数组为n*log(n),莫队为n*sqrt(n)
HDU-3333-Turing Tree
sol:离线处理,优先处理右区间在前的,不断更新每个颜色下标位置,从而在权值树状数组上统计总和;
- 树状数组
#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int MAXN = 1e5 + ;
struct Query {
int l, r;
int index;
} q[MAXN];
int a[MAXN], pre[MAXN];
LL c[MAXN], ans[MAXN];
map<int, int> mp;
bool cmp(Query a, Query b) {
return a.r < b.r;
}
int lowbit(int i) {
return i & (-i);
}
void add(int i, int k) {
while (i < MAXN) {
c[i] += k;
i += lowbit(i);
}
}
LL sum(int i) {
LL res = ;
while (i > ) {
res += c[i];
i -= lowbit(i);
}
return res;
}
int main() {
int t, n, m;
scanf("%d", &t);
while (t--) {
memset(c, , sizeof(c));
mp.clear();
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
scanf("%d", &m);
for (int i = ; i <= m; i++) {
scanf("%d%d", &q[i].l, &q[i].r);
q[i].index = i;
}
sort(q + , q + + m, cmp);
int r = ;
for (int i = ; i <= m; i++) {
while (r < q[i].r) {
++r;
add(r, a[r]);
if (mp.count(a[r])) add(mp[a[r]], -a[r]);
mp[a[r]] = r;
}
ans[q[i].index] = sum(q[i].r) - sum(q[i].l - );
}
for (int i = ; i <= m; i++)
printf("%lld\n", ans[i]);
}
return ;
}
ps:按难易程度这题应该排在上一题上面,完全就是上一题的阉割版。上一题用莫队来写了这一题就用来练树状数组的方法了,不过这题用莫队不一定能过,这份数组数组的代码都跑了468ms,莫队可能会比较极限,没有尝试过。
CF-703D-Mishka and Interesting sum
sol:把区间所以数异或起来根据相同数字异或为0的原理得到的就是所有出现次数为奇数的数的异或值,那么联系上面两题,只要把区间内不重复出现的数都异或一遍在和区间内所有数异或一下就是我们的结果了。因为异或和加减法具有同样的一些性质也可以用树状数组来解决。
- 树状数组+位运算
#include "bits/stdc++.h"
using namespace std;
const int MAXN = 1e6 + ;
int a[MAXN], b[MAXN], c[MAXN];
map<int, int> mp;
int ans[MAXN];
struct Query {
int l, r;
int index;
} q[MAXN];
bool cmp(Query a, Query b) {
return a.r < b.r;
}
int lowbit(int i) {
return i & (-i);
}
void add(int i, int k) {
while (i < MAXN) {
c[i] ^= k;
i += lowbit(i);
}
}
int sum(int i) {
int _xor = ;
while (i > ) {
_xor ^= c[i];
i -= lowbit(i);
}
return _xor;
}
int main() {
int n, m;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d", &a[i]);
b[i] = a[i] ^ b[i - ];
}
scanf("%d", &m);
for (int i = ; i <= m; i++) {
scanf("%d%d", &q[i].l, &q[i].r);
q[i].index = i;
}
sort(q + , q + + m, cmp);
int r = ;
for (int i = ; i <= m; i++) {
while (r < q[i].r) {
r++;
add(r, a[r]);
if (mp.count(a[r]))
add(mp[a[r]], a[r]);
mp[a[r]] = r;
}
ans[q[i].index] = (sum(q[i].r) ^ sum(q[i].l - )) ^ (b[q[i].r] ^ b[q[i].l - ]);
}
for (int i = ; i <= m; i++)
printf("%d\n", ans[i]);
return ;
}
ps:这题我尝试了莫队,超时了,卡在第14组数据,莫队能过1e5的数据,这题n最大值为1e6。莫队比较好写,但还是树状数组比较快。
dfs序+莫队,先把树上的点标上dfs序,因为子树的dfs序是连续的,所以子树可以表示为id[x]到id[x]+size[x]+1id[x]到id[x]+size[x]+1,然后就是序列上莫队了
牛客-DongDong数颜色 及其相似题的更多相关文章
- 牛客练习赛47 E DongDong数颜色 (树上启发式合并)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- 牛客练习赛47 DongDong数颜色 (莫队算法)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- 2019年牛客多校第一场B题Integration 数学
2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...
- 【面试笔试算法】牛客网一站通Offer编程题2016.4.19
牛客网一站通offer (一)字符串变形 1. 题目: 对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形.首先这个字符串中包含着一些空格,就像"Hello Wor ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- 牛客G-指纹锁【一题三解】
链接:https://www.nowcoder.com/acm/contest/136/G来源:牛客网 题目描述 HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁. ...
- 牛客网 牛客小白月赛1 B.简单题2-控制输出格式
B.简单题2 链接:https://www.nowcoder.com/acm/contest/85/B来源:牛客网 和A题一样,控制输出格式就可以. 代码: 1 #include<iostr ...
- 牛客网 牛客小白月赛1 A.简单题-控制输出格式setiosflags()函数+setprecision()函数
水一水博客,都不好意思写这篇博客,毕竟已经不是大一的了. 难得能把一整套题都写出来(日常智障).但是在这里不写G题あなたの蛙は旅⽴っています的题解. 有毒,G题关了流同步只能过94%的样例,说我运行超 ...
随机推荐
- idea抛出异常:org.apache.shiro.authc.AuthenticationException
问题描述 继续在ubuntu下折腾,终于将web项目的所有的东西配置好了,然后运行项目,满怀期待的心情登录系统的时候,突然出现了这个bug,吓得我差点从椅子上跳起来,这两天遇到的bug实在是太多了.. ...
- JavaScript学习总结(五)
之前的几讲中我们曾经说过,JavaScript中是没有类的概念的.但是我们讲过对象,那么这个对象是怎么来的呢? 只要有函数即可创建对象 自定义对象 自定义对象的方式: 1. 使用无参的函数创建对象 & ...
- 【WPF学习】第三十七章 触发器
WPF中有个主题,就是以声明方式扩展代码的功能.当使用样式.资源或数据绑定时,将发现即使不使用代码,也能完成不少工作. 触发器是另一个实现这种功能的例子.使用触发器,可自动完成简单的样式改变,而这通常 ...
- Momentum
11.6 Momentum 在 Section 11.4 中,我们提到,目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向.因此,梯度下降也叫作最陡下降(steepest desce ...
- JavaScript 之 DOM 与 BOM
DOM是文档对象模型,用来获取或设置文档中标签的属性,例如获取或者设置input表单的value值. 由于DOM的操作对象是文档(Document),所以dom和浏览器没有直接关系. BOM是浏览器对 ...
- Aras Innovator获取项目任务序列号
//方法名:GetProjectTasksNumber //功能描述:获取项目任务序列号 //原作者:joe //创建时间:20141225 //版权所有(C)JOE.FAN //---------- ...
- 实体机安装Ubuntu系统
今天windows突然蓝屏了,索性安装个 Ubuntu 吧,这次就总结一下实体机安装 Ubuntu 的具体步骤 note: 本人实体机为笔记本 型号为:小米pro U盘为金士顿:8G 安装系统:Ubu ...
- 关于Java自动拆箱装箱中的缓存问题
package cn.zhang.test; /** * 测试自动装箱拆箱 * 自动装箱:基本类型自动转为包装类对象 * 自动拆箱:包装类对象自动转化为基本数据类型 * * * /*缓存问题*/ /* ...
- springboot cloud 网盘
boot https://pan.baidu.com/s/12SkGJNu_M-I-pjg-GxqHRw 5uga boot-cloud https://pan.baidu.com/s/1gO ...
- gff文件提取cds
#!/usr/bin/perl use strict; use warnings; ########input######## ];my $cut = &cut($gff);my %cut = ...