Submission #14021164


Source Code Expand

#include <bits/stdc++.h>
#define ll long long
#define INF 1000000009
#define MOD 1000000007
#define EPS 1e-10
#define rep(i,n) for(int i=0;i<(int)(n);++i)
#define rrep(i,n) for(int i=(int)(n)-1;i>=0;--i)
#define srep(i,s,t) for(int i=(int)(s);i<(int)(t);++i)
#define each(a,b) for(auto& (a): (b))
#define all(v) (v).begin(),(v).end()
#define len(v) (int)(v).size()
#define zip(v) sort(all(v)),v.erase(unique(all(v)),v.end())
#define cmx(x,y) x=max(x,y)
#define cmn(x,y) x=min(x,y)
#define fi first
#define se second
#define pb push_back
#define show(x) cout<<#x<<" = "<<(x)<<endl
#define spair(p) cout<<#p<<": "<<p.fi<<" "<<p.se<<endl
#define sar(a,n) cout<<#a<<":";rep(pachico,n)cout<<" "<<a[pachico];cout<<endl
#define svec(v) cout<<#v<<":";rep(pachico,v.size())cout<<" "<<v[pachico];cout<<endl
#define svecp(v) cout<<#v<<":";each(pachico,v)cout<<" {"<<pachico.first<<":"<<pachico.second<<"}";cout<<endl
#define sset(s) cout<<#s<<":";each(pachico,s)cout<<" "<<pachico;cout<<endl
#define smap(m) cout<<#m<<":";each(pachico,m)cout<<" {"<<pachico.first<<":"<<pachico.second<<"}";cout<<endl

using namespace std;

typedef pair<int,int> P;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<P> vp;
typedef vector<string> vs;

const int MAX_N = 200005;

inline int mod_pow(int a, ll b)
{
    int res = 1;
    while(b){
        if(b & 1){
            res = (ll)res * a % MOD;
        }
        a = (ll)a * a % MOD;
        b >>= 1;
    }
    return res;
}

inline int add(int x,int y)
{
    return (x + y)%MOD;
}

inline int sub(int x,int y)
{
    return (x+MOD-y)%MOD;
}

inline int mul(int x,int y)
{
    return (ll)x*y%MOD;
}

template<typename T> class segtree {
private:
    int n,sz;
    vector<T> node;
public:
    segtree(vector<T>& v){
        sz = (int)v.size();
        n = 1;
        while(n < sz){
            n *= 2;
        }
        node.assign(2*n, 0);
        rep(i,sz){
            node[i+n] = v[i];
        }
        for(int i=n-1; i>=1; i--){
            node[i] = add(node[2*i],node[2*i+1]);
        }
    }
    void update(int k, T a)
    {
    	node[k+=n] = a;
    	while(k>>=1){
    		node[k] = add(node[2*k],node[2*k+1]);
    	}
    }
    T query(int a,int b)
    {
        T res1 = 0, res2 = 0;
        a += n, b += n;
        while(a != b){
            if(a % 2) res1 = add(res1, node[a++]);
            if(b % 2) res2 = add(res2, node[--b]);
            a >>= 1, b>>= 1;
        }
        return add(res1, res2);
    }
    T get(int k){
        return node[k+n];
    }
    void print()
    {
        rep(i,sz){
            cout << query(i,i+1) << " ";
        }
        cout << endl;
    }
};

// (終点の位置, そこまでの合計)
vector<P> info0[MAX_N], info1[MAX_N];
int invS[MAX_N], powS[MAX_N];

template<typename T>
vector<pair<T, T> > EraseOuterInterval(vector<pair<T, T> > vec)
{
    using ptt = pair<T, T>;
    sort(all(vec),[](const ptt& a,const ptt& b){
        return (a.second == b.second) ? (a.first < b.first) : (a.second > b.second);
    });
    vector<ptt> res;
    for(const ptt& p : vec){
        while(!res.empty()){
            const ptt& q = res.back();
            if(p.first < q.first) break;
            res.pop_back();
        }
        res.push_back(p);
    }
    reverse(res.begin(), res.end());
    return res;
}

vector<P> wid[MAX_N];

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    int n, m, S;
    cin >> n >> m >> S;
    vector<pair<P, int> > dat;
    rep(i,m){
        int x,y,z;
        cin >> x >> y >> z;
        --x, --z;
        info0[z].pb(P(-1, 0)), info1[z].pb(P(-1, 0));
        wid[z].pb(P(x, y));
    }
    rep(i,S){
        if(wid[i].empty()) continue;
        auto res = EraseOuterInterval(wid[i]);
        rep(j,len(res)){
            dat.pb(make_pair(P(res[j].se, res[j].fi), i));
        }
    }
    sort(all(dat));
    m = len(dat);
    vp vec(m);
    vi b(m);
    rep(i,m){
        vec[i] = dat[i].fi, b[i] = dat[i].se;
    }
    int iS = mod_pow(S, MOD-2);
    invS[0] = powS[0] = 1;
    rep(i,n){
        invS[i+1] = mul(invS[i], iS);
        powS[i+1] = mul(powS[i], S);
    }
    vi dp(m+1, 0);
    segtree<int> sg1(dp);
    dp[0] = 1;
    segtree<int> sg0(dp);
    rep(i,m){
        int ed = lower_bound(all(vec), P(vec[i].se, INF)) - vec.begin() + 1;
        int val0 = add(mul(powS[vec[i].se], sg0.query(0, ed)), sub(info0[b[i]].back().se, (--lower_bound(all(info0[b[i]]), P(vec[i].se, INF)))->se));
        int val1 = add(mul(powS[vec[i].se], sg1.query(0, ed)), sub(info1[b[i]].back().se, (--lower_bound(all(info1[b[i]]), P(vec[i].se, INF)))->se));
        sg1.update(i+1, mul(invS[vec[i].fi], val0)), sg0.update(i+1, mul(invS[vec[i].fi], val1));
        info0[b[i]].pb(P(vec[i].fi, add(info0[b[i]].back().se, val1))), info1[b[i]].pb(P(vec[i].fi, add(info1[b[i]].back().se, val0)));
    }
    int ans = 0;
    rep(i,m+1){
        ans = add(ans, sub(sg0.get(i), sg1.get(i)));
    }
    cout << mul(ans, powS[n]) << "\n";
    return 0;
}

