# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
5127 | ainta | Evaluation (kriii1_E) | C++98 | 280 ms | 14776 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<stdio.h>
#include<algorithm>
#define SZ 262144
using namespace std;
int n, Y[200010];
long long SS, Mod = 1000000007, Sum, res;
struct YY{
int y, num;
bool operator <(const YY &p)const{
return y < p.y;
}
}p[201000];
struct Seg{
int x, y1, y2, p;
bool operator <(const Seg &p)const{
return x < p.x;
}
}w[201000];
struct SegTree{
int K;
long long S;
}IT[SZ * 2 + 1];
void spread(int node, long long K, int b, int e, int m){
int c1 = node * 2, c2 = node * 2 + 1;
IT[c1].K += K, IT[c2].K += K;
IT[c1].S += K*(Y[m + 1] - Y[b]);
IT[c2].S += K*(Y[e + 1] - Y[m + 1]);
IT[node].K = 0;
}
void Add(int node, int b, int e, int s, int l, long long x){
if (b == s && e == l){
Sum += IT[node].S;
IT[node].K += x;
IT[node].S += x*(Y[e + 1] - Y[b]);
return;
}
int m = (b + e) >> 1;
if (IT[node].K)spread(node, IT[node].K, b, e, m);
if (s <= m)Add(node * 2, b, m, s, min(l, m), x);
if (l > m)Add(node * 2 + 1, m + 1, e, max(m + 1, s), l, x);
IT[node].S = IT[node * 2].S + IT[node * 2 + 1].S;
}
int main(){
int i, y1, y2, c = 0;
scanf("%d", &n);
for (i = 0; i < n; i++){
scanf("%d%d%d%d%d", &w[i * 2].x, &p[i * 2].y, &w[i * 2 + 1].x, &p[i * 2 + 1].y, &w[i * 2].p);
w[i * 2 + 1].x++, w[i * 2 + 1].p = -w[i * 2].p;
p[i * 2 + 1].y++;
p[i * 2].num = i * 2, p[i * 2 + 1].num = i * 2 + 1;
}
sort(p, p + 2 * n);
for (i = 0; i < 2 * n; i++){
if (!i || p[i].y != p[i - 1].y)Y[++c] = p[i].y;
if (p[i].num & 1)w[p[i].num].y2 = w[p[i].num ^ 1].y2 = c;
else w[p[i].num].y1 = w[p[i].num ^ 1].y1 = c;
}
sort(w, w + 2 * n);
for (i = 0; i < 2 * n; i++){
Sum = 0;
Add(1, 1, SZ, w[i].y1, w[i].y2 - 1, w[i].p);
Sum %= Mod;
SS = SS + Sum * 2 * w[i].p + (long long)(Y[w[i].y2] - Y[w[i].y1])*w[i].p*w[i].p;
if (SS < 0)SS += (-SS) / Mod*Mod + Mod;
SS %= Mod;
if (w[i].x != w[i + 1].x)res = (res + SS*(w[i + 1].x - w[i].x)) % Mod;
}
printf("%lld\n", res);
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |