对于一对 $(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. Webstorm关闭ESLint警告

    使用Webstorm新创建的VUE项目在npm run dev的时候老是报各种格式问题i:比如多个一个空格?多了一行?分号问题?.....简直是受不鸟... 是因为你使用了eslint,这个是esli ...

  2. [笔记] 二级指针(pointer to pointer)

    // 1.pointer to pointer.cpp #include "stdafx.h" #include <stdlib.h> int _tmain(int a ...

  3. 我的第一个netcore2.2 api项目搭建(一)

    早早就想入门netcore,一直没下定决心,这次正好碰上项目服务变更,便想着入坑试试,边学边用. 目标: 一.api使用core版的SqlSugar,集成orm,实现快速开发 二.api使用Swagg ...

  4. Spring Security 解析(七) —— Spring Security Oauth2 源码解析

    Spring Security 解析(七) -- Spring Security Oauth2 源码解析   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因 ...

  5. Springboot - java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml'

    Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning a simple key in 'reader', lin ...

  6. FullCalendar日历插件说明文档(看到这篇手册,解决了困扰我3天的js问题)

    FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...

  7. Nginx中的break和last

    rewrite中的break和last 两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite.return指令). 示 ...

  8. WinExec, ShellExecute,CreateProcess 区别

    其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂. WinExec 有两个参数,前一个指定路径,后一个指定显示方式. ShellExe ...

  9. Microsoft SQL Server数据库语法

    目录   关于数据库的语法: 1.创建数据库 create database 数据库名on primary(主文件属性(name,filename,size等)) -用逗号隔开次要主要文件和次要文件( ...

  10. GitHub Python项目推荐|瓦力Devops开源项目代码部署平台持续部署

    GitHub Python项目推荐|walle - 瓦力 Devops开源项目代码部署平台 项目热度 标星(star):8418 (很不错的实用项目,大神作品,建议关注) 标星趋势 关注(watch) ...