Submission #701546

#TimeUsernameProblemLanguageResultExecution timeMemory
701546sunwukong123Constellation 3 (JOI20_constellation3)C++14
100 / 100
519 ms141652 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define FOR(i,s,e) for(int i = s; i <= (int)e; ++i) #define DEC(i,s,e) for(int i = s; i >= (int)e; --i) #define IAMSPEED ios_base::sync_with_stdio(false); cin.tie(0); #ifdef LOCAL #define db(x) cerr << #x << "=" << x << "\n" #define db2(x, y) cerr << #x << "=" << x << " , " << #y << "=" << y << "\n" #define db3(a,b,c) cerr<<#a<<"="<<a<<","<<#b<<"="<<b<<","<<#c<<"="<<c<<"\n" #define dbv(v) cerr << #v << ":"; for (auto ite : v) cerr << ite << ' '; cerr <<"\n" #define dbvp(v) cerr << #v << ":"; for (auto ite : v) cerr << "{" << ite.f << ',' << ite.s << "} "; cerr << "\n" #define dba(a,ss,ee) cerr << #a << ":"; FOR(ite,ss,ee) cerr << a[ite] << ' '; cerr << "\n" #define reach cerr << "LINE: " << __LINE__ << "\n"; #else #define reach #define db(x) #define db2(x,y) #define db3(a,b,c) #define dbv(v) #define dbvp(v) #define dba(a,ss,ee) #endif mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define pb push_back #define eb emplace_back #define all(x) (x).begin(), (x).end() #define f first #define s second #define g0(x) get<0>(x) #define g1(x) get<1>(x) #define g2(x) get<2>(x) #define g3(x) get<3>(x) typedef pair <int, int> pi; typedef tuple<int,int,int> ti3; typedef tuple<int,int,int,int> ti4; int rand(int a, int b) { return a + rng() % (b-a+1); } const int MOD = 1e9 + 7; const int inf = (int)1e9 + 500; const long long oo = (long long)1e18 + 500; template <typename T> void chmax(T& a, const T b) { a=max(a,b); } template <typename T> void chmin(T& a, const T b) { a=min(a,b); } const int MAXN = 200005; int n,m; pi A[MAXN]; int T; vector<pi> V[MAXN]; struct SparseTable { vector<vector<pi> > ST; int N, K; SparseTable(int _N, pi a[]): N(_N) { K = MSB(N); ST.resize(K); ST[0] = vector<pi>(a, a+N); for (int k = 1; k < K; ++k) for (int i = 0; i+(1<<k) <= N; ++i) ST[k].push_back( min(ST[k-1][i], ST[k-1][i+(1<<(k-1))]) ); //min } /* returns most significant bit of an integer */ inline int MSB(unsigned int x) { return 32-__builtin_clz(x); } /* Min of range (x, x + 2^k-1) and (y-2^k+1, y) */ pi query(int x, int y) { int k = MSB(y-x+1) - 1; return min(ST[k][x], ST[k][y-(1<<k)+1]); } }*ST; int twok[MAXN][20]; vector<int> adj[MAXN]; int st[MAXN]; int en[MAXN]; int cnt =1; int Val[MAXN]; void dnc(int l, int r, int p) { pi node = ST->query(l, r); int idx = node.s, val=node.f; Val[idx]=val; twok[idx][0] = p; FOR(i,1,18) { if(twok[idx][i-1]==-1)break; twok[idx][i] = twok[twok[idx][i - 1]][i - 1]; } st[idx]=cnt++; if(idx != l) { dnc(l, idx-1,idx); } if(idx != r) { dnc(idx+1,r,idx); } en[idx]=cnt-1; } struct fenw { int fw[MAXN]; void update(int x, int nval) { for(;x<MAXN;x+=x&-x)fw[x]+=nval; } int query(int x) { int res =0; for(;x;x-=x&-x)res+=fw[x]; return res; } void update(int x, int y, int nval) { update(x,nval); update(y+1,-nval); } } t1, t2; vector<pi> chains[MAXN]; int dp[MAXN]; void dfs(int x) { for(auto v:adj[x]){ dfs(v); } int tot = 0; for(auto v:adj[x]) { tot += dp[v]; } t1.update(st[x],en[x],tot); for(auto ch:chains[x]) { chmax(dp[x], ch.s + t1.query(st[ch.f]) - t2.query(st[ch.f])); } chmax(dp[x], tot); t2.update(st[x],en[x],dp[x]); db2(x,dp[x]); } int32_t main() { IAMSPEED memset(twok,-1,sizeof twok); cin >> n; FOR(i,1,n) { cin >> A[i].f; A[i].f = n-A[i].f; A[i].s=i; } ST=new SparseTable(n+1,A); dnc(1,n,-1); int root = -1; FOR(i,1,n) { if(twok[i][0] != -1) { adj[twok[i][0]].pb(i); } else { root = i; } } cin >> m; FOR(i,1,m) { int x,y,c; cin >> x >> y >> c; y=n-y; T+=c; int tail = x; DEC(i,19,0) { if(twok[x][i] != -1 && Val[twok[x][i]] > y) { x=twok[x][i]; } } chains[x].pb({tail,c}); db2(x,tail); } dba(st,1,n); dba(en,1,n); dfs(root); cout << T-dp[root]; return (0-0) ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...