Submission Info

Submission Time
Task H - カラフル数列
User kopricky
Language C++14 (GCC 5.4.1)
Score 300
Code Size 5250 Byte
Status AC
Exec Time 272 ms
Memory 41200 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 300 / 300
Status
AC × 5
AC × 55
Set Name Test Cases
Sample sample_01, sample_02, sample_03, sample_04, sample_05
All 1_random_small_1, 1_random_small_10, 1_random_small_11, 1_random_small_12, 1_random_small_13, 1_random_small_14, 1_random_small_2, 1_random_small_3, 1_random_small_4, 1_random_small_5, 1_random_small_6, 1_random_small_7, 1_random_small_8, 1_random_small_9, 2_zero_small_1, 2_zero_small_2, 3_random_large_1, 3_random_large_10, 3_random_large_11, 3_random_large_12, 3_random_large_13, 3_random_large_14, 3_random_large_15, 3_random_large_16, 3_random_large_17, 3_random_large_18, 3_random_large_19, 3_random_large_2, 3_random_large_20, 3_random_large_21, 3_random_large_22, 3_random_large_3, 3_random_large_4, 3_random_large_5, 3_random_large_6, 3_random_large_7, 3_random_large_8, 3_random_large_9, 4_points_large_1, 4_points_large_2, 4_points_large_3, 5_zero_large_1, 5_zero_large_2, 6_overlap_large_1, 6_overlap_large_2, 6_overlap_large_3, 6_overlap_large_4, 6_overlap_large_5, 6_overlap_large_6, 6_overlap_large_7, sample_01, sample_02, sample_03, sample_04, sample_05
Case Name Status Exec Time Memory
1_random_small_1 AC 6 ms 15872 KiB
1_random_small_10 AC 6 ms 15872 KiB
1_random_small_11 AC 5 ms 15872 KiB
1_random_small_12 AC 5 ms 15872 KiB
1_random_small_13 AC 5 ms 15872 KiB
1_random_small_14 AC 5 ms 15872 KiB
1_random_small_2 AC 5 ms 15872 KiB
1_random_small_3 AC 5 ms 15872 KiB
1_random_small_4 AC 5 ms 15872 KiB
1_random_small_5 AC 5 ms 15872 KiB
1_random_small_6 AC 5 ms 15872 KiB
1_random_small_7 AC 5 ms 15872 KiB
1_random_small_8 AC 5 ms 15872 KiB
1_random_small_9 AC 5 ms 15872 KiB
2_zero_small_1 AC 5 ms 15872 KiB
2_zero_small_2 AC 5 ms 15872 KiB
3_random_large_1 AC 270 ms 39664 KiB
3_random_large_10 AC 74 ms 21148 KiB
3_random_large_11 AC 74 ms 21120 KiB
3_random_large_12 AC 74 ms 21232 KiB
3_random_large_13 AC 166 ms 31604 KiB
3_random_large_14 AC 240 ms 38000 KiB
3_random_large_15 AC 157 ms 30196 KiB
3_random_large_16 AC 163 ms 30580 KiB
3_random_large_17 AC 148 ms 29552 KiB
3_random_large_18 AC 70 ms 20884 KiB
3_random_large_19 AC 55 ms 20004 KiB
3_random_large_2 AC 262 ms 39024 KiB
3_random_large_20 AC 69 ms 21132 KiB
3_random_large_21 AC 46 ms 18992 KiB
3_random_large_22 AC 66 ms 20944 KiB
3_random_large_3 AC 269 ms 39024 KiB
3_random_large_4 AC 259 ms 39024 KiB
3_random_large_5 AC 263 ms 39024 KiB
3_random_large_6 AC 252 ms 39280 KiB
3_random_large_7 AC 75 ms 21132 KiB
3_random_large_8 AC 75 ms 21048 KiB
3_random_large_9 AC 75 ms 21408 KiB
4_points_large_1 AC 269 ms 40432 KiB
4_points_large_2 AC 272 ms 40432 KiB
4_points_large_3 AC 271 ms 40432 KiB
5_zero_large_1 AC 233 ms 41200 KiB
5_zero_large_2 AC 215 ms 41196 KiB
6_overlap_large_1 AC 162 ms 33324 KiB
6_overlap_large_2 AC 163 ms 33596 KiB
6_overlap_large_3 AC 163 ms 33212 KiB
6_overlap_large_4 AC 165 ms 33308 KiB
6_overlap_large_5 AC 166 ms 33436 KiB
6_overlap_large_6 AC 122 ms 29236 KiB
6_overlap_large_7 AC 130 ms 33332 KiB
sample_01 AC 5 ms 15872 KiB
sample_02 AC 5 ms 15872 KiB
sample_03 AC 5 ms 15872 KiB
sample_04 AC 5 ms 15872 KiB
sample_05 AC 6 ms 15872 KiB