藍橋杯2016初賽 壓縮變換

2022-04-17 01:16:16 字數 2321 閱讀 1463

題目描述

小明最近在研究壓縮演算法。他知道,壓縮的時候如果能夠使得數值很小,就能通過熵編碼得到較高的壓縮比。然而,要使數值很小是乙個挑戰。

最近,小明需要壓縮一些正整數的序列,這些序列的特點是,後面出現的數字很大可能是剛出現過不久的數字。對於這種特殊的序列,小明準備對序列做乙個變換來減小數字的值。

變換的過程如下:

從左到右列舉序列,每列舉到乙個數字,如果這個數字沒有出現過,剛將數字變換成它的相反數,如果數字出現過,則看它在原序列中最後的一次出現後面(且在當前數前面)出現了幾種數字,用這個種類數替換原來的數字。

比如,序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在變換過程為:

a1: 1未出現過,所以a1變為-1;

a2: 2未出現過,所以a2變為-2;

a3: 2出現過,最後一次為原序列的a2,在a2後、a3前有0種數字,所以a3變為0;

a4: 1出現過,最後一次為原序列的a1,在a1後、a4前有1種數字,所以a4變為1;

a5: 2出現過,最後一次為原序列的a3,在a3後、a5前有1種數字,所以a5變為1。

現在,給出原序列,請問,按這種變換規則變換後的序列是什麼。

輸入輸入第一行包含乙個整數n,表示序列的長度。第二行包含n個正整數,表示輸入序列a。

1 <=n<=100000,1<=ai<=10^9

輸出對於每組測試資料,輸出一行,包含n個數,表示變換後的序列。

樣例輸入 copy

5

1 2 2 1 2

樣例輸出 copy

-1 -2 0 1 1

思路:因為數字的範圍的大小是 [1,1e9] 所以不會考慮用陣列去記錄下標,那麼乾脆就採取 map 去記錄下標

然後要求 [l,r] 之間數字的種類的個數 ,因為是區間問題 ,所以就採取線段樹去維護區間

如果乙個數字是第一次出現,那麼它的這個位置 +1  如果它是第二次(或以上)出現,那麼它之前的位置需要 -1  (有點像字首和)

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x3f3f3f3f

#define ls nod<<1

#define rs (nod<<1)+1

const

int maxn = 1e5 + 10

;const ll mod = 20010905;

struct

segment_tree tree[maxn

<< 2];

void pushup(int

nod)

void pushdown(int

nod)

void build(int l,int r,int

nod)

int mid = (l + r) >> 1

; build(l,mid,ls);

build(mid+1

,r,rs);

pushup(nod);}

void modify(int x,int y,int z,int k=1

)

if(tree[k].lazy)

pushdown(k);

int mid = (l + r) >> 1

;

if (x <=mid)

modify(x,y,z,k

<<1

);

if (y >mid)

modify(x,y,z,(k

<<1)+1

); pushup(k);}

int query(int x,int y,int k=1)

inta[maxn];

std::map

mp;int

main()

else

mp[v] =i;

modify(i,i,1);

}for (int i = 1;i <= n;i++)

printf(

"%d

",a[i]);

return0;

}

藍橋杯2016初賽 壓縮變換 (c 版本)

記錄原始資料 int ans maxn 記錄答案 int b maxn 這是乙個01序列,某乙個位置p上的位置為1,代表著a p 這個數字最後出現的位置是p,而a p 曾經出現的位置上都是0 int n maplastindex struct tree t maxn 4 void build int...

密碼脫落,藍橋杯,2016初賽

題目描述 x星球的考古學家發現了一批古代留下來的密碼。這些密碼是由a b c d 四種植物的種子串成的序列。仔細分析發現,這些密碼串當初應該是前後對稱的 也就是我們說的映象串 由於年代久遠,其中許多種子脫落了,因而可能會失去映象的特徵。你的任務是 給定乙個現在看到的密碼串,計算一下從當初的狀態,它要...

藍橋杯2016初賽 卡片換位

你玩過華容道的遊戲嗎?這是個類似的,但更簡單的遊戲。看下面 3 x 2 的格仔 a b 在其中放5張牌,其中a代表關羽,b代表張飛,代表士兵。還有乙個格仔是空著的。你可以把一張牌移動到相鄰的空格中去 對角不算相鄰 遊戲的目標是 關羽和張飛交換位置,其它的牌隨便在 都可以。輸入輸入存在多組測試資料,對...