BZOJ 4012权限题

浙科协的网突然炸了,好慌……

据说正解是动态点分治,然而我并不会,我选择树链剖分 + 主席树维护。

设$dis_i$表示$i$到$root(1)$的值,那么对于一个询问$u$,答案为$\sum_{i = 1}^{n}dis_i + n * dis_u - 2 * \sum_{i = 1}^{n}dis_{lca(i, u)}$。

前两个东西很好维护,我们考虑如何维护后面这个$\sum$,对于每一个点我们可以把它到根跳一跳,然后把这个点对答案的贡献加到线段树中,如果再限定一个$[l, r]$的区间,只要把所有年龄排序从小到大排序按照贡献加到主席树中就可以了。

注意一条树链的贡献和线段树上区间的边界要搞清楚。

主席树标记永久化一下比较好,虽然感觉空间是开不下的,但是这题就这么过去了。

时间复杂度$O((n + q)log^2n)$。

Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll; const int N = 1.5e5 + ;
const int M = 1e7 + ;
const int inf = << ; int n, qn, tot = , head[N], dfsc = , dep[N];
int top[N], fa[N], siz[N], son[N], id[N];
ll P, dis[N], toVal[N], sumE[N], sumDis[N]; struct Edge {
int to, nxt;
ll val;
} e[N << ]; inline void add(int from, int to, ll val) {
e[++tot].to = to;
e[tot].val = val;
e[tot].nxt = head[from];
head[from] = tot;
} struct Item {
int age, id; friend bool operator < (const Item &x, const Item &y) {
if(x.age == y.age) return x.id < y.id;
else return x.age < y.age;
} } a[N]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void swap(int &x, int &y) {
int t = x; x = y; y = t;
} inline int max(int x, int y) {
return x > y ? x : y;
} inline int min(int x, int y) {
return x > y ? y : x;
} void dfs1(int x, int fat, int depth, ll nowDis) {
fa[x] = fat, dep[x] = depth;
siz[x] = , dis[x] = nowDis;
int maxson = -;
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(y == fat) continue;
dfs1(y, x, depth + , nowDis + e[i].val); toVal[y] = e[i].val;
siz[x] += siz[y]; if(siz[y] > maxson) {
maxson = siz[y];
son[x] = y;
}
}
} void dfs2(int x, int topf) {
top[x] = topf, sumE[id[x] = ++dfsc] = toVal[x];
if(!son[x]) return;
dfs2(son[x], topf);
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(y == fa[x] || y == son[x]) continue;
dfs2(y, y);
}
} namespace PSegT {
struct Node {
int lc, rc;
ll sum, cnt;
} s[M]; int root[N], nodeCnt = ; #define lc(p) s[p].lc
#define rc(p) s[p].rc
#define sum(p) s[p].sum
#define cnt(p) s[p].cnt
#define mid ((l + r) >> 1) void ins(int &p, int l, int r, int x, int y, int pre) {
s[p = ++nodeCnt] = s[pre];
if(x <= l && y >= r) {
++cnt(p);
return;
}
sum(p) += sumE[min(y, r)] - sumE[max(x, l) - ]; if(x <= mid) ins(lc(p), l, mid, x, y, lc(pre));
if(y > mid) ins(rc(p), mid + , r, x, y, rc(pre));
} ll query(int p, int l, int r, int x, int y) {
ll res = 1LL * cnt(p) * (sumE[min(y, r)] - sumE[max(x, l) - ]);
if(x <= l && y >= r) return res + sum(p); if(x <= mid) res += query(lc(p), l, mid, x, y);
if(y > mid) res += query(rc(p), mid + , r, x, y); return res;
} } using namespace PSegT; inline void modify(int rt, int x) {
for(; x; x = fa[top[x]])
ins(root[rt], , n, id[top[x]], id[x], root[rt]);
} inline ll solve(int rt, int x) {
ll res = 0LL;
for(; x; x = fa[top[x]])
res += query(root[rt], , n, id[top[x]], id[x]);
return res;
} int main() {
// freopen("Sample.txt", "r", stdin); read(n), read(qn), read(P);
for(int i = ; i <= n; i++) {
read(a[i].age);
a[i].id = i;
} for(int i = ; i < n; i++) {
int x, y; ll v;
read(x), read(y), read(v);
add(x, y, v), add(y, x, v);
}
dfs1(, , , 0LL), dfs2(, ); /* for(int i = 1; i <= n; i++)
printf("%d ", top[i]);
printf("\n"); */ sort(a + , a + + n);
for(int i = ; i <= n; i++) {
sumE[i] += sumE[i - ];
sumDis[i] = sumDis[i - ] + dis[a[i].id];
}
for(int i = ; i <= n; i++) {
root[i] = root[i - ];
modify(i, a[i].id);
} /* for(int i = 1; i <= n; i++)
printf("%lld ", sumE[i]);
printf("\n");
for(int i = 1; i <= n; i++)
printf("%lld ", sumDis[i]);
printf("\n"); */ ll ans = 0LL;
for(int x, l, r; qn--; ) {
read(x), read(l), read(r);
l = (1LL * l + ans) % P, r = (1LL * r + ans) % P;
if(l > r) swap(l, r); l = lower_bound(a + , a + + n, (Item) {l, }) - a;
r = upper_bound(a + , a + + n, (Item) {r, inf}) - a - ; ans = 1LL * (r - l + ) * dis[x] + sumDis[r] - sumDis[l - ] - 2LL * (solve(r, x) - solve(l - , x));
printf("%lld\n", ans);
} return ;
}

