HDU 3854 Glorious Array(树状数组)
题意:给一些结点,每个结点是黑色或白色,并有一个权值。定义两个结点之间的距离为两个结点之间结点的最小权值当两个结点异色时,否则距离为无穷大。给出两种操作,一种是将某个结点改变颜色,另一个操作是询问当前距离小于K的结点有多少对,K是一个定值。
思路:先求最初时候小于k的结点有多少对,然后每次改变颜色的时候,统计该点左侧和右侧各有多少同色和异色的结点(这一步使用树状数组),分别处理就行。另外需要预处理离某个结点最近的两个距离小于K的结点的位置。
代码写的略乱。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<time.h>
#include<iostream>
#define INF 10000000
#define LL long long
using namespace std;
int n,K;
vector<int> vec;
];
struct BIT
{
];
void clear()
{
memset(dat,,sizeof(dat));
}
int lowBit(int x)
{
return -x&x;
}
int getSum(int x)
{
;
)
{
s+=dat[x];
x-=lowBit(x);
}
return s;
}
void addVal(int x,int c)
{
) return;
while(x<=n)
{
dat[x]+=c;
x+=lowBit(x);
}
}
void setVal(int x,int c)
{
);
addVal(x,-old+c);
}
int getCol(int x)
{
);
}
int countBlack(int ql,int qr)
{
;
);
}
int countWhite(int ql,int qr)
{
;
int s=countBlack(ql,qr);
-s;
}
};
BIT tree;
],rightM[];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int m;
scanf("%d%d%d",&n,&m,&K);
vec.clear();
; i<=n; ++i)
{
int val;
scanf("%d",&val);
if(val<K)
vec.push_back(i);
}
tree.clear();
; i<=n; ++i)
{
int val;
scanf("%d",&val);
tree.setVal(i,val);
;
int r=lower_bound(vec.begin(),vec.end(),i)-vec.begin();
) leftM[i]=-;
else leftM[i]=vec[l];
;
else rightM[i]=vec[r];
}
LL sum=;
,end;
; i<vec.size(); ++i)
{
last=(i==)?:vec[i-]+;
end=(i==vec.size()-)?n:vec[i+];
LL lb=tree.countBlack(last,vec[i]-),rw=tree.countWhite(vec[i]+,n);
LL lw=tree.countWhite(last,vec[i]-),rb=tree.countBlack(vec[i]+,n);
sum+=lb*rw;
sum+=lw*rb;
int col=tree.getCol(vec[i]);
)
sum+=lb+rb;
else
sum+=lw+rw;
}
while(m--)
{
int p;
scanf("%d",&p);
) printf("%I64d\n",sum);
else
{
int x;
scanf("%d",&x);
int old=tree.getCol(x);
)
{
)
{
LL lw,lb;
if(leftM[x]==x)
{
lw=tree.countWhite(,leftM[x]-);
lb=tree.countBlack(,leftM[x]-);
}
else
{
lw=tree.countWhite(,leftM[x]);
lb=tree.countBlack(,leftM[x]);
}
sum-=lw;
sum+=lb;
}
)
{
LL rw,rb;
if(rightM[x]==x)
{
rb=tree.countBlack(rightM[x]+,n);
rw=tree.countWhite(rightM[x]+,n);
}
else
{
rb=tree.countBlack(rightM[x],n);
rw=tree.countWhite(rightM[x],n);
}
sum-=rw;
sum+=rb;
}
}
else
{
)
{
LL lw,lb;
if(leftM[x]==x)
{
lw=tree.countWhite(,leftM[x]-);
lb=tree.countBlack(,leftM[x]-);
}
else
{
lw=tree.countWhite(,leftM[x]);
lb=tree.countBlack(,leftM[x]);
}
sum+=lw;
sum-=lb;
}
)
{
LL rw,rb;
if(rightM[x]==x)
{
rb=tree.countBlack(rightM[x]+,n);
rw=tree.countWhite(rightM[x]+,n);
}
else
{
rb=tree.countBlack(rightM[x],n);
rw=tree.countWhite(rightM[x],n);
}
sum+=rw;
sum-=rb;
}
}
tree.setVal(x,old^);
}
}
}
;
}
HDU 3854 Glorious Array(树状数组)的更多相关文章
- hdu 5775 Bubble Sort 树状数组
Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- HDU 3333 Turing Tree (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...
- HDU 4638 Group 【树状数组,分块乱搞(莫队算法?)】
根据题目意思,很容易得出,一个区间里面连续的段数即为最少的group数. 题解上面给的是用树状数组维护的. 询问一个区间的时候,可以一个一个的向里面添加,只需要判断a[i]-1 和 a[i]+1是否已 ...
- HDU 4325 Flowers(树状数组+离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...
- HDU - 1541 Stars 【树状数组】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...
- HDU 3874 Necklace (树状数组 | 线段树 的离线处理)
Necklace Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- HDU 5101 Select --离散化+树状数组
题意:n 组,每组有一些值,求 在不同的两组中每组选一个使值的和大于k的方法数. 解法:n * Cnt[n] <= 1000*100 = 100000, 即最多10^5个人,所以枚举每个值x,求 ...
随机推荐
- Git入门教程
参考文献: 1. Pro Git 2. Git教程 3. Git教程 4. 图解Git
- [已解决] windows 80端口被占用
看下是不是IIS开着,如果是关掉就OK拉 原文地址:http://www.cnblogs.com/gifisan/p/5822156.html
- hdu 5779 Tower Defence
题意:考虑由$n$个结点构成的无向图,每条边的长度均为$1$,问有多少种构图方法使得结点$1$与任意其它节点之间的最短距离均不等于$k$(无法到达时距离等于无穷大),输出答案对$1e9+7$取模.$1 ...
- Oracle、Microsoft SQL Server、Mysql
数据库对比.----1.Oracle:最贵,功能最多,安装最不方便,Oracle环境里的其他相关组件最多,支持平台数量一般,使用中等方便,开发中等方便,运维中等方便,不开源,速度最慢,最安全.---- ...
- Unity3D之协程(Coroutines & Yield )
在Unity中StartCoroutine/yield return这个模式到底是怎么应用的? 比如你要一个方法进行一个比较耗时的复杂运算~同时又想让脚本流畅的进行其他操作而不是卡在那里等该方法执行完 ...
- javascript guid(uuid)
http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript function generateU ...
- remot debug
哎,首先吐槽一下,尼玛这是什么编辑器居然不能直接复制粘贴我写好的东西,废话不多说.为什么可以远程调试呢?首先JAVA运行依赖JVM,所以你可以把这种 远程debug想象成两个或者多个JVM之间按照约定 ...
- JavaEE开发环境搭建(2)---(MySQL的安装)
上次写了JavaEE开发环境搭建之jdk的安装...然后自己看的时候感觉有时候加载图片不是很流畅,所以这次就少添加点图片了~~ JavaEE开发环境搭建之MySQL的安装 1:mysql 的下载 在百 ...
- C语言中system()函数的用法总结(转)
system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait ...
- MySQL学习笔记--数据类型
一.数据类型(内容参考<SQL学习指南>)不完整 1.文本类型 文本类型 最大字节数 tinytext 255 text 65535 varchar 65536 mediumtext 16 ...