您的位置:首页 > 其它

51nod 1672 区间交

2016-11-21 02:30 411 查看
枚举区间交的左端点,multiset维护右端点。

#include<bits/stdc++.h>
using namespace std;

const int MAXN=100100;

struct segment
{
int lef,rig;
}seg[MAXN];

bool cmp(segment s1,segment s2)
{
if(s1.lef!=s2.lef)
return s1.lef<s2.lef;
return s1.rig<s2.rig;
}

int a[MAXN];
long long sum[MAXN];
multiset<int> st;
multiset<int> ::iterator it;

int main()
{
int n,m,k,i;
long long ans;
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
st.clear();
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d%d",&seg[i].lef,&seg[i].rig);
sort(seg,seg+m,cmp);
sum[0]=0;
for(i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i];
for(i=0;i<k;i++)
st.insert(seg[i].rig);
it=st.begin();
ans=max((long long)0,sum[*it]-sum[seg[k-1].lef-1]);
for(i=k;i<m;i++)
{
st.insert(seg[i].rig);
if(seg[i].rig>=(*it))
it++;
ans=max(ans,sum[*it]-sum[seg[i].lef-1]);
}
printf("%lld\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod