题目链接:http://codeforces.com/contest/876/problem/D
题解:一道简单的类似模拟的题目。其实就是看右边连出来有多少连续不需要换的假设位置为pos只要找pos-1左边一共有多少x就行(x是什么看一下样例)
第一个是正常解法第二个是用线段树写的,其实正常写就是模拟一下就好
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<ctime> #include<utility> using namespace std; typedef long long ll; int a[333333]; int main() { int n , x; scanf("%d",&n); int ans = 1 , pos = n; printf("%d ",ans); for(int i = 1 ; i <= n ; i++) { ans++; scanf("%d" , &x); a[x]=1; while(pos >= 1 && a[pos]) { pos--; ans--; } printf("%d " , ans); } return 0; }
这个是用线段树写的没有参考意义
#include <iostream> #include <cstring> #include <cstdio> #define lson (i << 1) #define rson ((i << 1) | 1) using namespace std; const int M = 3e5 + 10; int a[M] , ans[M]; struct TnT { int l , r , sum; }T[M << 2]; void push_up(int i) { T[i].sum = T[lson].sum + T[rson].sum; } void build(int l , int r , int i) { int mid = (l + r) >> 1; T[i].sum = 0 , T[i].l = l , T[i].r = r; if(l == r) { return ; } build(l , mid , lson); build(mid + 1 , r , rson); push_up(i); } void update(int pos , int i) { int mid = (T[i].l + T[i].r) >> 1; if(T[i].l == T[i].r && T[i].l == pos) { T[i].sum ^= 1; return ; } if(mid < pos) { update(pos , rson); } else { update(pos , lson); } push_up(i); } int query(int l , int r , int i) { int mid = (T[i].l + T[i].r) >> 1; if(T[i].l == l && T[i].r == r) { return T[i].sum; } if(mid < l) { return query(l , r , rson); } else if(mid >= r) { return query(l , r , lson); } else { return query(l , mid , lson) + query(mid + 1 , r , rson); } } int query_right(int l , int r , int i) { int mid = (T[i].l + T[i].r) >> 1; if(T[i].l == T[i].r) { if(T[i].sum == 0) { return T[i].l; } return -1; } if(T[rson].sum < (T[rson].r - T[rson].l + 1)) { return query_right(mid + 1 , r , rson); } else { return query_right(l , mid , lson); } } int main() { int n; scanf("%d" , &n); for(int i = 1 ; i <= n ; i++) { scanf("%d" , &a[i]); } ans[0] = 1; build(1 , n , 1); for(int i = 1 ; i <= n ; i++) { update(a[i] , 1); int Ri = query_right(1 , n , 1); if(Ri != -1) { ans[i] = query(1 , Ri , 1) + 1; } else { ans[i] = 1; } } for(int i = 0 ; i <= n ; i++) { printf("%d " , ans[i]); } printf(" "); return 0; }