Codeforces 246C Little Girl And Maximum 差分
2017-02-18 14:08
519 查看
点击打开链接
题意:n个数,m次询问 n,m<=1e5 问初始时如何打乱数组的顺序 使得查询的累加和最大?
最后的累加和可以写为:ans=segma(a[i]*f[i])
每次询问l,r时 如何快速计算f?
用线段树区间更新使f[l]~f[r]同时加上1,最后单点查询计算出f,比较麻烦
利用差分,每次更新时:c[l]++,c[r+1]-- 最后计算i的前缀和,即可求出i被包含在多少条线段(询问)中啦
ai<aj bi<bj;
因为a[i]·b[j]+a[j]·b[i]-a[i]·b[i]-a[j]·b[j] = b[j]·(a[i]-a[j])+b[i]·(a[j]-a[i])=(b[j]-b[i])*(a[i]-a[j])<=0.
ans尽量大则大的a[i]和大的f[i]相乘即可
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=2e5+20;
const ll mod=19999997;
ll a
,f
,c
;// f[i] 第i个元素被查询到的次数
int n,m;
int main()
{
while(cin>>n>>m)
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
f[l]++;//差分
f[r+1]--;
}
f[0]=0;
for(int i=1;i<=n;i++)
f[i]=f[i]+f[i-1];//不包含i的线段k,计算前缀和时被消去,(.lk..rk.l..i..r.. )
sort(f+1,f+1+n);
sort(a+1,a+1+n);
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=a[i]*f[i];
}
cout<<ans<<endl;
}
return 0;
}
题意:n个数,m次询问 n,m<=1e5 问初始时如何打乱数组的顺序 使得查询的累加和最大?
最后的累加和可以写为:ans=segma(a[i]*f[i])
每次询问l,r时 如何快速计算f?
用线段树区间更新使f[l]~f[r]同时加上1,最后单点查询计算出f,比较麻烦
利用差分,每次更新时:c[l]++,c[r+1]-- 最后计算i的前缀和,即可求出i被包含在多少条线段(询问)中啦
ai<aj bi<bj;
因为a[i]·b[j]+a[j]·b[i]-a[i]·b[i]-a[j]·b[j] = b[j]·(a[i]-a[j])+b[i]·(a[j]-a[i])=(b[j]-b[i])*(a[i]-a[j])<=0.
ans尽量大则大的a[i]和大的f[i]相乘即可
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=2e5+20;
const ll mod=19999997;
ll a
,f
,c
;// f[i] 第i个元素被查询到的次数
int n,m;
int main()
{
while(cin>>n>>m)
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
f[l]++;//差分
f[r+1]--;
}
f[0]=0;
for(int i=1;i<=n;i++)
f[i]=f[i]+f[i-1];//不包含i的线段k,计算前缀和时被消去,(.lk..rk.l..i..r.. )
sort(f+1,f+1+n);
sort(a+1,a+1+n);
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=a[i]*f[i];
}
cout<<ans<<endl;
}
return 0;
}
相关文章推荐
- codeforces 853B 思维 差分
- Codeforces Round #439 (Div. 2) Problem E (Codeforces 869E) - 暴力 - 随机化 - 二维树状数组 - 差分
- Codeforces 740D Alyona and a tree 二分+树上差分
- Codeforces 841D Leha and another game about graph - 差分
- Codeforces 19E 树上差分
- Codeforces 739B(树上路径倍增及差分)
- Codeforces 853B Round #433 Div2D& Div1B Jury Meeting:差分前缀和+模拟
- Codeforces 8VC Venture Cup 2016 - Elimination Round F. Group Projects 差分DP*****
- Codeforces 892B Wrath 【差分】
- 第十一次codeforces竞技结束 #262 Div 2
- codeforces-510B-Fox And Two Dots【DFS】
- CodeForces 690C1 Brain Network (easy) (水题,判断树)
- Codeforces 451E Devu and Flowers(组合计数)
- Codeforces 749 B Parallelogram is Back(自定义set去重)
- Codeforces 155E E. Double Profiles【思维+hash】
- Codeforces 282E. Sausage Maximization【trie树(非指针版)】
- THE MATRIX PROBLEM(差分约束)
- Codeforces 690F1 - Tree of Life (easy)
- codeforces 735d Taxes
- Codeforces 813E Army Creation 主席树(在线,求[l,r]内比x大的数的个数)