您的位置:首页 > 其它

HDU1556 Color the ball

2016-09-14 15:08 323 查看

 

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 17300    Accepted Submission(s): 8652


Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?  

 

Input 每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。  

 

Output 每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。  

 

Sample Input 3 1 1 2 2 3 3 3 1 1 1 2 1 3 0  

 

Sample Output 1 1 1 3 2 1  

 

Author 8600  

 

Source HDU 2006-12 Programming Contest  

 

Recommend LL     差分数组,每次若涂色区间为l~r,则在l处+1,r+1处-1,统计从1到每个位置的前缀和就是每个位置的答案。 ↑前缀和用树状数组维护  
/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int mxn=100020;
int t[mxn];
int n,m;
void add(int p,int v){
while(p<=n+5){t

+=v;p+=p&-p;} } int sum(int p){ int res=0; while(p){res+=t[p];p-=p&-p;} return res; } int main(){ while(scanf("%d",&n) && n){ int i,j; memset(t,0,sizeof t); int x,y; for(i=1;i<=n;i++){ scanf("%d%d",&x,&y); add(x,1); add(y+1,-1); } for(i=1;i<=n;i++){ if(i==1)printf("%d",sum(i)); else printf(" %d",sum(i)); } printf("\n"); } return 0; }

[p] 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: