【差分數列】tyvj2042線段問題

來源:互聯網
上載者:User

標籤: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了。。。。。。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.