zoukankan      html  css  js  c++  java
  • 线段树

    ZYB has a premutation P,but he only remeber the reverse log of each prefix of the premutation,now he ask you to 

    restore the premutation.

    
    

    Pair (i, j)(i < j) is considered as a reverse log if Ai > Aj is matched.
    Input

    In the first line there is the number of testcases T.

    
    

    For each teatcase:

    
    

    In the first line there is one number N.

    
    

    In the next line there are N numbers Ai,describe the number of the reverse logs of each prefix,

    
    

    The input is correct.

    
    

    1 <= T <= 51,1 <= N <= 50000.

    
    

    Output
    For each testcase,print the ans.

    
    

    Sample Input
    1
    3
    0 1 2

    
    

    Sample Output
    3 1 2



    ----------------------------------------我是分割线^_^-------------------------------------------


    又是一道线段树的题目,普通方法也可以做,只不过肯定超时了,因为用线段树进行优化之后都差点超时= =,
    又是逆序数,题目意思是说给出逆序数对数的前缀和,然后让你求出原序列,查看题解后你会发现一个规律:
    题目给出的Ai,可以通过与前一项相减获得第i个数在1到n的第几大蛇王位置,第i个数为A(i) - A(i-1) + 1
    大,括号中的数为下标,然后通过线段树找得到这个数在剩下的为筛选出去的数中的第几大的位置。


    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<queue>
    #include<vector>
    #include<cctype>
    #include<set>
    #include<map>
    #include<sstream>
    using namespace std;
    
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define INF 0x3f3f3f3f
    #define Int __int64
    #define pii pair<int,int>
    
    const int MAXN = 55555;
    int sum[MAXN<<2];
    int num[MAXN];
    int ans[MAXN];
    
    void PushUp(int rt) {
    	sum[rt] = sum[rt<<1] + sum[rt<<1|1];
    }
    void Build(int l, int r, int rt) {
    	if (l == r) {
    		sum[rt] = 1;
    		return ;
    	}
    	int m = (l + r)>>1;
    	Build(lson);
    	Build(rson);
    	PushUp(rt);
    }
    void UpDate(int pos, int l, int r, int rt) {
    	if (l == r) {
    		sum[rt] = 0;
    		return ;
    	}
    	int m = (l + r)>>1;
    	if (pos <= m) UpDate(pos, lson);
    	else UpDate(pos, rson);
    	PushUp(rt);
    }
    int Query(int value, int l, int r, int rt) {
    	if (l == r) {
    		return r;
    	}
    	int ret;
    	int m = (l + r)>>1;
    	if (value - sum[rt<<1|1] > 0) ret = Query(value - sum[rt<<1|1], lson);/*注意理解这里,
      如果第几大的位置超过右边的范围了,就去左边找*/ else ret = Query(value, rson); return ret; } int main() { //freopen("input.txt", "r", stdin); int T; while (cin>>T) { while (T--) { int n; cin>>n; memset(sum, 0, sizeof(sum)); Build(1, n, 1); for (int i = 0; i < n; i++) { cin>>num[i]; } for (int i = n - 1; i >= 1; i--) { int t = num[i] - num[i - 1] + 1; ans[i] = Query(t, 1, n, 1); UpDate(ans[i], 1, n, 1); } ans[0] = Query(1, 1, n, 1); for (int i = 0; i < n; i++) { cout<<ans[i]; if (i != n - 1) cout<<" "; else cout<<endl; } } } return 0; }
  • 相关阅读:
    08 突破512字节的限制 下
    瑞芯微/全志CPU型号
    labview介绍
    07 突破512字节的限制 中
    1-20安卓自学
    1-19安卓自学
    1-18安卓自学
    关系抽取---远程监督 ---《DSGAN: Generative Adversarial Training for Distant Supervision Relation Extraction》
    关系抽取--- 远程监督---《Reinforcement Learning for Relation Classification from Noisy Data》
    关系抽取 --- 远程监督 ---《DIAG-NRE: A Neural Pattern Diagnosis Framework for Distantly Supervised Neural Relation Extraction》
  • 原文地址:https://www.cnblogs.com/steamedbun/p/5776681.html
Copyright © 2011-2022 走看看