2025 11联测 7

青蛙遇上算数难题全体青蛙日夜不停计算

 文件 IO比赛题目

时间限制: 1000MS空间限制: 256MB

题目描述

青蛙计算中心得到了一个长度为 n 的序列 a.

青蛙计算中心需要算出这个序列的每一个区间的和,然后再求和得到最终的结果。

毕竟是蛙脑计算,未免产生错误,于是会有 m 种错误发生。

每种错误以 x,y 来描述,表示计算 [l,r] 的区间和时,如果有 l 和 r 其中至少一个是 x,那么这个区间和就不能计算 ay​ 的值。

答案需要对 109+7 取模。

输入格式

第一行两个整数 n,m 。

第二行 n 个整数,表示输入序列 a 。

接下来 m 行,每行两个整数 x,y ,代表一个错误。

输出格式

一个整数,表示答案对 109+7 取模后的值。

样例输入 1 

5 5
1 2 3 4 5
1 2
2 3
4 3
3 4
4 5

样例输出 1 

69

提示/说明

样例解释

1+1+4+5+13+2+2+6+11+3+0+8+4+4+5=69.

数据范围

对于前 10% 的数据: n,m≤100,ai​≤10;

对于前 60% 的数据: n,m≤5000,ai​≤10;

对于另外 20% 的数据:m=0;

对于 100% 的数据: n,m≤106,0<ai​<109+7,1≤x,y≤n.

数据保证错误两两不同。

代码:

#include<iostream>
 #include<cstdio>
 #include<map>
 typedef long long ll;
 const ll mod = 1000000007;
 void cAdd(ll &x, ll y) { x = (x + y >= mod) ? (x + y - mod) : (x + y); }
 ll Mod(ll x) { return x < 0 ? (x + mod) : (x >= mod ? (x - mod) : x); }
 template <typename T> T Max(T x, T y) { return x > y ? x : y; }
 template <typename T> T Min(T x, T y) { return x < y ? x : y; }
 template <typename T>
 T& read(T& r) {
 r = 0; bool w = 0; char ch = getchar();
   while(ch < '0' || ch > '9') w = ch == '-' ? 1 : 0, ch = getchar();
    while(ch >= '0' && ch <= '9') r = r * 10 + (ch ^ 48), ch = getchar();
    return r = w ? -r : r;
 }
 const int N = 1000100;
 int n, m, b[N][2];
 ll a[N], ans;
 signed main() {
    read(n); read(m);
    for(int i = 1; i <= n; ++i) read(a[i]), cAdd(ans, a[i] * i % mod * (n-i+1) % 
mod);
    for(int i = 1; i <= m; ++i) {
        int x, y; read(x); read(y);
        if(x == y) {
            cAdd(ans, Mod(-a[y] * (n-b[y][0]-b[y][1]) % mod));
            ++b[y][0]; ++b[y][1];
            continue ;
        }
        if(x < y) cAdd(ans, Mod(-a[y] * (n-y-b[y][1]+1) % mod));
        if(x > y) cAdd(ans, Mod(-a[y] * (y-b[y][0]) % mod));
        if(x < y) ++b[y][0];
        if(x > y) ++b[y][1];
    }
    printf("%lld\n", ans);
    return 0;
 }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值