Luogu 3241 [HNOI2015]开店的更多相关文章

  1. luogu 3241 [HNOI2015]开店 动态点分治+二分+vector

    独立写出来+想出来的,1.5h就切了~ 建立点分树,然后用 $vector$ 暴力存所有子节点,然后二分一下子就可以了. #include <cstdio> #include <ve ...

  2. luogu P3241 [HNOI2015]开店

    传送门 (下面记年龄为\(a_x\))题目要求的是\[\sum_{x=1}^{n} [a_x\in [l,r]]*dis(x,u)=\sum_{x=1}^{n} [a_x\in [l,r]]*de_x ...

  3. [HNOI2015]开店 树链剖分,主席树

    [HNOI2015]开店 LG传送门 蒟蒻表示不会动态淀粉质. 先把点按年龄排序, 设\(dis[i]\)表示\(i\)到根的距离. 把我们要算的东西稍微变下形:\(ans\) \[ = \sum \ ...

  4. 洛谷 P3241 [HNOI2015]开店 解题报告

    P3241 [HNOI2015]开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱. 这样的想法当然非 ...

  5. [BZOJ4012][HNOI2015]开店(动态点分治,树链剖分)

    4012: [HNOI2015]开店 Time Limit: 70 Sec  Memory Limit: 512 MBSubmit: 2168  Solved: 947[Submit][Status] ...

  6. 【BZOJ4012】[HNOI2015]开店 动态树分治+二分

    [BZOJ4012][HNOI2015]开店 Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点 ...

  7. BZOJ4012 [HNOI2015]开店

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

  8. bzoj 4012: [HNOI2015]开店

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

  9. bzoj 4012: [HNOI2015]开店 主席树

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

随机推荐

  1. 11.7noip模拟赛

     题解:广义斐波那契数列 矩阵乘法 #include<iostream> #include<cstdio> #include<cstring> #define LL ...

  2. 泛型List<T>排序(利用反射)

    在最近一个项目中,有需求要对页面中所有的gridview添加排序功能.由于gridview的数据源绑定的是一个集合类List,而不是DataTable,所以无法使用DataView排序功能.另外,不同 ...

  3. 开发沉思录 - 记大数据平台的一次 BUG井喷

    研究REST提交重启:终于提交成功了,首先一个错误:地址IP地址的http://hdp0:8080/api/v1/clusters/HDP/requests ,被我错误写成了request,当误了大量 ...

  4. php通过时间戳处理时间!

    1.获取当前时间方法date() 很简单,这就是获取时间的方法,格式为:date(format,format,timestamp),format为格式.timestamp为时间戳–可填参数. 2.获取 ...

  5. linux(6)

    第十五单元 软件包的管理 [本节内容]1. 使用RPM安装及移除软件(详见linux系统管理P374)1) 掌握RPM的定义:RPM就是Red Hat Package Manger(红帽软件包管理工具 ...

  6. ZipArchive扩展的使用和Guzzle依赖的安装使用

    在项目开发的过程中,需要去远程下载录音文件 然后保存到自己的项目中,然后再把录音文件压缩打包,最后再下载给用户 1.Guzzle依赖的安装 guzzle官方文档:http://guzzle-cn.re ...

  7. 你知道PORT吗?

    在TCP协议中,有端口(PORT)的概念,很多人都不知道端口到底是什么.之前介绍过物理地址,也就是网卡地址,做个不恰当的比喻,物理地址(MAC)地址,相当于身份证(唯一),家庭地址是几幢几单元相当于I ...

  8. 【转】性能测试工具JMeter的使用技巧

    在这此对新版本jmeter的学习+温习的过程,发现了一些以前不知道的功能,所以,整理出来与大分享.本文内容如下. 1.如何使用英文界面的jmeter 2.如何使用镜像服务器 3.Jmeter分布式测试 ...

  9. juc线程池原理(三):ThreadFactory、拒绝策略、提交任务、关闭线程池

    概要 (一) ThreadFactory 线程池中的ThreadFactory是一个线程工厂,线程池创建线程都是通过线程工厂对象(threadFactory)来完成的. 类图如下: 上面所说的thre ...

  10. postgresql 9.5 pgpool 主从复制 以及错误解决

    PostgreSQL+pgpool-II复制方案 这里不做功能的描述,只写搭建的过程和遇到的一些问题 1 系统 [root@mysqlhq ~]# cat /etc/redhat-release Ky ...