給定
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 句子字元總和不超過 ...