生活随笔
收集整理的這篇文章主要介紹了
NYOJ 600 花儿朵朵
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
花兒朵朵
時(shí)間限制:
1000?ms ?|? 內(nèi)存限制:
65535?KB 難度:
5
描述
春天到了,花兒朵朵盛開,hrdv是一座大花園的主人,在他的花園里種著許多種鮮花,每當(dāng)這個(gè)時(shí)候,就會(huì)有一大群游客來他的花園欣賞漂亮的花朵,游客們總是會(huì)詢問,某個(gè)時(shí)間有多少種花兒同時(shí)在盛開著?hrdv雖然知道每種花兒的開花時(shí)間段,但是他不能很快的答出游客的問題,你能編寫一個(gè)程序幫助他嗎? 輸入第一行有個(gè)整數(shù)t,表示有t組測(cè)試數(shù)據(jù),每組測(cè)試數(shù)據(jù)第一行為兩個(gè)整數(shù)n,m(0<n<100000,0<m<100000);隨后有n行,每一行有兩個(gè)整數(shù)x,y(0<x<y<1000000000),表示這一種花的盛開時(shí)間是從x到y(tǒng);隨后有m行,每行有一個(gè)整數(shù),代表游客詢問的時(shí)間。輸出對(duì)于每次游客的詢問,輸出一個(gè)整數(shù)在單獨(dú)的一行,表示這個(gè)時(shí)間盛開的花有多少種。樣例輸入 2
1 1
5 10
4
2 3
1 4
4 8
1
4
6 樣例輸出 0
1
2
1 樹狀數(shù)組+離散化! AC碼: #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{int time,order;
}num[300000];
int a[300000],s,sum[200000];
int LowBit(int i)
{return i&(-i);
}
void Add(int i,int w)
{while(i<=s){sum[i]+=w;i+=LowBit(i);}
}
int Get(int i)
{int result=0;while(i>0){result+=sum[i];i-=LowBit(i);}return result;
}
int cmp(node a,node b)
{if(a.time==b.time)return a.order>b.order;elsereturn a.time<b.time;
}
int main()
{int T,m,n,i;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);s=(n<<1)+m;for(i=1;i<=s;i++){scanf("%d",&num[i].time);num[i].order=i;}// 調(diào)用庫函數(shù)對(duì)time排序sort(num+1,num+s+1,cmp);int count=0;for(i=1;i<=s;i++){if(num[i].time!=num[i-1].time) // 離散化+去重a[num[i].order]=++count;elsea[num[i].order]=count;}i=1;memset(sum,0,sizeof(sum));while(i<=(n<<1)){Add(a[i++],1);Add(a[i++]+1,-1);}for(i=(n<<1)+1;i<=s;i++){printf("%d\n",Get(a[i]));}}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的NYOJ 600 花儿朵朵的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。