3 0 0 0 3 0 1 5 0 1 0 0 1 1 0 1 0 0
Case #1: 0 0 0 Case #2: 0 1 0 2题意:给你n个操作,每次增加线段或者删除第i个增加操作中增加的线段,问你每次增加操作中,所增加的线段会覆盖多少条完整的线段。这题思路挺简单,用树状数组或者线段树进行单点更新,然后求得区间内包含的线段即可,但有两个注意点:1.每次增加线段都比之前的所有线段长,所以求区间内线段数的时候不用考虑横穿整个区间,只需考虑全部在区间内或者部分在区间内,部分在区间外的线段。2.这里的删减操作是删除第i个增加操作的线段,增加操作也是增加一条长为当前第i个增加操作的长度是i,注意是增加操作,不是总的操作!这里wa了10多次。。。#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; #define maxn 200050 struct node{ int l,r,f; }a[maxn]; int b1[2*maxn],b2[2*maxn],pos[2*maxn],caozuo[2*maxn]; int lowbit(int x){ return x&(-x); } void update1(int pos,int num){ while(pos<=2*maxn){ b1[pos]+=num;pos+=lowbit(pos); } } int getsum1(int pos){ int num=0; while(pos>0){ num+=b1[pos];pos-=lowbit(pos); } return num; } void update2(int pos,int num){ while(pos<=2*maxn){ b2[pos]+=num;pos+=lowbit(pos); } } int getsum2(int pos){ int num=0; while(pos>0){ num+=b2[pos];pos-=lowbit(pos); } return num; } int main() { int n,m,i,j,d,tot,s1,s2,t1,t2,num1=0,caozuo1; while(scanf("%d",&n)!=EOF) { tot=0;caozuo1=0; //memset(caozuo,0,sizeof(caozuo)); //memset(pos,0,sizeof(pos)); for(i=1;i<=n;i++){ scanf("%d%d",&a[i].f,&d); if(a[i].f==0){ caozuo1++;caozuo[caozuo1]=i; //caozuo++;a[i].idx=caozuo; a[i].l=d;a[i].r=d+caozuo1; tot++;pos[tot]=a[i].l; tot++;pos[tot]=a[i].r; } else if(a[i].f==1){ d=caozuo[d]; a[i].l=a[d].l;a[i].r=a[d].r; } } num1++; printf("Case #%d:\n",num1); memset(b1,0,sizeof(b1)); memset(b2,0,sizeof(b2)); sort(pos+1,pos+1+tot); m=1; for(i=2;i<=tot;i++){ if(pos[i]!=pos[m]){ m++;pos[m]=pos[i]; } } for(i=1;i<=n;i++){ if(a[i].f==0){ t1=lower_bound(pos+1,pos+m+1,a[i].l)-pos; t2=lower_bound(pos+1,pos+m+1,a[i].r)-pos; s1=getsum1(t2)-getsum1(t1-1); s2=getsum2(t2); printf("%d\n",s1-s2); update1(t1,1); update2(t1,1); update2(t2,-1); } else if(a[i].f==1){ t1=lower_bound(pos+1,pos+m+1,a[i].l)-pos; t2=lower_bound(pos+1,pos+m+1,a[i].r)-pos; update1(t1,-1); update2(t1,-1); update2(t2,1); } } } return 0; } /* 5 0 3 0 4 0 1 0 4 0 -1 */
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/kirito_acmer/article/details/47427711