2017.07.13【NOIP提高組】模擬賽B組 我的天 題解

原題:

http://172.16.0.132/senior/#contest/show/2055/1

題目描述:

很久很以前,有一個古老的村莊——xiba村,村子里生活著n+1個村民,但由于歷屆村長恐怖而且黑暗的魔法統(tǒng)治下,村民們各自過著獨(dú)立的生活,完全沒有意識到其他n個人的存在。
但有一天,村民xiba臻無意中也得到了魔法,并發(fā)現(xiàn)了這個恐怖的事實。為了反抗村長,他走遍了全世界,找到了其他n個村民,并組織他們發(fā)動革命。但讓這n個素不相識的村民(xiba臻已跟他們認(rèn)識)同心協(xié)力去抵抗村長是很困難的,所以xiba臻決定先讓他們互相認(rèn)識。
這里,xiba臻用了xiba村特有的xiba思維:先讓這n個人排成一列,并依次從1-n標(biāo)號。然后每次xiba臻會選出一個區(qū)間[l, r],在這個區(qū)間中的人會去認(rèn)識其他在這個區(qū)間中的人,但已經(jīng)認(rèn)識過得不會再去認(rèn)識。這樣,進(jìn)行m次操作后,xiba臻認(rèn)為這n個人能認(rèn)識到許多人。
但是,為了精確地知道當(dāng)前有多少對人已經(jīng)認(rèn)識了,xiba臻想要知道每次操作后會新產(chǎn)生出多少對認(rèn)識的人,但這已是xiba思維無法解決的事了,你能幫幫他嗎?

輸入:

第一行兩個整數(shù)n,m。
接下來m行每行兩個整數(shù)li,ri,表示每次操作的區(qū)間。

輸出:

共m行,每行一個整數(shù)ans_i,表示第i次操作后新產(chǎn)生出ans_i對認(rèn)識的人。

樣例輸入:

5 5
2 3
2 4
3 5
1 5
2 4

樣例輸出:

1
2
2
5
0

數(shù)據(jù)范圍限制:

對于20%的數(shù)據(jù),1≤n,m≤100。
對于50%的數(shù)據(jù),1≤n,m≤5000。
對于100%的數(shù)據(jù),1≤n,m≤300000,1≤li≤ri≤n。

分析:

記f[i]為第i個人與f[i]—i-1的人認(rèn)識,初始f[i]=i。
然后一次操作后f[i]=max{f[i],l} l<=i<=r ,同時統(tǒng)計答案。
O(nm)

實現(xiàn):

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,m,i,j,l,r;
long long ans,f[300001];
int main()
{
    freopen("ohmygod.in","r",stdin);freopen("ohmygod.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++) f[i]=i;
    while(m--)
    {
        scanf("%d%d",&l,&r);
        ans=0;
        for(i=r;i>=l;i--)
        {
            if(f[i]<=l) break;
            if(l<f[i])
            {
                ans+=f[i]-l;
                f[i]=l;
            }
        }
        printf("%lld\n",ans);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容