1. 程式人生 > >ZOJ 3635——Cinema in Akiba(樹狀陣列+二分)

ZOJ 3635——Cinema in Akiba(樹狀陣列+二分)

有一排座位共N個,然後有N個人,每次給一個xi,從左到右數到第xi個空位,這個空位就安排給第i個人,接著就有一系列詢問要找第i個人的位置。

因為N可以達到50000,一個個模擬肯定得T掉的。

假設當前是第i個人,用S[j]代表從左邊開始到第j個位置一共有多少個空位,對於xi,我們要找的就是S[j]=xi,並且j位置為空;

顯然S這個序列是非遞減的,所以我們可以用二分的方法找到這個位置。

而S[j]的求解,其實就是求一個字首和,再加上每次只安排一個位置,所以可以用樹狀陣列來解決。

二分的複雜度是logN,樹狀陣列也是logN,所以總的複雜度是O(N*logN*logN)

#include<cstdio>
#include<cstring>
int n, m, q, ans[50001], s[50001];
int low, top, mid;
bool st;
void add(int x){
	for(;x<=n;x+=(x&(-x)))	s[x]++;
}
int sum(int x){
	int re=0;
	for(;x>0; x-=(x&(-x)))	re+=s[x];
	return re;
}
int main(){
	while(~scanf("%d", &n)){
		memset(s,0,sizeof(s));
		for(int i=1; i<=n; i++){
			scanf("%d", &q);
			low=1; top=n;
			while(low<top){
				mid=(low+top)>>1;
				int tmp = mid-sum(mid);
				if(tmp>=q)	top=mid;
				else	low=mid+1;
			}
			ans[i]=low;
			add(low);
		}
		scanf("%d", &m);
		st=0;
		while(m--){
			if(st)	putchar(' ');
			st=1;
			scanf("%d", &q);
			printf("%d", ans[q]);
		}
		puts("");
	}
	return 0;
}


相關推薦

ZOJ 3635——Cinema in Akiba陣列+二分

有一排座位共N個,然後有N個人,每次給一個xi,從左到右數到第xi個空位,這個空位就安排給第i個人,接著就有一系列詢問要找第i個人的位置。 因為N可以達到50000,一個個模擬肯定得T掉的。 假設當前是第i個人,用S[j]代表從左邊開始到第j個位置一共有多少個空位,對於x

ZOJ 3635 Cinema in Akiba陣列 + 二分

題意: 有 n 個位置,從小到大分別編號為 1~n。然後有 n 次操作,每次取第 Ki 個沒有被取到的編號,最後詢問某次操作取出的是誰。 解題思路: 用 sum(i) 記錄 1~i 位置中,一共有幾個空座位。每次二分找到第 Ki 個是哪一個,然後將這個位置 th

ZOJ 3635 Cinema in Akiba二分+陣列

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

ZOJ 題目3635 Cinema in Akiba線段插空

Cinema in Akiba Time Limit: 3 Seconds      Memory Limit: 65536 KB Cinema in Akiba (CIA) is a small but very popular cinema in Akihabara.

免費的餡餅(二維偏序陣列

https://vjudge.net/contest/261263#problem/B(題目連結) 因為一秒可以走1或2步或不走。 我們可以看成半秒走1步或不走。 dp[i]表示接到第i塊餅時最大的分數值 現在有兩塊餅它們下落的時間為ti,tj,位置為pi,pj; 假設ti &g

3067 Japan 陣列 思維

題意:        日本東海岸有N個城市(從北到南命名為1, 2, ..., N),西海岸有M個城市(從北到南命名為1, 2, ..., M),東西之間有K條高速公路,問這K條高速公路有多少個交叉

敵兵佈陣-HDU1166 陣列模板

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

【BZOJ1106】【POI2007】立方體大作戰tet陣列+貪心

貪心策略:每加入一個數,如果之前已經存在它了,就直接交換 因此我們需要維護距離 就用樹狀陣列好了 注意是2n #include<bits/stdc++.h> #define N 100005 using namespace std; int n,tree[N],pre[N],ans; inline

[BZOJ1227][SDOI2009]虔誠的墓主人陣列+掃描線

題目: 我是超連結 題解: 首先離散橫縱座標. 以縱座標為第一關鍵字,橫座標為第二關鍵字排序依次考慮每個點. 對於相鄰的兩個點a,b; 如果a.y=b.y;設在這一行,a左邊算上a有sa棵樹,b右邊算上b有sb棵樹. 那麼這一行上a,b之間的點都會

ICPC2017網路賽南寧子序列最大權值陣列+dp

Let SS be a sequence of integers s_{1}s ​1 ​​ , s_{2}s ​2 ​​ , ......, s_{n}s ​n ​​ Each integer is is associated with a weight by the f

2018牛客網暑假多校第一場J陣列+思維

題目描述:     有一個n個數的數列,並由q個詢問,每一個詢問有一個l和r,問你在區間a1—al和ar—an這兩個區間中有多少個不同的數。 題目分析:     這個題目事實上是spoj的某一題的改編,原題是求l到r區間有多少個不同的數,現在這個題是要求兩個分開的區間有

Cinema in Akiba線段求解位置

Cinema in Akiba Time Limit: 3 Seconds Memory Limit: 65536 KB Cinema in Akiba (CIA) is a small but very popular cinema in A

zoj 3635陣列求K大

zoj題目連結:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3635 解題報告人:GHQ(SpringWater) 題目大意:每次從編號1-n刪除一個數字,重新編號1-(n-1),重複操作,問你

hdu 5975---Aninteresting game數組

owb form target pla rst phy ace empty creat 題目鏈接 Problem Description Let’s play a game.We add numbers 1,2...n in increasing or

HDU 1166 敵兵布陣 數組

ota get 無奈 程序 數據 memset others 正整數 cas 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敵兵布陣 Time Limit: 2000/1000 MS (Java/Others

LA 4329數組

tdi string 註意 每一個 方法 long 結果 ios pac 算法競賽入門經典 p197 題目大意: 一條大街上住著n個乒乓球愛好者。常常比賽切磋技術。每一個人都有一個不同的技能值a[i]。每場比賽須要3個人:兩名選手,一名裁判。他們有個奇怪的

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Cards Sorting數組

property void example ++ ger imu sorting 一次 base Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input

Why Did the Cow Cross the Road III數組

man cow 我們 mst ann 統計 clu tinc iii Why Did the Cow Cross the Road III 時間限制: 1 Sec 內存限制: 128 MB提交: 65 解決: 28[提交][狀態][討論版] 題目描述 Th

[BZOJ3378] [Usaco2004 Open]MooFest 狂歡節數組

etc cmp ++ 數量 digi fin ans open log 傳送門 開2個樹狀數組 一個存的是下標,一個存的是數量 細節。。。看標稱吧,懶得說了,好氣啊 #include <cstdio> #include <iost

[BZOJ4994] [Usaco2017 Feb]Why Did the Cow Cross the Road III數組

樹狀數組 else cow why 貢獻 return cout inline cross 傳送門 1.每個數的左右位置預處理出來,按照左端點排序,因為左端點是從小到大的,我們只需要知道每條線段包含了多少個前面線段的右端點即可,可以用樹狀數組 2.如果 ai &l