標籤:des style class blog code tar
線段問題描述 Description有N條線段,已知每條線段的起點和終點(50000以內),然後有M個詢問,每次詢問一個點(50000以內),求這個點在多少條線段上出現過?輸入格式 InputFormat第一行N線段條數
接下來N行,每行兩個數,線段的起點和終點
第N+2行一個數M詢問個數
接下來M行,每行一個點 輸出格式 OutputFormat對於每個詢問,求答案 範例輸入 SampleInput 32 54 60 742476範例輸出 SampleOutput 2312資料範圍和注釋 HintN,M<=50000思路 thinkings
這道題很水就水在沒有要求線上演算法,全部讀進去讓我一起輸答案,於是差分數列大行其道……
這題本來是拿來練習線段樹的,我是不是太直接了……
代碼 code
#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>using namespace std;int cf[50005]; //差分數列,表示第i-1個和第i個的差,即cf[i]=數列[i]-數列[i-1];int sum[50005]; //差分數列的首碼和就是原數列。。。int main(){ int i,j,m,n,p,first,last,size; cin>>n; memset(cf,0,sizeof(cf)); memset(sum,0,sizeof(sum)); size=0; for (i=1;i<=n;i++) { cin>>first>>last; cf[first]+=1; cf[last+1]-=1; size=max(last,size); } for (i=0;i<=size;i++) sum[i]=sum[i-1]+cf[i]; cin>>m; for (i=1;i<=m;i++) { cin>>p; cout<<sum[p]<<endl; } return 0;}反思
(1)看題目要先看清楚是線上還是離線,沒有要求強制線上離線還是好用啊。。。
(2)兩句老話:差分數列的首碼和是原數列
首碼和的差分數列是原數列
(3)這題特別坑的地方在於
for (i=0;i<=size;i++) sum[i]=sum[i-1]+cf[i];
如果不幸寫成:
for (i=1;i<=size;i++) sum[i]=sum[i-1]+cf[i];
就全WA了。。。。。。