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是由當前管道內請求的重要值的中間值來計算。