1. 程式人生 > >ZOJ 3279 Ants 二分樹狀陣列

ZOJ 3279 Ants 二分樹狀陣列

----------

const int maxn=110000;
const int maxm=10000;
int n,m;
struct BIT{
    int n;
    int tree[maxn];
    void init(int n){
        this->n=n;
        memset(tree,0,sizeof(tree));
    }
    int lowbit(int x){
        return x&(-x);
    }
    void add(int x,int val){
        for (int i=x;i<=n;i+=lowbit(i)) tree[i]+=val;
    }
    int query(int x){
        int ret=0;
        for (int i=x;i>0;i-=lowbit(i)) ret+=tree[i];
        return ret;
    }
    //離散 p=lower_bound(b+1,b+n+1,a[i])-b;
    //逆序數 x=(i-1)-query(p);add(p,1);
}bt;
int a[maxn];
int main(){
    while (~scanf("%d",&n)){
        bt.init(n);
        for (int i=1;i<=n;i++) {
            scanf("%d",&a[i]);
            bt.add(i,a[i]);
        }
        scanf("%d",&m);
        char s[2];
        while (m--){
            scanf("%s",s);
            if (s[0]=='p'){
                int x,y;
                scanf("%d%d",&x,&y);
                bt.add(x,-a[x]);
                bt.add(x,y);
                a[x]=y;
            }
            else if (s[0]=='q'){
                int x,l=1,r=n,ans=0;
                scanf("%d",&x);
                while (l<=r){
                    int mid=(l+r)/2;
                    if (bt.query(mid)<x){
                        ans=mid;
                        l=mid+1;
                    }
                    else r=mid-1;
                }
                printf("%d\n",ans+1);
            }
        }
    }
	return 0;
}


----------

相關推薦

ZOJ 3279 Ants 二分陣列

---------- const int maxn=110000; const int maxm=10000; int n,m; struct BIT{ int n; int tree[maxn]; void init(int n){

ZOJ 3635 Cinema in Akiba(二分+陣列

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

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

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

Educational Codeforces Round 53 (Rated for Div. 2) D. Berland Fair 二分+陣列 O(n*logn*logn) 思路

題意: 給定n個店鋪,每個店鋪買的東西有個價格a_i,數量有無限個,然後主人公從1號開始走到n號,每走到一個店鋪,只要他的錢大於價格,他就要買,然後重複上述過程,直到他不能購買,輸出他能買的物品件數; 思路: 直接模擬的話,必然不可行,但是我們知道模擬時到達一個位置後買不起這裡的東西

HDU - 5493 Queue(二分+陣列

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

CodeForces992E 二分 + 陣列(線段

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

luogu3242 接水果 (整體二分+陣列)

考慮整體二分,問題就變成了每個(水果)路徑有多少個滿足條件(權值)的(盤子)子路徑 考慮一個盤子(a,b)表示兩端點(不妨設dfn[a]<dfn[b]),那麼他能接到的水果(u,v)一定滿足(不妨設dfn[u]<dfn[v]): 1.如果a是b的祖先,則u在(a的在(b,a)鏈上的孩子)這個子

2182 二分 + 陣列

Code: #include<cstdio> #include<stack> #include<cstring> #include<algorithm> using namespace std; const int

bzoj2527 [Poi2011]Meteors 整體二分+陣列

Description Byteotian Interstellar Union有N個成員國。現在它發現了一顆新的星球,這顆星球的軌道被分為M份(第M份和第1份相鄰),第i份上有第Ai個國家的太空站。

Educational Codeforces Round 53 (Rated for Div. 2) D. Berland Fair 二分+陣列 O(n*logn*logn) 思路

題意: 給定n個店鋪,每個店鋪買的東西有個價格a_i,數量有無限個,然後主人公從1號開始走到n號,每走到一個店鋪,只要他的錢大於價格,他就要買,然後重複上述過程,直到他不能購買,輸出他能買的物品件數; 思路: 直接模擬的話,必然不可行,但是我們知道模擬時到達一個位置後買

Codeforces 1070C Cloud Computing 二分 + 陣列 + 掃描線

                                                          Codeforces 1070C  Cloud Computing 將左右端點分配到1-n上的各個點,然後從1-n 進行掃描線處理,維護兩個數狀陣列,c[i]

Codeforces846D(二分+陣列)

題意:每次對矩陣進行更新,有一個時刻。然後問什麼時候使得矩陣中有k * k的矩陣被更新了。 思路:二分時間,然後判斷每一個時間是否複合,注意這裡的時間不一定是連續的,所以需要離散化。每次判斷的時候需要對進行重新操作,判斷是否符合,用到了二維樹狀陣列。 #include

BZOJ 2527 [POI2011]MET-Meteors (整體二分+陣列)

題目大意:略 洛谷傳送門 整體二分裸題 考慮只有一個國家的情況如何處理 對詢問數量二分答案,暴力$O(m)$打差分,求字首和驗證,時間是$O(mlogK)$ 如果有$n$個國家,就是$O(nmlogK)$,非常不優秀的時間複雜度 發現我們對於每個國家都進行一次二分很浪費時間 考慮把國家分成一定數

BZOJ 1901 Dynamic Rankings (整體二分+陣列)

題目大意:略 洛谷傳送門 這道題在洛谷上資料比較強 貌似這個題比較常見的寫法是樹狀陣列套主席樹,動態修改 我寫的是整體二分 一開始的序列全都視為插入 對於修改操作,把它拆分成插入和刪除兩個操作 像$CDQ$分治一樣,用結構體記錄操作的位置,修改的權值等 假設為需要處理的詢問分配了一個答

zoj 3279 Ants (線段單點更新)

Ants Time Limit: 2 Seconds      Memory Limit: 32768 KB echo is a curious and clever girl, and she is addicted to the ants recently. She

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

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

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

bzoj 1901 ZOJ 2112 Dynamic Rankings [陣列套主席] [線段套平衡]

Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6900 Solved: 2870 Description 給定一個含有n個數的序列a[1],a[2],a[3]……a[

求逆序 二分+陣列

#include<iostream> #include<stdio.h> using namespace std; int a[100001],n,temp[100001]; long long ct=0; void merg(int first,in

hdu5249---KPI(二分+陣列)

Problem Description 你工作以後, KPI 就是你的全部了. 我開發了一個服務,取得了很大的知名度。數十億的請求被推到一個大管道後同時服務從管頭拉取請求。讓我們來定義每個請求都有一個重要值。我的KPI是由當前管道內請求的重要值的中間值來計算。