题解:
对于每个值,查看被多少个区间覆盖
总结:
1.又是不小心瞟到题解,才想到
2.以后对于区间操作的问题:
(1).首先按照题目要求直接对区间下手,如果失败了
(2).再对被操作的值下手
3.对于区间操作可以离线,在线(分从前面,从后面)
4。但是我觉得最重要的是:保持一颗平常的心态,迅速思考而不是着急!重在想题而不是比拼!相信自己!
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
#define MAXN 50005
int num[MAXN],bound[MAXN];
ll gcd(ll a,ll b)
{
if(b)return gcd(b,a % b);
return a;
}
ll C(ll a)
{
return a * (a - 1) * (a - 2) / 2 / 3;
}
int main()
{
int _,n,m;
scanf("%d",&_);
while(_--)
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
scanf("%d",&num[i]);
memset(bound,0,sizeof(bound));
for(int i = 0;i < m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
bound[l]++,bound[r + 1]--;
}
int cnt = 0;
ll ans1 = 0;
for(int i = 1;i <= n;i++)
{
cnt += bound[i];
if(cnt >= 3)
{
ans1 += num[i] * C(cnt);
}
}
ll ans2 = C(m);
ll cur = gcd(ans1,ans2);
if(cur)
{
ans1 /= cur,ans2 /= cur;
if(ans2 == 1)printf("%I64d\n",ans1);
else printf("%I64d/%I64d\n",ans1,ans2);
}
else puts("0");
}
}