对于一对 $(x, y)$,能成为逆序对的取决于绝对值大的那个数的符号。
假如 $a[x] > a[y]$,当 $a[x]$ 为正时,不管 $a[y]$ 取不取负号都比 $a[x]$ 小。
当 $a[x]$ 为负时, 不管 $a[y]$ 取不取负号都比 $a[x]$ 大。
那么就变成了统计每个节点的子树及祖先有多少个比它的权值小的。取正时,子树内权值比它小的节点对答案有贡献,取负时,祖先中权值比它的节点对答案有贡献。
然后就相当于01背包了。
用bitset优化一下复杂度就是 $O(\dfrac{nk}{64})$
求子树内和到根的路径上比该节点小的数可以树剖做。但看了tangjz的代码发现一个更加巧妙的方法。
求子树内显然可以从小到大插入节点+dfs序+树状数组。
求该节点到根的路径上比自己权值大的,就相当于求自己有几个祖先,相当于求自己在多少个节点的子树内。
那么多开一个树状数组,在插入一个节点时,让其子树这个区间(不包括自身)区间加一。查询时单点查值就行了。

#include <bits/stdc++.h>
using namespace std; const int N = 1e5 + ; bitset<> mask; int n; struct BIT {
int tree[N];
inline int lowbit(int x) {
return x & -x;
}
void add(int x, int v) {
if (!x) return;
for (int i = x; i <= n; i += lowbit(i))
tree[i] += v;
}
int query(int x) {
int ans = ;
for (int i = x; i; i -= lowbit(i))
ans += tree[i];
return ans;
}
} bit[]; int a[N], in[N], out[N], tol, o[N];
vector<int> G[N]; void dfs(int u, int fa) {
in[u] = ++tol;
for (auto v: G[u])
if (v != fa) dfs(v, u);
out[u] = tol;
} bool cmp(const int &x, const int &y) {
return a[x] < a[y];
} int main() {
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d", &a[i]);
o[i] = i;
}
sort(o + , o + n + , cmp);
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(, -);
mask.set();
for (int i = ; i <= n; i++) {
int u = o[i];
int k1 = bit[].query(in[u]), k2 = bit[].query(out[u]) - bit[].query(in[u] - );
mask = mask << k1 | mask << k2;
bit[].add(in[u] + , ); bit[].add(out[u] + , -);
bit[].add(in[u], );
}
int q;
scanf("%d", &q);
while (q--) {
int k;
scanf("%d", &k);
puts(mask.test(k) ? "Orz" : "QAQ");
}
return ;
}

牛客挑战赛32 E. 树上逆序对的更多相关文章

  1. 【牛客挑战赛32E】树上逆序对

    题目 数据范围非常奇怪,询问的逆序对个数\(k\leq 30000\),我们应该可以把所有的情况都求出来 发现对于树上两点\(x,y\),如果\(x\)是\(y\)的祖先,那么绝对值较大的点的符号决定 ...

  2. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  3. 牛客挑战赛32E 树上逆序对

    nowcoder 口胡一时爽 先从这个逆序对的性质入手,手玩可以发现对于一对具有祖先关系节点的点,只有权值绝对值大的才能对这一对点是否为逆序对造成影响.具体来讲,如果祖先点权值大,并且取正号,那么其后 ...

  4. P2995 [USACO10NOV]牛的照片(树状数组,逆序对)

    题目: P2995 [USACO10NOV]牛的照片Cow Photographs P4545 [USACO10NOV]奶牛的图片Cow Photographs SP7809 COWPIC - Cow ...

  5. 牛客练习赛32 B题 Xor Path

    链接:https://ac.nowcoder.com/acm/contest/272/B来源:牛客网 题目描述 给定一棵n个点的树,每个点有权值.定义表示  到  的最短路径上,所有点的点权异或和. ...

  6. 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp

    LINK:牛牛与序列 (牛客div1的E题怎么这么水... 还没D难. 定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_ ...

  7. 牛客挑战赛46 C

    题目链接: 排列 考虑\(dp\),我们思考如何设计状态 将第i个数插入i-1个数中,我们考虑会新增多少个超级逆序对 假设将\(i\)插入后\(i\)的位置为\(l\),\(i-1\)的原来的位置为\ ...

  8. 牛客挑战赛33 F 淳平的形态形成场(无向图计数,EGF,多项式求逆)

    传送门: 淳平的形态形成场 题解: 把a排序后,直接统计答案恰好为a[i]并不好做,可以统计答案>a[i]的方案数,设为\(f[i]\). 即不存在一个联通块,所有的权值都<=a[i]. ...

  9. 良心送分题(牛客挑战赛35E+虚树+最短路)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 给你一棵树,然后把这棵树复制\(k\)次,然后再添加\(m\)条边,然后给你起点和终点,问你起点到终点的最短路. 思路 由于将树复制\(k\) ...

随机推荐

  1. SQL Server DBCC命令大全

    原文出处:https://www.cnblogs.com/lyhabc/archive/2013/01/19/2867174.html DBCC DROPCLEANBUFFERS:从缓冲池中删除所有缓 ...

  2. 【转】潜说js对象和数组

    /* 数组和对象 [JavaScript 权威指南 第五版] */ /* 对象: 是一个无序属性集合, 每个属性都有自己的名字和值 */ /* 创建对象简单方法, 对象直接量 */ var obj = ...

  3. <面试题分享> 记两次58面试

    说明 来北京找工作,有个猎头看我的简历不错,帮我投了两个58同城的面试,投的都比较高,题也注重原理,较难,这里分享出来,给有需要的人和自己提个醒,保持空杯 面试题内容 2019.05.07 北京58企 ...

  4. 使用位运算实现int32位 整数的加减乘除

    我觉得比较难想的是加法吧. 首先加法,脑海中脑补二进制加法,相同位相加,超过2 ,则进1,留0 那么用位运算怎么实现呢?其实理解了异或和与操作,就很容易想出来了. 我觉得异或操作和与操作完全就是实现加 ...

  5. Scala 系列(十一)—— 模式匹配

    一.模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句.执行类型检查.以及支持析构表达式等. 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match.. ...

  6. HashSet去重

    class Program     {         static void Main(string[] args)         {             Console.WriteLine( ...

  7. CentOS 7 安装 mysql 5.7.27 for zabbix

    本文是因为需要安装zabbix系统,才贴出的此步骤,供自己查阅方便之用: 在安装使用zabbix前,需要先安装数据库,这里使用的是MySQL数据库进行部署,给出安装步骤,大家觉得有用也可收藏: 当然安 ...

  8. C#读写设置修改调整UVC摄像头画面-焦点

    有时,我们需要在C#代码中对摄像头的焦点进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  9. C# 接口、抽象类、以及事件

    接口.抽象类,用于项目集成,如: Interface icls = appid == "A" ? new ClassA() : new ClassA();icls.func(&qu ...

  10. Python进阶----索引原理,mysql常见的索引,索引的使用,索引的优化,不能命中索引的情况,explain执行计划,慢查询和慢日志, 多表联查优化

    Python进阶----索引原理,mysql常见的索引,索引的使用,索引的优化,不能命中索引的情况,explain执行计划,慢查询和慢日志, 多表联查优化 一丶索引原理 什么是索引:       索引 ...