1. 程式人生 > >Codeforces Round #470-D-Perfect Security(01字典樹)

Codeforces Round #470-D-Perfect Security(01字典樹)


題意:給你兩個陣列,對於每個ai,在b陣列中找到一個元素與其異或,得到的值為ci,同時刪除bi,然後讓你輸出組成字典序最小c陣列

題解:裸的01字典樹,對於每個ai,找能和ai異或出最小值的bi即可,暴力超時,所以可將每個bi插入字典樹中,因為每次找到一個bi後要刪除bi,但是對於刪除操作我覺得過於繁瑣,因此我是標記每個節點出現的次數,這樣就能無腦不重複的找到當前最佳的bi(ps:比賽時死於sum陣列的清空,為什麼就不能延長個5分鐘?->還是太菜)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 300005
ll a[maxn],b[maxn],n,ans[maxn],siz,cnt[maxn*50][2];
ll sum[maxn*50];
void insert(ll x)
{
	int now=0;
	for(ll i=32;i>=0;i--)
	{
		ll p=0;
		if(x&(1ll<<i))
			p=1;
		if(!cnt[now][p])
			cnt[now][p]=++siz;
		sum[cnt[now][p]]++;
		now=cnt[now][p];
	}
}
void work(int id,ll x)
{
	int now=0;ll res=0;
	for(ll i=32;i>=0;i--)
	{
		ll p=0;
		if(x&(1ll<<i)) p=1;
		if(sum[cnt[now][p]]==0)
			res+=(1ll<<i),p=1-p;
		sum[cnt[now][p]]--;
		now=cnt[now][p];
	}
	ans[id]=res;
}
int main(void)
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&b[i]);
		insert(b[i]);
	}
	for(int i=1;i<=n;i++)
		work(i,a[i]);
	for(int i=1;i<=n;i++)
		printf("%lld ",ans[i]);
	printf("\n");
	return 0;
}


相關推薦

Codeforces Round #470-D-Perfect Security01字典

題意:給你兩個陣列,對於每個ai,在b陣列中找到一個元素與其異或,得到的值為ci,同時刪除bi,然後讓你輸出組成字典序最小c陣列 題解:裸的01字典樹,對於每個ai,找能和ai異或出最小值的bi即可

Educational Codeforces Round 54 D Edge Deletion最短路

題目連結:Edge Deletion 題意:給定一張n個頂點,m條邊的帶權無向圖,已知從頂點1到各個頂點的最短路徑為di,現要求保留最多k條邊,使得從頂點1到各個頂點的最短距離為di的頂點最多。輸出m條邊中需要保留的邊的編號。 題解:先跑一遍最短路,在鬆弛操作時,存父子關係和邊,在以這些關係建立新圖(樹)

codeforces 888G Xor-MST01字典

題目連結這題主要操作就是建立一棵01Trie樹(其實就是一顆普通的二叉樹嘛),由於最大值小於2^30,所以最大樹高到30就好了,在樹的分叉點上,左子樹和右子樹分別是兩個集合(集合的size是葉節點的數量),根分別為A和B,深度(假設葉子節點的深度為1)為h,合併(連線)這兩個

【Hdu4825】Xor Sum01字典

insert else 結果 char clu 向人 logs mark 每次 Description Zeus 和 Prometheus 做了一個遊戲,Prometheus 給 Zeus 一個集合,集合中包含了N個正整數,隨後 Prometheus 將向 Zeus 發起M

HDU - 4825 Xor Sum01字典

ref acm num 測試數據 des sin pro 問號 OS 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 題目: Problem Description Zeus 和 Prometheus 做了一個遊

HDU 4825 Xor Sum01字典題解

思路:先把所有數字存進字典樹,然後從最高位貪心。 程式碼: #include<set> #include<map> #include<stack> #include<cmath> #include<queue> #include<ve

