GDOI模擬2016 03 05 魔道研究

2021-07-10 07:45:08 字數 1775 閱讀 7047

給定

t 個可重集ti

,從第i

個可重集中選擇前

i大,組成可重集

s 。 有m

個操作,分為兩種,分別是給

t 集合刪除某乙個元素或是給

t集合加入某乙個元素。維護每次操作後

s 的前n大。

m,n,

t≤300000

,所有元素都為不大於109

的正整數。

顯然我們可以使用資料結構維護

t 集合以及

s集合。

新增操作時,我們在對應ti

集合中插入該數,查詢排名ra

nk。如果ra

nk<=

i ,說明它擠掉了乙個數,那麼我們就將ti

集合的第i+

1 名從

s 中刪除,最後在

s加入新數即可。

刪除操作類似。

這個資料結構可以選用平衡樹,配對堆等。其實權值線段樹就可以解決問題,具體過程需要動態開點。

#include 

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

int read()

while (isdigit(ch))

return x*f;

}const

int s=40000005;

const

int n=300005;

const

int m=300005;

const

int t=300005;

const

int p=1000000000;

int n,m;

struct tree

void init()

int kth(int rt,int rk,int l,int r)

int rank(int rt,int x,int l,int r)

int change(int rt,int x,int l,int r,int delta)

int mid=l+r>>1;

if (x<=mid)

son[rt][0]=change(son[rt][0],x,l,mid,delta);

else

son[rt][1]=change(son[rt][1],x,mid+1,r,delta);

int ls=son[rt][0],rs=son[rt][1];

sum[rt]=sum[ls]+sum[rs];

size[rt]=size[ls]+size[rs];

return rt;

}ll query(int rt,int kth,int l,int r)

}t;int main()

t.change(t.root[0],pi,1,p,1);

}ll ans=t.query(t.root[0],n,1,p);

printf("%lld\n",ans);

}else

t.change(t.root[0],pi,1,p,-1);

}ll ans=t.query(t.root[0],n,1,p);

printf("%lld\n",ans);}}

fclose(stdin);

fclose(stdout);

return

0;}

GDOI模擬 排列

給你m個對1到n的排列的特徵,特徵有兩種 1 x y v 排列的第x個數到第y個數之間的最大值為v 2 x y v 排列的第x個數到第y個數之間的最小值為v 要求你還原出這個排列。刷水有益身心健康。既然是求方案,資料範圍又很小,那麼明顯的要用把點向權值連邊。然後他每次給出範圍之後再進行刪邊。最後,二...

GDOI模擬8 21總結

今天做了cqoi2013的題。第一次5個小時做5道題 先看了半小時的題。t5是初中做過的原題,記得是處理出上下界然後暴力列舉就行了,就先打了t5,花了乙個小時搞定了t5,過了樣例和自己出的幾個資料就沒管了 沒對拍是因為我覺得資料生成器有點難搞 然後這題做法本來就是暴力 然後去看了下之前沒怎麼看懂題的...

GDOI模擬2015 08 18 解密

給定一篇由若干個單詞構成的原文,還有乙個由若干個單詞組成的句子。加密文是由原文單詞通過某個單詞 可能一樣 替換而成的,原文相同單詞一定會被相同加密文單詞替換。沒有兩個不同的原文單詞被同乙個加密文單詞替換。要求找出句子在加密文中第一次出現的位置。原文本元總和不超過 1000000 句子字元總和不超過 ...