青蛙遇上算数难题全体青蛙日夜不停计算
文件 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;
}

1665

被折叠的 条评论
为什么被折叠?