Gym - 100548I International Collegiate Routing Contest 01字典

  題意:給你多個子網掩碼,要你求一個最小的子網掩碼補集。   解題思路:IPV4一共有 2^32個地址,實際上對應的就是一個完全字典樹。現在給定的子網掩碼,實際上就是給定了一個字典樹,然後要你求這個字典樹的補樹,使得是一個完全字典樹。實際上就是求這個字典樹

100548I International Collegiate Routing Contest 01字典

題意:給你多個子網掩碼,要你求一個最小的子網掩碼補集。 解題思路:IPV4一共有 2^32個地址,實際上對應的就是一個完全字典樹。現在給定的子網掩碼,實際上就是給定了一個字典樹,然後要你求這個字典樹的補樹,使得是一個完全字典樹。實際上就是求這個字典樹的所有補樹形

HDU4825 Xor Sum01字典

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 4309    Accepted Submission(s

異或最大值01字典

#include<bits/stdc++.h> using namespace std; const int maxn = 100000 + 5; //集合中的數字個數 typedef long long LL; int ch[32 * maxn

Xor Sum 01字典基礎的字典題目

初學字典樹的可以拿這道題練練手。 題目連結:傳送門 題目大意:給你n個數,有m次詢問,每次給個數,問:這個數與n個數中的哪個數的異或值最大,輸出它。 給大家兩種寫法; 1。陣列的寫法: #

Codeforces Round #470 (Div 2) B 數學 C 二分+狀數組 D 字典

fin -i insert 數組 字典 main esp ace blog Codeforces Round #470 B. Primal Sport 數學題,對 x2 和 x1 分解質因子即可。 #include<bits/stdc++.h>

Codeforces Round #502 D. The Wu狀壓預處理

making lines memory nts type next .org efi math.h D. The Wu time limit per test 2 seconds memory limit per test 256 megabytes

Codeforces Round #513 D - Social Circles貪心

std typedef ORC using codeforce names nbsp 代碼 code 題目大意:有n(n≤105)個人排成一圈,第i個人要求自己左邊空出li個座位,右邊空出ri(li,ri≤109)個座位。問最少需要安排多少個座位。思路:一開始先假設每

Codeforces Round #505 -D-Recovering BST區間DP

D. Recovering BST time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Di

Codeforces Round #470-C-Producing Snow二分

題意:給你n堆雪,每堆有ai單位,第i堆從第i天開始融化,並從此往後每天能融化bi單位(當然,若總量在改天小於bi,呢就是融化剩下的單位量),然後問你每天融化的雪的總量。 題解:對於每天最多能融化的

Codeforces Round #515 (Div. 3) E模擬+字首和

題意:a和b是兩個01字串,現要計算a&b+a&b>>1+a&b>>2+……(直到b=0) 思路: 因為a和b的長度不確定,所以給短的那個在前面補上0,因為b每一次往右移,所以可以計算b的每一位上的貢獻,這個貢獻就是這一位及前面一共有多少1,為什麼

Codeforces Round #520 (Div. 2)B貪心,數學

#include<bits/stdc++.h>using namespace std;int mi[100007];int main(){ int cnt=0; int flag=0; int ans=1; int n,k=0; scanf("%d",&n); for(int i=2;i*

Educational Codeforces Round 55 E. Increasing Frequency尺取法+思維

題目連結: E. Increasing Frequency   題意: 有一個長度為 n 的序列,已知正整數 c 。可以做一次操作:把區間 [l,r] 的所有數 + k (k為任意整數,l,r也自己定)。問操作後序列中最多有多少個元素的值等於 c 。  

牛客國慶集訓派對Day1 D-Love Live! 啟發式合併+01字典

題目描述 因為招生辦的招生政策變化,Otonokizaka Academy的ACM-ICPC team面臨廢隊危機。Honoka Kosaka,Kotori Minami,Umi Sonoda等人決定成為偶像來吸引更多的學生參加ICPC。 Honoka決定選取一些動作來