# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
22179 | 스팟보드CSS가깨져요 (#42) | 구간들 (KRIII5P_3) | C++98 | 373 ms | 91192 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 info(t) ((t)==NULL ? itt(1,0) : ((t)->key))
using namespace std;
typedef long long lld;
const lld mod = 1000000007;
struct itt {
lld gas, rsum;
itt(lld gas_=0, lld rsum_=0) : gas(gas_), rsum(rsum_) {}
itt operator+ (const itt& c) {
return itt(gas*c.gas % mod, (rsum*c.gas+c.rsum) % mod);
}
};
struct segtr {
segtr *l, *r; lld mi, mx;
itt key;
segtr() {l=NULL; r=NULL;}
} *itr;
void ins(segtr* t, lld ix){
lld md = ((t->mi) + (t->mx))/2;
if(t->mi == t->mx){
t->key = (t->key) + itt(2,ix);
return;
}
if(ix <= md){
if(t->l == NULL){
t->l = new segtr;
t->l->mi = t->mi;
t->l->mx = md;
t->l->key = itt(1,0);
}
ins(t->l, ix);
}
else{
if(t->r == NULL){
t->r = new segtr;
t->r->mi = md+1;
t->r->mx = t->mx;
t->r->key = itt(1,0);
}
ins(t->r, ix);
}
t->key = info(t->l) + info(t->r);
}
itt getinfo(segtr* t, lld s, lld e){
if(t == NULL || s > e)return itt(1,0);
lld md = ((t->mi) + (t->mx))/2;
if(s == t->mi && e == t->mx) return t->key;
if(e <= md) return getinfo(t->l, s, e);
if(s >= md+1) return getinfo(t->r, s, e);
return getinfo(t->l, s, md) + getinfo(t->r, md+1, e);
}
struct intv {
lld s, e;
bool operator< (const intv& c) const {
if(s == c.s)return e<c.e;
return s<c.s;
}
}ba[101010];
int N; lld sum1, sum2;
int main(){
itr = new segtr;
itr->mi = 0, itr->mx = 1000000000;
scanf("%d", &N);
for(int i=0; i<N; i++)scanf("%lld%lld", &ba[i].s, &ba[i].e);
sort(ba, ba+N);
for(int i=0; i<N; i++){
if(ba[i].s >= ba[i].e) continue;
itt if1, if2;
if1 = getinfo(itr, ba[i].e+1, 1000000000);
if2 = getinfo(itr, ba[i].s+1, ba[i].e);
ins(itr, ba[i].e);
lld rs = 0, rcn = if1.gas*if2.gas % mod;
rs = (if2.rsum + ba[i].e) * if1.gas % mod;
rs -= rcn * ba[i].s % mod;
rs %= mod;
if(rs < 0)rs += mod;
sum1 += rs; sum1 %= mod;
sum2 += rcn % mod; sum2 %= mod;
}
printf("%lld %lld\n", sum1, sum2);
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |