HDU 3874 树状数组 边查询边更新

来源:互联网 发布:电动汽车专用单片机 编辑:程序博客网 时间:2024/06/06 08:47

树状数组的好题,

对于一对查询,边查询边更新。

那个只能出现一个这个条件就是更新

每次把上一次出现的地方的东西消灭掉,换成最新的这个地方的。

第一次做这种边查询,边更新的题目呢。

好题!

HDU 上要用 I64 代替 lld 啊 真不习惯

#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;#define MAX 1000009 #define INF 0x3f3f3f3f#define MS(x) memset(x,0,sizeof(x))#define ll __int64int pos[MAX];ll num[MAX];ll bit[MAX];ll res[MAX];bool mark[MAX];int n;struct node{int l,r,index;bool operator < (const node &o) const{return r<o.r;}}query[MAX];void add(int i,int x){while(i<=n){bit[i]+=x;i+=i&(-i);}}ll sum(int i){ll ans=0;while(i>0){ans+=bit[i];i-=(i&(-i));}return ans;}int main(){int T;freopen("acm.in","r",stdin);scanf("%d",&T);while(T--){MS(mark);MS(bit);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%I64d",&num[i]);int m;scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d",&query[i].l,&query[i].r),query[i].index=i;if(query[i].l>query[i].r)swap(query[i].l,query[i].r);}sort(query+1,query+m+1);int i=1;for(int j=1;j<=m;j++){while(i<=query[j].r){if(!mark[num[i]])add(i,num[i]),mark[num[i]]=1,pos[num[i]]=i;elseadd(pos[num[i]],-num[i]),add(i,num[i]),pos[num[i]]=i;i++;}res[query[j].index]=sum(query[j].r)-sum(query[j].l-1);}for(int i=1;i<=m;i++)printf("%I64d\n",res[i]);}return 0;}

0 0
原创粉丝点击