原題:
http://172.16.0.132/senior/#contest/show/2055/1
題目描述:
很久很以前,有一個古老的村莊——xiba村,村子里生活著n+1個村民,但由于歷屆村長恐怖而且黑暗的魔法統(tǒng)治下,村民們各自過著獨立的生活,完全沒有意識到其他n個人的存在。
但有一天,村民xiba臻無意中也得到了魔法,并發(fā)現(xiàn)了這個恐怖的事實。為了反抗村長,他走遍了全世界,找到了其他n個村民,并組織他們發(fā)動革命。但讓這n個素不相識的村民(xiba臻已跟他們認識)同心協(xié)力去抵抗村長是很困難的,所以xiba臻決定先讓他們互相認識。
這里,xiba臻用了xiba村特有的xiba思維:先讓這n個人排成一列,并依次從1-n標號。然后每次xiba臻會選出一個區(qū)間[l, r],在這個區(qū)間中的人會去認識其他在這個區(qū)間中的人,但已經(jīng)認識過得不會再去認識。這樣,進行m次操作后,xiba臻認為這n個人能認識到許多人。
但是,為了精確地知道當前有多少對人已經(jīng)認識了,xiba臻想要知道每次操作后會新產(chǎn)生出多少對認識的人,但這已是xiba思維無法解決的事了,你能幫幫他嗎?
輸入:
第一行兩個整數(shù)n,m。
接下來m行每行兩個整數(shù)li,ri,表示每次操作的區(qū)間。
輸出:
共m行,每行一個整數(shù)ans_i,表示第i次操作后新產(chǎn)生出ans_i對認識的人。
樣例輸入:
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的人認識,初始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);
}
}