HUD 1556 Color the ball
2015-09-10 16:34
232 查看
Color the ball
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13160 Accepted Submission(s): 6579
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
//线段树: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int MAX=100005; int sum[MAX<<2]; int add[MAX<<2]; char s[8]; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushdown(int rt,int m) { if(add[rt]) { add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=add[rt]*(m-(m>>1)); sum[rt<<1|1]+=add[rt]*(m>>1); add[rt]=0; } } void build(int l,int r,int rt) { add[rt]=0; if(l==r) { sum[rt]=0; return; } int m=(l+r)>>1; build(lson); build(rson); pushup(rt); } void updata(int L,int R,int c,int l,int r,int rt) { if(L<=l&&R>=r) { add[rt]+=c; sum[rt]+=c*(r-l+1); return; } pushdown(rt,r-l+1); int m=(l+r)>>1; if(L<=m) updata(L,R,c,lson); if(R>m) updata(L,R,c,rson); pushup(rt); } int querty(int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) { return sum[rt]; } pushdown(rt,r-l+1); int m=(l+r)>>1; int cnt=0; if(L<=m) cnt+=querty(L,R,lson); if(R>m) cnt+=querty(L,R,rson); return cnt; } int main() { int n; while(scanf("%d",&n)!=EOF&&n) { build(1,n,1); int x,y; for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); updata(x,y,1,1,n,1); } for(int i=1;i<=n;i++) { if(i==1) { printf("%d",querty(i,i,1,n,1)); } else { printf(" %d",querty(i,i,1,n,1)); } } printf("\n"); } return 0; }
//树状数组: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxm=1e6+10; int s[maxm]; int n; int lower_bit(int i) { return i&(-i); } void add(int x,int c) { while(x<=n) { s[x]+=c; x+=lower_bit(x); } } int get(int x) { int t=0; while(x>0) { t+=s[x]; x-=lower_bit(x); } return t; } int main() { while(scanf("%d",&n)!=EOF&&n) { memset(s,0,sizeof(s)); int i,x,y; for(i=0;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",get(i)); } else { printf(" %d",get(i)); } } printf("\n"); } return 0; }
相关文章推荐
- HTTP协议详解
- Shell编程中的“局部变量”和“导出变量”
- wireshark分析包中关于三次握手和四次终止标识
- 异构网络
- Linux服务器定时备份脚本
- 【Android基础】——Fragment-使用方法
- ServiceStack.Redis——Redis于.net向上client解
- think in coding
- 【JS】识别浏览器版本及操作平台
- hibernate 继承映射(一)
- [置顶] Linux网络编程--IO模型基础
- Python 支付宝支付代码
- spring mvc+hibernate 实现事务管理(配置文件版)
- javascript运算符
- 数字在排序数组中出现的次数
- Ubuntu中定时
- vector和list的一些基本用法
- 将微信获取的部门JSON字符串转换成EASY UI Tree能够绑定的JSON(JSONPath的使用)
- mysql的innodb中事务日志ib_logfile
- C++的学习心得