제출 #1259107

#제출 시각아이디문제언어결과실행 시간메모리
1259107mohammadsamLIS (INOI20_lis)C++20
100 / 100
2125 ms213808 KiB
/* in the name of god */ //#pragma GCC optimize("Ofast,O3,unroll-loops") //#pragma GCC target("avx,avx2,fma") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,avx,avx2,popcnt,tune=native") #include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; typedef pair<long long ,long long> pll; typedef long long ll ; #define File freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #define all(V) V.begin(),V.end() #define setprec(x) fixed << setprecision(x) #define Mp(a,b) make_pair(a,b) #define len(V) (int)(V.size()) #define sep ' ' #define endl '\n' #define pb push_back #define fi first #define sec second #define popcount(x) __builtin_popcount(x) #define lid u<<1 #define rid (lid)|1 mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll N = 1e6 + 10,SQ=320,LOG=22; const ll inf = 2e9 , MD = 1e9 + 7; inline ll md(ll x){ x %= MD; return (x < 0 ? x + MD : x);} int q; int x[N],p[N]; int fen[N]; int pos[N]; int arr[N]; void add(int i,int v){ for(;i<N;i+=-i&i) fen[i] += v; } int search(int k){ int now = 0; int sum = 0; for(int j =LOG-1;j >= 0;j--){ if(now + (1<<j) <= q && sum + fen[now + (1<<j)] < k){ sum += fen[now + (1<<j)]; now += (1<<j); } } return now + 1; } int dp[N]; set<int> id[N],ind[N]; int mx = 0; void dfs(int u){ mx = max(mx,dp[u]); auto it = id[dp[u]].upper_bound(u); vector<int> vec; while(it != id[dp[u]].end() && arr[*it] > arr[u]){ dp[*it] ++; id[dp[*it]].insert(*it); vec.pb(*it); it = id[dp[u]].erase(it); } for(auto h : vec) dfs(h); } int32_t main() { ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0); cin >> q; for(int i =1 ;i <= q;i++){ cin >> p[i] >> x[i]; } for(int i = 1;i <= q;i++) add(i,1); for(int i = q;i >= 1;i--){ pos[i] = search(p[i]); arr[pos[i]] = x[i]; add(pos[i],-1); } for(int i = 1;i <= q;i++){ dp[pos[i]] = 1; mx = max(mx,1); for(int j = 1 ;j < x[i];j++){ auto it = ind[j].lower_bound(pos[i]); if(it != ind[j].begin()){ it--; dp[pos[i]] = max(dp[pos[i]],dp[*it] + 1); mx = max(mx,dp[pos[i]]); } } ind[x[i]].insert(pos[i]); id[dp[pos[i]]].insert(pos[i]); dfs(pos[i]); cout << mx << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...