hdu 5419 Victor and Toys

题解:
对于每个值,查看被多少个区间覆盖
总结:
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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值