CF757G Can Bash Save the Day?
CF757G Can Bash Save the Day?
#include<bits/stdc++.h>
#define RG register
#define IL inline
#define _ 200100
#define ycb (1<<30)
#define ll long long
using namespace std;
IL int gi(){
RG int data = 0 , m = 1; RG char ch = 0;
while(ch != '-' && (ch<'0' || ch > '9')) ch = getchar();
if(ch == '-'){m = 0; ch = getchar();}
while(ch>='0' && ch<='9'){data = (data<<1) + (data<<3) + ch - '0' ; ch = getchar();}
return (m) ? data : -data ;
}
int fa[_],son[_],sz[_],dep[_],dfn[_],top[_];
struct YCB{int ls,rs; ll tag,sum;} t[120*_] ; int n,Q,a[_],rt[_],tot;
struct Road{int to,next,w;}edg[2*_] ; int head[_],cnt; ll dis[_],bit[_],ans,predist[_];
IL void add(int u,int v,int w){
edg[++cnt] = (Road){v , head[u] , w} ; head[u] = cnt ;
}
void dfs1(int u,int fth,ll dist){
fa[u] = fth; dis[u] = dist;
son[u] = 0; sz[u] = 1;
for(int i = head[u]; i; i = edg[i].next){
int v = edg[i].to;
if(v == fth)continue;
dfs1(v,u,dist + edg[i].w);
if(!son[u] || sz[son[u]] < sz[v])son[u] = v;
sz[u] = sz[u] + sz[v];
}
}
void dfs2(RG int u,RG int upp){
top[u] = upp; dfn[u] = ++cnt;
predist[cnt] = predist[cnt-1] + dis[u] - dis[fa[u]] ;
if(son[u]) dfs2(son[u] ,upp) ; else return ;
for(RG int i = head[u] ; i ; i = edg[i].next){
RG int v = edg[i].to;
if(v == fa[u] || v == son[u]) continue;
if(v != son[u]) dfs2(v , v) ;
}return ;
}
IL void Pre(){
n = gi(); Q = gi();
for(RG int i = 1; i <= n; i ++) a[i] = gi() ;
for(RG int i = 1,u,v,w; i <= n-1; i ++)
u = gi() , v = gi() , w = gi() , add(u,v,w) , add(v,u,w) ;
dfs1(1,0,0); cnt = 0; dfs2(1,1);
}
IL void Ins(int x,ll d){while(x<=n)bit[x] += d , x += (x&-x); }
IL ll get(int x){RG ll ret = 0; while(x)ret += bit[x] , x -= (x&-x); return ret ; }
void Build(int &o,int l,int r){
o = ++ tot;
t[o].tag = t[o].sum =0; if(l == r)return ;
RG int mid = (l + r) >> 1;
Build(t[o].ls , l , mid) ; Build(t[o].rs , mid + 1 , r) ;
}
void Update(int &o,int l,int r,int ql,int qr){
t[++tot] = t[o]; o = tot;
if(ql == l && r == qr){t[o].tag++; return ; }
t[o].sum += predist[qr] - predist[ql-1] ;
RG int mid = (l + r) >> 1;
if(qr <= mid) Update(t[o].ls , l , mid , ql , qr) ;
else if(ql > mid) Update(t[o].rs , mid + 1, r , ql , qr) ;
else Update(t[o].ls,l,mid,ql,mid) , Update(t[o].rs,mid+1,r,mid+1,qr) ;
}
ll Query(int o,int l,int r,int ql,int qr){
RG ll dt = 1ll * t[o].tag * (predist[qr]-predist[ql-1]) ;
if(ql == l && r == qr) return t[o].sum + dt;
RG int mid = (l + r) >> 1;
if(qr <= mid) return dt + Query(t[o].ls , l , mid , ql , qr) ;
if(ql > mid) return dt + Query(t[o].rs , mid + 1 , r , ql , qr) ;
return dt + Query(t[o].ls , l , mid , ql , mid) + Query(t[o].rs , mid + 1, r , mid + 1, qr);
}
IL void Modify_Pre(int P,int p){
while(top[p] ^ 1)
Update(rt[P] , 1 , n , dfn[top[p]] , dfn[p]) ,
p = fa[top[p]] ;
if(p ^ 1) Update(rt[P] , 1 , n , dfn[son[1]] , dfn[p]) ;
}
IL ll Calc_Pre(int root,int p){
RG ll ret = 0;
while(top[p] ^ 1)
ret = ret + Query(root , 1 , n , dfn[top[p]] , dfn[p]) ,
p = fa[top[p]] ;
if(p ^ 1) ret += Query(root , 1 , n , dfn[son[1]] , dfn[p]) ;
return ret ;
}
int main(){
Pre();
Build(rt[0] , 1 , n) ;
for(RG int i = 1; i <= n; i ++)
rt[i] = rt[i-1] , Modify_Pre(i , a[i]) ;
for(RG int i = 1; i <= n; i ++) Ins(i , dis[a[i]]) ;
RG int opt,l,r,x;
ans = 0;
while(Q--){
opt = gi();
if(opt == 2) x = gi() ;
else l = gi() , r = gi() , x = gi() ;
l = (ans % ycb) ^ l ;
r = (ans % ycb) ^ r ;
x = (ans % ycb) ^ x ;
if(l > r) swap(l , r) ;
if(opt == 1){
ans = 0;
ans += 1ll * (r-l+1) * dis[x] ;
ans += get(r) - get(l-1) ;
ans -= 1ll * 2 * (Calc_Pre(rt[r] , x) - Calc_Pre(rt[l-1] , x));
printf("%lld\n" , ans) ;
}
else if(opt == 2){
rt[x] = rt[x-1] ;
Modify_Pre(x , a[x+1]) ;
Ins(x , -dis[a[x]]); Ins(x+1 , -dis[a[x+1]]);
swap(a[x] , a[x+1]) ;
Ins(x , dis[a[x]]) ; Ins(x+1 , dis[a[x+1]]) ;
}
}return 0;
}
CF757G Can Bash Save the Day?的更多相关文章
- 【CF757G】Can Bash Save the Day? 可持久化点分树
[CF757G]Can Bash Save the Day? 题意:给你一棵n个点的树和一个排列${p_i}$,边有边权.有q个操作: 1 l r x:询问$\sum\limits_{i=l}^r d ...
- [Codeforces757G]Can Bash Save the Day?——动态点分治(可持久化点分树)
题目链接: Codeforces757G 题目大意:给出一棵n个点的树及一个1~n的排列pi,边有边权,有q次操作: 1 l r x 求 $\sum\limits_{i=l}^{r}dis(p_{i} ...
- alfresco install in linux, and integrated with tesseract ocr
本文描述在Linux系统上安装Alfresco的步骤: 1. 下载安装文件:alfresco-community-5.0.d-installer-linux-x64.bin 2. 增加执行权限并执行: ...
- Docker详解(上)
Docker 学习 Docker概述 Docker安装 Docker命令 镜像命令 容器命令 操作命令 ... Docker镜像 容器数据卷 DockerFile Docker网络原理 IDEA整合D ...
- cmder git bash 使用
cmder 是一款 windows 下的命令集合软件,它可以集合各种系统下的命令,并且操作非常快速方便. 安装有两个版本,一个是简化版(4.27M),一个是完全版(75.7M),它们的唯一区别:完全版 ...
- read name 和 read 在 Bash 中的区别
read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已: $ read name 1 $ echo "$name" 1 $ read 1 $ echo ...
- How can i use iptables save on centos 7?
I installed CentOS 7 with minimal configuration (os + dev tools). I am trying to open 80 port for ht ...
- Git bash 配置ssh key
问题描述 昨天为了配置Qt create中的Git,把我一直在使用的Github删除了,今本以为,这样git的一些配置还在,可是,今天上传一些提交的时候,提示我,git没有密钥.梳理一下,这个简单的配 ...
- 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使 ...
随机推荐
- Redis系列三 Redis数据类型
一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...
- pycharm 3.4 亲测可使用到2019年2月的注册码,要用者从速
注册码: D87IQPUU3Q-eyJsaWNlbnNlSWQiOiJEODdJUVBVVTNRIiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1l ...
- 为什么说session依赖cookie,以及cookie的常用知识
session的用法 session在Flask中通常用做设置某些页面的权限,比如某些页面必须要登录才可以看到,登录的信息或标志就放到session中.它的使用过程如下: 在整个flask工程的启动文 ...
- lintcode373 奇偶分割数组
奇偶分割数组 分割一个整数数组,使得奇数在前偶数在后. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]. 我的方法:设定两个数组,分别 ...
- IMX6移植htop
top命令查看CPU利用率并不是很方便,因此打算移植htop到imx6上,主要包括以下几个步骤: - 资源下载 htop 下载http://hisham.hm/htop/releases/1.0.1/ ...
- JS判断是IOS还是Android以及如何解决h5打包后在ios下内容与状态栏重叠问题
h5打包后在ios下内容与状态栏重叠问题: 1:知道设备的类型: var u = navigator.userAgent, app = navigator.appVersion; var isAndr ...
- 自测之Lesson6:文件I/O
题目:区分文件I/O和标准I/O. 区别: ①首先两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区), ...
- QT界面绘制学习记录
1. MVC结构中,model必须作为类的成员变量存在,不可再函数内部申明.否则,会出现函数调用结束,model找不到的错误. 2.QcomboBox可设置为左边空白,右侧一小箭头的形式.代码:com ...
- iOS- Exception异常处理
1.Exception 前言 在iOS里对异常的处理及捕获,并没有其它语言里那么常见,相信很多iOS程序员都知道,更多的时候是对内存的的检测与分析,检测相关内存方面的问题. 而在app闪退并不是因为内 ...
- 【OSG】运行OSG示例出现的奶牛不完整问题
发现一个很奇怪的问题:我用笔记本运行OSG里面的示例,出现的图案总是不完整显示的,以经典的奶牛图案为例,如图. 图一是我电脑上的情况,正常情况应该是图二.不知道这是什么原因,难道是我电脑显卡的原因吗? ...