0
点赞
收藏
分享

微信扫一扫

Little Artem and Time Machine CodeForces - 669E

​​http://codeforces.com/problemset/problem/669/E​​

动态主席树模板题

CDQ分治也可以做 转换为三位偏序 初始给定顺序为第一维 t值为第二维 x值为第三维 代码略

#include <bits/stdc++.h>
using namespace std;

struct node1
{
int tp;
int t;
int x;
};

struct node2
{
int l;
int r;
int val;
};

node1 order[100010];
node2 tree[10000010];
int pret[100010],prex[100010],root[100010];
int q,lent,lenx,num;

int lowbit(int x)
{
return x&(-x);
}

int build(int l,int r)
{
int cur,m;
cur=num++;
if(l==r) return cur;
m=(l+r)/2;
tree[cur].l=build(l,m);
tree[cur].r=build(m+1,r);
return cur;
}

int updateII(int rot,int tar,int val,int l,int r)
{
int cur,m;
cur=num++;
tree[cur]=tree[rot];
tree[cur].val+=val;
if(l==r) return cur;
m=(l+r)/2;
if(tar<=m) tree[cur].l=updateII(tree[rot].l,tar,val,l,m);
else tree[cur].r=updateII(tree[rot].r,tar,val,m+1,r);
return cur;
}

void updateI(int tart,int tarx,int val)
{
int i;
for(i=tart;i<=lent;i+=lowbit(i)) root[i]=updateII(root[i],tarx,val,1,lenx);
}

int queryII(int rot,int tar,int l,int r)
{
int m;
if(l==r) return tree[rot].val;
m=(l+r)/2;
if(tar<=m) return queryII(tree[rot].l,tar,l,m);
else return queryII(tree[rot].r,tar,m+1,r);
}

int queryI(int tart,int tarx)
{
int res,i;
res=0;
for(i=tart;i>=1;i-=lowbit(i)) res+=queryII(root[i],tarx,1,lenx);
return res;
}

int main()
{
int i,pt,px;
scanf("%d",&q);
for(i=1;i<=q;i++)
{
scanf("%d%d%d",&order[i].tp,&order[i].t,&order[i].x);
pret[++lent]=order[i].t;
prex[++lenx]=order[i].x;
}
sort(pret+1,pret+lent+1);
sort(prex+1,prex+lenx+1);
lent=unique(pret+1,pret+lent+1)-pret-1;
lenx=unique(prex+1,prex+lenx+1)-prex-1;
root[0]=build(1,lenx);
for(i=1;i<=lent;i++) root[i]=root[0];
for(i=1;i<=q;i++)
{
pt=lower_bound(pret+1,pret+lent+1,order[i].t)-pret;
px=lower_bound(prex+1,prex+lenx+1,order[i].x)-prex;
if(order[i].tp==1) updateI(pt,px,1);
else if(order[i].tp==2) updateI(pt,px,-1);
else printf("%d\n",queryI(pt,px));
}
return 0;
}

 


举报

相关推荐

0 条评论