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,求 ...
随机推荐
- __block 与 __weak的区别理解
Blocks理解: Blocks可以访问局部变量,但是不能修改 如果修改局部变量,需要加__block __block int multiplier = 7; int (^myBlock)(int) ...
- 读书笔记 1 of Statistics :Moments and Moment Generating Functions (c.f. Statistical Inference by George Casella and Roger L. Berger)
Part 1: Moments Definition 1 For each integer $n$, the nth moment of $X$, $\mu_n^{'}$ is \[\mu_{n}^{ ...
- linux下解压war格式的包
linux解压 .war 包 war格式的包可以解决web应用程序部署时候不用按照目录层次结构部署,而是将war包当作部署单元来使用. 下面就讲下怎么去解压 .war 格式的压缩包: 1.安装jdk, ...
- 关于SQLite数据库的作业
数据库的SQL预览代码我忘了复制了 只能截图 Students表: Course表: Score表: Teachcer表:
- oracle组查询
概念: 所谓组查询即将数据按照某列或者某些列相同的值进行分组,然后对该组的数据进行组函数运用,针对每一组返回一个结果. note: 1.组函数可以出现的位置: select子句和having 子句 2 ...
- php中的匿名函数和闭包(closure)
一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...
- 关于Java项目打包
可以选择以下几种办法: 一.使用Eclipse,右键项目导出jar. 二.使用Eclipse,右键项目导出runnable jar. 三.使用Eclipse 插件fat jar,导出可执行的jar包. ...
- Ubuntu+Win7双系统grub的修复问题
最近,在grub引导的Ubuntu+Win7双系统上作业,用的是Ubuntu14.04.2.进行系统更新,更新到一般卡住了,恰好此时在进行grub相关文件的更新,我把机器重启后进入了grub resc ...
- 《BI项目笔记》历年理化指标分析Cube的建立
该系统属于数据仓库系统,与传统的管理信息系统有本质差别,是“面向主题”设计的.“面向主题”的方式,既有利于数据组织和利用,又有利于用户的理解和使用. 分析主题主要维度:烟叶级别.烟叶级别按等级信息.烟 ...
- Android Studio常见问题 -- uses-sdk:minSdkVersion 8 cannot be smaller than version 9 declared in library
问题描述 * What went wrong:Execution failed for task ':app:processDebugManifest'.> Manifest merger fa ...