看了这篇文章复习了下数状数组:http://blog.csdn.net/clx55555/article/details/52261538
这个题的思路是在起始位置加1,结束位置的下一个减1,这样从1~n的和就是n被染色的次数。
数状数组的思想挺有意思的,不得不佩服想出这个思想的人
#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> using namespace std; const int maxn=100009; int n; int a[maxn]; int low_bit(int x) { return x&(-x); } void add(int x,int val) { for(int i=x; i<=n; i+=low_bit(i)) a[i]+=val; } int sum(int x) { int ans=0; for(int i=x; i>=1; i-=low_bit(i)) ans+=a[i]; return ans; } int main() { while(~scanf("%d",&n)&&n) { memset(a,0,sizeof(a)); int x,y; for(int i=1; i<=n; i++) { scanf("%d%d",&x,&y); add(x,1); add(y+1,-1); } for(int i=1; i<n; i++) printf("%d ",sum(i)); printf("%d\n",sum(n)); } return 0; }