題目描述
小明最近在研究壓縮演算法。他知道,壓縮的時候如果能夠使得數值很小,就能通過熵編碼得到較高的壓縮比。然而,要使數值很小是乙個挑戰。
最近,小明需要壓縮一些正整數的序列,這些序列的特點是,後面出現的數字很大可能是剛出現過不久的數字。對於這種特殊的序列,小明準備對序列做乙個變換來減小數字的值。
變換的過程如下:
從左到右列舉序列,每列舉到乙個數字,如果這個數字沒有出現過,剛將數字變換成它的相反數,如果數字出現過,則看它在原序列中最後的一次出現後面(且在當前數前面)出現了幾種數字,用這個種類數替換原來的數字。
比如,序列(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
51 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代表張飛,代表士兵。還有乙個格仔是空著的。你可以把一張牌移動到相鄰的空格中去 對角不算相鄰 遊戲的目標是 關羽和張飛交換位置,其它的牌隨便在 都可以。輸入輸入存在多組測試資料,對...