Problem Description
當N = 0,輸入結束。
解答:
a數組是每個氣球的塗色次數,在這種解答裏沒有用,所以我沒有定義出來,寫在這裏只是爲理解方便
定義一個b數組 b[i]=a[i]-a[i-1] ( b[0]=0 所以是不是 b[1]=a[1] )
易知 a[k]=a[k-1]+b[k] ,a[k-1]是不是也可以分解成這種形式,最後a[i]=b[1]+b[2]+b[3]+…+b[i]
當給一個start,end,在【start,end】區間裏的所有點是不是都要加1
換句話說,是不是這段區間內的差值,,也就是b是沒變的( b[start+1] ~ b[end] ),唯一改變的只是b[start] 加了1和 b[end+1]減了1 而已
所以 每次操作只需修改兩個變量
程序:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int b[500000],n,s,e; while(1) { memset(b,0,sizeof(b)); scanf("%d",&n); if(!n) return 0; //printf("#case \n"); for(int i=1;i<=n;i++) { scanf("%d%d",&s,&e); b[s]+=1; b[e+1]-=1; } int sum=0; for(int i=1;i<=n;i++) { sum+=b[i]; printf("%d ",sum); } printf("\n"); } return 0; }