Submission #410337

#TimeUsernameProblemLanguageResultExecution timeMemory
410337alishahali1382Bitaro, who Leaps through Time (JOI19_timeleap)C++14
0 / 100
251 ms524292 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("O2,unroll-loops") //#pragma GCC optimize("no-stack-protector,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<pii, int> piii; typedef pair<ll, ll> pll; #define debug(x) cerr<<#x<<'='<<(x)<<endl; #define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl; #define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl; #define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;} #define all(x) x.begin(), x.end() #define pb push_back #define kill(x) return cout<<x<<'\n', 0; const int inf=1000000010; const ll INF=1000000000000001000LL; const int mod=1000000007; const int MAXN=3010, LOG=20; int n, m, k, u, v, x, y, t, l, r, a, b; struct Node{ ll dp[2][2]; Node(ll l=0, ll r=0){ dp[0][0]=l; dp[0][1]=0; dp[1][0]=0; dp[1][1]=-r; } }; Node Merge(Node X, Node Y){ Node Z; for (int a=0; a<2; a++) for (int b=0; b<2; b++) Z.dp[a][b]=max(X.dp[a][0]+Y.dp[1][b], X.dp[a][1]+Y.dp[0][b]); return Z; } struct Solver{ int L[MAXN], R[MAXN]; Node seg[MAXN<<2]; Solver(){ seg[0].dp[0][0]=-INF; seg[0].dp[0][1]=0; seg[0].dp[1][0]=0; seg[0].dp[1][1]=-INF; } void Build(int id, int tl, int tr){ if (tr-tl==1){/* seg[id].dp[0][0]=L[tl]; seg[id].dp[0][1]=0; seg[id].dp[1][0]=0; seg[id].dp[1][1]=-R[tl];*/ seg[id]=Node(L[tl], R[tl]); return ; } int mid=(tl+tr)>>1; Build(id<<1, tl, mid); Build(id<<1 | 1, mid, tr); seg[id]=Merge(seg[id<<1], seg[id<<1 | 1]); } void Set(int id, int tl, int tr, int pos){ if (pos<tl || tr<=pos) return ; if (tr-tl==1){ seg[id].dp[0][0]=L[tl]; seg[id].dp[0][1]=0; seg[id].dp[1][0]=0; seg[id].dp[1][1]=-R[tl]; return ; } int mid=(tl+tr)>>1; Set(id<<1, tl, mid, pos); Set(id<<1 | 1, mid, tr, pos); seg[id]=Merge(seg[id<<1], seg[id<<1 | 1]); } Node Get(int id, int tl, int tr, int l, int r){ if (r<=tl || tr<=l) return seg[0]; if (l<=tl && tr<=r) return seg[id]; int mid=(tl+tr)>>1; return Merge(Get(id<<1, tl, mid, l, r), Get(id<<1 | 1, mid, tr, l, r)); } ll Solve(int x, int y, int a, int b){ a-=x; b-=y; Node X(a, a); Node Y=Get(1, 1, n, x, y); Node Z(b, b); X=Merge(X, Merge(Y, Z)); // return max(X.dp[0][1], X.dp[1][0]); return X.dp[0][1]; } } S1, S2; int main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); cin>>n>>m; for (int i=1; i<n; i++){ cin>>l>>r; r--; S1.L[i]=l-i; S2.L[n-i]=l-(n-i); S1.R[i]=r-i; S2.R[n-i]=r-(n-i); } S1.Build(1, 1, n); S2.Build(1, 1, n); while (m--){ cin>>t; if (t==1){ cin>>x>>l>>r; r--; S1.L[x]=l-x; S2.L[n-x]=l-(n-x); S1.R[x]=r-x; S2.R[n-x]=r-(n-x); S1.Set(1, 1, n, x); S2.Set(1, 1, n, n-x); } else{ cin>>x>>a>>y>>b; if (x==y) cout<<max(0, a-b)<<"\n"; if (x<y) cout<<S1.Solve(x, y, a, b)<<"\n"; if (x>y) cout<<S2.Solve(n+1-x, n+1-y, a, b)<<"\n"; } } return 0; } /* 5 1 3 5 4 8 2 6 5 10 2 5 3 1 10 5 1 5 10 2 6 4 8 3 5 2 1 3 5 10 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...