1. 程式人生 > >1017(二分+樹狀陣列)

1017(二分+樹狀陣列)

Problem Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood 'watering hole' and drank a few too many beers before dinner. When it was time to line up for their evening meal, they did not line up in the required ascending numerical order of their brands.

Regrettably, FJ does not have a way to sort them. Furthermore, he's not very good at observing problems. Instead of writing down each cow's brand, he determined a rather silly statistic: For each cow in line, he knows the number of cows that precede that cow in line that do, in fact, have smaller brands than that cow.

Given this data, tell FJ the exact ordering of the cows.

Input * Line 1: A single integer, N <br> <br>* Lines 2..N: These N-1 lines describe the number of cows that precede a given cow in line and have brands smaller than that cow. Of course, no cows precede the first cow in line, so she is not listed. Line 2 of the input describes the number of preceding cows whose brands are smaller than the cow in slot #2; line 3 describes the number of preceding cows whose brands are smaller than the cow in slot #3; and so on. <br>
Output * Lines 1..N: Each of the N lines of output tells the brand of a cow in line. Line #1 of the output tells the brand of the first cow in line; line 2 tells the brand of the second cow; and so on.
Sample Input 5 1 2 1 0
Sample Output 2 4 5 3 1

題目大概+思路:



二分和樹狀陣列結合的題目。

程式碼:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int n;
long long c[8005];
int a[8005],b[8002];
int vis[10000];
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int v)
{
    while(x<=8001)
    {
        c[x]+=v;
        x=x+lowbit(x);
    }
}

long long sum(int x)
{
    long long su=0;
    while(x>0)
    {
        su+=c[x];
        x-=lowbit(x);
    }
    return su;
}

int go(int x)
{
    int l=1,r=n;
    int mid;

    while(l<r)
    {
        mid=(l+r)/2;
        int ll=mid-sum(mid);
        if(ll<x)
        {
            l=mid+1;
        }
        else
        {
            r=mid;
        }
    }
    return l;
}

int main()
{

    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
     a[0]=0;
    for(int i=n-1;i>=0;i--)
    {
       b[i]=go(a[i]+1);

        add(b[i],1);
    }

    for(int i=0;i<n;i++)
    {
        printf("%d\n",b[i]);
    }




    return 0;
}

相關推薦

1017二分+陣列

Problem Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they

HDU - 5493 Queue二分+陣列

題目連結:傳送門   題意:給你n個人,知道每個人的身高和每個人的前面或者後面有多少個比他高的,讓你輸出字典序最小的可能的排序。   思路:我們可以將人按身高升序順序,然後模擬插空,因為這樣我們就能保證之後插入的人有位置可插,只要注意每次我們可以判斷需要插入的空位

bzoj千題計劃316:bzoj3173: [Tjoi2013]最長上升子序列二分+陣列

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 #define lowbit(x) x&-x

ZOJ 3635 Cinema in Akiba二分+陣列

題意:n個人輪流做到座位上, 第i個人做到第a[i]個空座上, 求最終每個人的座位情況。 思路:經典水題, 二分套樹狀陣列。 細節參見程式碼: #include<cstdio> #inc

[BZOJ2527][POI2011]Meteors整體二分+陣列

Address 洛谷P3527 BZOJ2527 LOJ#2169 Solution 容易想到對於每個詢問二分答案,但一次判定是 O (

poj2104 K-th Number整體二分+陣列

DescriptionYou are working for Macrohard company in data structures department. After failing your previous task about key insertio

【poj 2104】K-th Number整體二分+陣列

傳送門biu~ 題目大意:給一串數字,多次詢問區間的第k小值。 思路:首先考慮一次詢問的情況,我們可以二分答案,然後通過驗證比答案大的數有多少個來不斷地縮小答案範圍直至得到一個準確的答案。而對於多個

VK Cup 2018 Round 2: D. Contact ATC思維+陣列

time limit per test 1 secondmemory limit per test 256 megabytesinput standard inputoutput standard outputArkady the air traffic controller

K-inversions URAL - 1523 DP+陣列

連結 https://cn.vjudge.net/problem/URAL-1523 題意 給你一個1-n的序列 問長度為K的序列有多少種 思路 首先想到DP 遞推式 dp[i][j] =  ∑dp[x][j-1] ( 1<x<i,a[x] > a[i

poj3321——Apple Tree樹上陣列

Description There is an apple tree outside of kaka’s house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple

CodeForces992E 二分 + 陣列線段

http://codeforces.com/problemset/problem/992/E 題意:給定一個序列 ai​ ,記其字首和序列為 si​ ,有 q 個詢問,每次單點修改,詢問是否存在一個 i 滿足 

BZOJ5321 JXOI2017加法二分答案+貪心+堆+陣列

  二分答案後得到每個位置需要被加的次數。考慮貪心。從左到右考慮每個位置,將以該位置為左端點的區間按右端點從大到小加進堆。看該位置還需要被加多少次,如果不需要加了就不管,否則取堆頂區間將其選擇,BIT實現區間覆蓋。 #include<iostream> #include<cstdi

2018.10.29 bzoj3718: [PA2014]Parking陣列

傳送門 顯然只用判斷兩個會相交的車會不會卡住就行了。 直接樹狀陣列維護字尾最大值就行了。 程式碼: #include<bits/stdc++.h> using namespace std; const int N=5e4+5; struct Matrix{int x1,x

異或和權值陣列

異或和(權值樹狀陣列) 題目描述 在加里敦中學的小明最近愛上了數學競賽,很多數學競賽的題都是與序列的連續和相關的。所以對於一個序列,求出它們所有的連續和來說,小明覺得十分的簡單。但今天小明遇到了一個序列和的難題,這個題目不僅要求你快速的求出所有的連續和,還要快速的求出這些連續和的異或值。小明很快的就求出了

codeforces869EThe Untended Antiquity二維陣列

/* 二維樹狀陣列+Hash 題意: 給一個地圖(n,m) 三種操作: 1,在以(r1,c1)、(r2,c2)為對角的矩形四條邊上新增障礙 2,消除以(r1,c1)、(r2,c2)為對角的矩形四條邊上的障礙 3,判斷(r1,c1)到(r2,c2)是否存在一條路徑,不經過障礙 利用二維樹

Luogu P3258 松鼠的新家鏈剖分+線段/陣列

題面 題解   這種題目一看就是重鏈剖分裸題,還是區間修改,單點查詢,查詢之前在遍歷時要記一個\(delta\),因為這一次的起點就是上一次的終點,不需要放糖,所以可以用\(BIT\)來寫,但我寫完\(modify\)才反應過來,所以沒改了。 #include <cstdio> #inclu

HUD 6447 YJJ's Salesman dp + 陣列優化

題意 給你一張 109∗109 10 9 ∗ 10

HDU1166 敵兵佈陣 線段陣列

C國的死對頭A國這段時間正在進行軍事演習,所以C國間諜頭子Derek和他手下Tidy又開始忙乎了。A國在海岸線沿直線佈置了N個工兵營地,Derek和Tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數C國都掌握的一清二楚,每個工兵營地的人數都有可能發生變動,

洛谷P4303 [AHOI2006]基因匹配陣列

傳送門   我已經連這種傻逼題都不會了orz 正常的dp是$O(n^2)$的,列舉第一個陣列的$j$,然後第二個陣列的$k$,如果相等,則$dp[i]=dp[j]+1$,否則$dp[i]=dp[j]$ 然後發現可以用樹狀陣列優化這個過程…… 不知道講清楚沒有因為我自己都還有點懵