Flowers&&树状数组+离散化
题意:给你一些花,以及这些花开花的时间,问你在某一时间开花的总个数~~,很明显的树状数组题,插线问点。。
AC代码:
[cpp]
#include<cstdio>
#include<string.h>
#include<string>
#include<algorithm>
#include<iostream>
#define N 1000005
using namespace std;
typedef struct node
{
int num;
int id;
}Node;
bool cmp(Node a,Node b)
{return a.num<b.num;}
int s[N];
Node s1[N];
int s2[N];
int lowbit(int x)
{return x&(-x);}
void add(int x,int y)
{
while(x<N)
{
s[x]+=y;
x+=lowbit(x);
}
}
int sum(int x)
{
int ans=0;
while(x>0)
{
ans+=s[x];
x-=lowbit(x);
}return ans;
}
int main()
{
int T;
scanf("%d",&T);
for(int k=1;k<=T;++k)
{
memset(s,0,sizeof(s));
int n,m;
scanf("%d%d",&n,&m);
int tot=n<<1;
int res=tot+m;
for(int i=0;i!=res;++i)
{
scanf("%d",&s1[i].num);
s1[i].id=i;
}
sort(s1,s1+res,cmp);
int ans=0; www.zzzyk.com
s2[s1[0].id]=++ans;
for(int i=1;i!=res;++i)
if(s1[i].num!=s1[i-1].num) s2[s1[i].id]=++ans;
else s2[s1[i].id]=ans;
for(int i=0;i!=tot;)
{
add(s2[i++],1);
add(s2[i++]+1,-1);
}
printf("Case #%d:\n",k);
for(int i=tot;i!=res;++i)
{
printf("%d\n",sum(s2[i]));
}
}return 0;
}
作者:smallacmer
补充:软件开发 , C++ ,