XMU 1607 nc与点对距离 【线段树】
1607: nc与点对距离
Time Limit: 5000 MS Memory Limit: 512 MB
Submit: 60 Solved: 8
[Submit][Status][Web Board]Description
nc最近很无聊~所以他总是想各种有趣的问题来打发时间。
nc在地上画了一条一维坐标轴,坐标轴上有n个点。第一个点的坐标为 x1,第二个点坐标为 x2,....第n个点的坐标为 xn。他想对这些点进行如下两种操作:
(1)给定两个值p和d,将第p个点的坐标移动到 xp+d。等价于如下赋值语句xp=xp+d
(2)给定一个区间[l,r],计算在此处区间内,所有点对的距离的和。即要求输出以下式子的大小:
请你帮帮他。Input
第一行包含1个整数n,表示有n个点(1<=n<=10^5)。
第二行包含n个数字,分别表示x1,x2,...xn。(|xi| ≤ 10^9).
第三行包含1个整数m,表示m种操作(1<=m<=10^5),表示有m个询问。
以下m行,每行表示一个询问,每一行第一个数为t:
若t=1,则表示操作(1),其后有两个数字,分别为p和d。(其中1<=p<=n, |d|<=1000)
若t=2,则表示操作(2),其后有两个数字,分别为l和r。(其中-10^9<=l<=r<=10^9)
输入保证在任意时刻,都不会出现点xi出现在同一个位置的情况。Output
每一个操作(2),输入其答案。
Sample Input
8
36 50 28 -75 40 -60 -95 -48
20
2 -61 29
1 5 -53
1 1 429
1 5 130
2 -101 -71
2 -69 53
1 1 404
1 5 518
2 -101 53
2 50 872
1 1 -207
2 -99 -40
1 7 -389
1 6 -171
1 2 464
1 7 -707
1 1 -730
1 1 560
2 635 644
1 7 -677Sample Output
176
20
406
1046
1638
156
0HINT
Source
题目链接:
http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1607
题目大意:
一开始给N个坐标x[i],接下来有两种操作:
1给定两个值p和d,将第p个点的坐标移动到 xp+d。等价于如下赋值语句xp=xp+d
2给定一个区间[l,r],计算在此处区间内,所有点对的距离的和。即要求输出以下式子的大小: 
题目思路:
【线段树】
题目看上去就是线段树的套路。
这题由于坐标范围很大,不能直接开数组。可选的方法是离散化或者new。
(一开始一个节点,表示的区间为-MAX~MAX,有用到的点就依次往下扩展为(l,mid)和(mid+1,r),一条树链最多log个节点,所以总结点数为mlogm)。
对于操作1,我们先将原先的xp从线段树中删除,然后再把xp+d插入线段树。并进行维护。
对于操作2,要求解[l,r]的点对和,首先需要记录几个值:(以下出现的点表示的是 X坐标含在这个区间的点)
lc,rc表示当前节点的左右儿子,表示的区间为[l,mid]和[mid+1,r]
tol表示当前区间内所有出现的点到l的距离和,tor表示当前区间内所有出现的点到r的距离和
sum表示[l,r]里出现的点的点对距离和,sz表示[l,r]内出现的点的个数
维护的时候tol和tor的维护很容易就推出来。sum的维护稍微麻烦点,但是模拟3个点和3个点合并的过程,也还是不难推的。(具体见代码)
求解的时候,需要记录当前这个节点的左右儿子的满足在[l,r]区间内的tol,tor,sz,sum值,并按照维护的求法求得最终的sum。
/****************************************************
Author : Coolxxx
Copyright 2017 by Coolxxx. All rights reserved.
BLOG : http://blog.csdn.net/u010568270
****************************************************/
#include<bits/stdc++.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define mem(a,b) memset(a,b,sizeof(a))
const double EPS=1e-;
const int J=;
const int MOD=;
const int MAX=0x7f7f7f7f;
const double PI=3.14159265358979323;
const int N=;
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
int n,m,lll,ans;
LL p[N];
struct xxx
{
LL l,r,sum,tol,tor,sz;
xxx *lc,*rc;
xxx()
{
l=r=sum=tol=tor=sz=;
lc=rc=NULL;
}
xxx(LL ll,LL rr)
{
l=ll;r=rr;
sum=tol=tor=sz=;
lc=rc=NULL;
}
void expand()
{
if(lc!=NULL || rc!=NULL)return;
if(l>=r)return;
LL mid=(l==r-)?l:(l+r)/;
lc=new xxx(l,mid);
rc=new xxx(mid+,r);
}
void Insert(LL pos)
{
if(pos<l || r<pos)return;
if(l==r && l==pos)
{
sz++;
return;
}
expand();
lc->Insert(pos);
rc->Insert(pos);
maintain();
}
void Delete(LL pos)
{
if(pos<l || r<pos)return;
if(l==r && l==pos)
{
sz--;
return;
}
lc->Delete(pos);
rc->Delete(pos);
maintain();
if(!lc->sz && !rc->sz)
{
delete lc,rc;
lc=rc=NULL;
}
}
void maintain()
{
sz = lc->sz + rc->sz;
tol = lc->tol + rc->tol + rc->sz * (rc->l - lc->l);
tor = rc->tor + lc->tor + lc->sz * (rc->r - lc->r);
sum = lc->sum + rc->sum + lc->sz * rc->tol + rc->sz * lc->tor + lc->sz * rc->sz; //(rc->l - lc->r)=1;
}
LL query(LL a,LL b,LL &num,LL &lsum,LL &rsum)
{
if(a<=l && r<=b)
{
lsum=tol;
rsum=tor;
num=sz;
return sum;
}
if(b<l || r<a)
{
lsum=rsum=num=;
return ;
}
expand();
LL lnum,rnum,llsum,rlsum,lrsum,rrsum;
lsum = lc->query(a,b,lnum,llsum,lrsum);
rsum = rc->query(a,b,rnum,rlsum,rrsum);
num = lnum + rnum;
aans = lsum + rsum + rnum * lrsum + lnum * rlsum + lnum * rnum;
lsum = llsum + rlsum + rnum * (rc->l - lc->l);
rsum = lrsum + rrsum + lnum * (rc->r - lc->r);
return aans;
}
};
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
LL x,y,z,xx,yy;
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
while(~scanf("%d",&n))
{
xxx *t=new xxx(-2e9,2e9);
for(i=;i<=n;i++)
{
scanf("%lld",&p[i]);
t->Insert(p[i]);
}
scanf("%d",&m);
for(i=;i<=m;i++)
{
scanf("%d%lld%lld",&cass,&x,&y);
if(cass==)
{
t->Delete(p[x]);
p[x]+=y;
t->Insert(p[x]);
}
else
printf("%lld\n",t->query(x,y,z,xx,yy));
}
delete t;
}
return ;
}
/*
//
//
*/
XMU 1607 nc与点对距离 【线段树】的更多相关文章
- ACM-ICPC 2018 沈阳赛区现场赛 E. The Kouga Ninja Scrolls (切比雪夫距离+线段树)
题目链接: 题意:在二维平面上有 n 个人,每个人有一个位置(xi, yi)和门派 ci,m 个操作:①改变第 k 个人的位置:②改变第 k 个人的门派:③询问区间[l,r]之间不同门派的两个人的最大 ...
- Codeforces 1093G题解(线段树维护k维空间最大曼哈顿距离)
题意是,给出n个k维空间下的点,然后q次操作,每次操作要么修改其中一个点的坐标,要么查询下标为[l,r]区间中所有点中两点的最大曼哈顿距离. 思路:参考blog:https://blog.csdn.n ...
- Gym - 101955E The Kouga Ninja Scrolls (曼哈顿距离变换+线段树)
题意:有n个忍者(编号为1-n),每个忍者有三个属性:横坐标x,纵坐标y,所属门派c,要求支持三种操作: 1.改变第k个忍者的位置 2.改变第k个忍者的门派 3.查询编号为[l,r]之间的忍者中,所属 ...
- 线段树区间合并+k维空间的曼哈顿距离——cf1093G好题
和去年多校的CSGO一样,用状态压缩来求Manhattan距离的最大值 然后要用线段树维护一下区间最大值 /* k维空间给定n个点,两个操作 1 i b1 b2 .. bk : 修改第i个点的坐标 2 ...
- LOJ.6073.[2017山东一轮集训Day5]距离(可持久化线段树 树链剖分)
题目链接 就是恶心人的,简单写写了...(似乎就是[HNOI2015]开店?) 拆式子,记\(dis_i\)为\(i\)到根节点的路径权值和,\(Ans=\sum dis_{p_i}+\sum dis ...
- BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP
题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...
- 【ZJOI2017】线段树
题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的 功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜又开始研究起线段树来了,有所不同的是,她把目光放 ...
- 【BZOJ3730】震波 动态树分治+线段树
[BZOJ3730]震波 Description 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土 ...
- [Nowcoder113E]弹球弹弹弹_线段树
弹球弹弹弹 题目大意:有n个位置,标号为1到n的整数,m次操作,第i次操作放置一个弹球在b[i] xor c[i-1]处,并询问b[i] xor c[i-1]处弹球个数c[i]每次操作后,在x处的弹球 ...
随机推荐
- NYOJ 239 月老的难题
月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福 ...
- 77. Spring Boot Use Thymeleaf 3【从零开始学Spring Boot】
[原创文章,转载请注明出处] Spring Boot默认选择的Thymeleaf是2.0版本的,那么如果我们就想要使用3.0版本或者说指定版本呢,那么怎么操作呢?在这里要说明下 3.0的配置在spri ...
- CodeForces230A
题目大意: 一个打恐龙的游戏,有初始体力s,和恐龙n只,然后输入n只恐龙的体力xi,和击杀它得到的奖励体力yi,只有自身体力大于恐龙体力时才能进行击杀,击杀恐龙的顺序可以不定 这题运用到了贪心的思想, ...
- 【网络流】【待补】C. Heidi and Library (hard)
http://codeforces.com/contest/802/problem/C
- 【贪心】codeforces A. Heidi and Library (easy)
http://codeforces.com/contest/802/problem/A [题意] 有一个图书馆,刚开始没有书,最多可容纳k本书:有n天,每天会有人借一本书,当天归还:如果图书馆有这个本 ...
- Hihocoder #1067 : 最近公共祖先·二
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中 ...
- php 翻转字符串
//方法一 function strrev_charset($string,$charset='utf-8'){ if(!is_string($string) || !mb_check_encodin ...
- Codeforces 659B Qualifying Contest【模拟,读题】
写这道题题解的目的就是纪念一下半个小时才读懂题...英文一多读一读就溜号... 读题时还时要静下心来... 题目链接: http://codeforces.com/contest/659/proble ...
- I NEED A OFFER!---hdu1203(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=1203 Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考 ...
- python 爬虫(转,我使用的python3)
原文地址:http://blog.csdn.net/pi9nc/article/details/9734437 [Python]网络爬虫(一):抓取网页的含义和URL基本构成 分类: 爬虫 Pyt ...