zoukankan      html  css  js  c++  java
  • 在一个含有1-n的序列中,每次找到第Ki小的数,并把它删除(线段树)

    Data structure is one of the basic skills for Computer Science students, which is a particular way of storing and organizing data in a computer so that it can be used efficiently. Today let me introduce a data-structure-like problem for you. 
    Original, there are N numbers, namely 1, 2, 3...N. Each round, iSea find out the Ki-th smallest number and take it away, your task is reporting him the total sum of the numbers he has taken away. 

    在一个含有1-n的序列中,每次找到第Ki小的数,并把它删除。InputThe first line contains a single integer T, indicating the number of test cases. 
    Each test case includes two integers N, K, K indicates the round numbers. Then a line with K numbers following, indicating in i (1-based) round, iSea take away the Ki-th smallest away. 

    Technical Specification 
    1. 1 <= T <= 128 
    2. 1 <= K <= N <= 262 144 
    3. 1 <= Ki <= N - i + 1 
    第一个数T,表示测试数据的组数。
    每组测试数据,第一行2个整数n和m,m表示操作的轮数。
    接下来m行,每行一个整数k,表示要找出第k小的数,并把它删除。OutputFor each test case, output the case number first, then the sum.
    每组数据,输出一个整数,表示删除元素的总和。Sample Input

    2
    3 2
    1 1
    10 3
    3 9 1

    Sample Output

    Case 1: 3
    Case 2: 14
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<vector>
    #include<cmath>
    #include<string>
    #include<map>
    #include<queue>
    using namespace std;
    typedef long long ll;
    struct node{
    	ll l,r,sum;
    }a[1200000];
    void update(ll k){
    	a[k].sum=a[k<<1].sum+a[k<<1|1].sum;
    	return ;
    }
    //建树 
    void build(ll k,ll l,ll r){
    	a[k].l=l;
    	a[k].r=r;
    	if(l==r){
    		a[k].sum=1;//每个叶节点起初长度都为1 
    		return ;
    	}
    	ll mid=(a[k].l+a[k].r)>>1;
    	build(k<<1,l,mid);
    	build(k<<1|1,mid+1,r);
    	update(k);
    	return ;
    }
    ll ans;
    void query(ll k,ll x){
    	if(a[k].l==a[k].r){
    		a[k].sum=0;
    		ans+=a[k].l;
    		return ;
    	}
    	ll mid=(a[k].l+a[k].r)>>1;
    	//首先在左孩子中找 
    	if(x<=a[k<<1].sum){
    		query(k<<1,x);
    	}
    	else {
    		//在右孩子中能够找记得变化 
    		query(k<<1|1,x-a[k<<1].sum);
    	}
    	update(k);
    	return ;
    }
    
    
    int main(){
    	ll t,cnt=1;
    	cin>>t;
    	while(t--){
    		ll n,c;
    		cin>>n>>c;
    		build(1,1,n);
    		ll x;
    		ans=0;
    		for(ll i=1;i<=c;i++){
    			cin>>x;
    			query(1,x);
    		}
    		cout<<"Case "<<cnt++<<": "<<ans<<endl;
    	}
    	return 0;
    }
    //            /       |  /  |**、
    //			 /        | /   |   
    //			/         |/    |   /  _____                      ____   |  /
    //		   /------    |    |__/  /             /      /  /      | /
    //		  /           |    |    /             /      /  /______ |/
    //		 /            |    |           /     /      /           |
    //      /             |    |     \_____/     /      /     \_____  |
    /**
     *        ┏┓    ┏┓
     *        ┏┛┗━━━━━━━┛┗━━━┓
     *        ┃       ┃  
     *        ┃   ━    ┃
     *        ┃ >   < ┃
     *        ┃       ┃
     *        ┃... ⌒ ...  ┃
     *        ┃       ┃
     *        ┗━┓   ┏━┛
     *          ┃   ┃ Code is far away from bug with the animal protecting          
     *          ┃   ┃   神兽保佑,代码无bug
     *          ┃   ┃           
     *          ┃   ┃        
     *          ┃   ┃
     *          ┃   ┃           
     *          ┃   ┗━━━┓
     *          ┃       ┣┓
     *          ┃       ┏┛
     *          ┗┓┓┏━┳┓┏┛
     *           ┃┫┫ ┃┫┫
     *           ┗┻┛ ┗┻┛
     */
    // warm heart, wagging tail,and a smile just for you!
    //
    //                            _ooOoo_
    //                           o8888888o
    //                           88" . "88
    //                           (| -_- |)
    //                           O  =  /O
    //                        ____/`---'\____
    //                      .'  |     |//  `.
    //                     /  |||  :  |||//  
    //                    /  _||||| -:- |||||-  
    //                    |   | \  -  /// |   |
    //                    | \_|  ''---/''  |   |
    //                      .-\__  `-`  ___/-. /
    //                  ___`. .'  /--.--  `. . __
    //               ."" '<  `.___\_<|>_/___.'  >'"".
    //              | | :  `- \`.;` _ /`;.`/ - ` : | |
    //                 `-.   \_ __ /__ _/   .-` /  /
    //         ======`-.____`-.___\_____/___.-`____.-'======
    //                            `=---='
    //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    //
    

      

  • 相关阅读:
    记laravel项目,本地环境PHP7.1,线上PHP版本7.2,报错each函数废弃问题
    [教程] 《Mysql 实战 45 讲》
    PHP递归求和计算1加到n的和
    SSL原理
    PHP之抽象类与接口
    iOS调试之挂起线程
    iOS之Starfield
    iOS之透视效果
    CSS之框模型
    HTTP之CacheControl
  • 原文地址:https://www.cnblogs.com/akpower/p/11325366.html
Copyright © 2011-2022 走看看