區間不用種類的數的個數。
這個問題可以轉化為對每個點維護乙個\(pre\),詢問\(l \sim r\)中,有多少個位置是在\(0\sim l-1\)之間的。
這個問題可以用二維偏序做。
然後對於區間賦值的操作,可以證明,如果我們找到所有有變化的位置並且把它改掉,它的總更改次數為\(o(n+m)\)級別的。
那具體實現可以用\(set\)維護區間,注意新加入乙個區間時其他區間可能是被這個區間包含,包含這個區間,和這個區間有交,討論比較麻煩。。
#include#define n 100009
#define ls tr[cnt].l
#define rs tr[cnt].r
using namespace std;
typedef long long ll;
int a[n],n,m,pre[n],now[n<<1],b[n<<1],rot[n];
inline ll rd()
while(isdigit(c))
return f?-x:x;
}struct nodec[n];
struct setnodetr[n*200];
int tott;
inline void upd(int &cnt,int l,int r,int x,int y)
inline int query(int cnt,int l,int r,int r));
if(it==s.end())break;
if(it->l>r)break;
if(it->r<=r));
it=col[co].lower_bound(setnode);
if(it!=col[co].end())
else gg(xx,0);}}
else);
tg=r+1;tg2=co;
s.insert(setnode);col[co].insert(setnode);
break;}}
it=s.lower_bound(setnode);
if(it!=s.begin()));
gg(r+1,l-1);
s.insert(setnode);s.insert(setnode);
col[co].insert(setnode);col[co].insert(setnode);
}else if(it->r>=l));
it=col[co].lower_bound(setnode);
if(it!=col[co].end())
s.insert(setnode);col[co].insert(setnode);}}
s.insert(setnode);col[x].insert(setnode);
if(tg));
if(it!=col[tg2].begin())
else gg(tg,0);
}it=col[x].lower_bound(setnode);
if(it!=col[x].begin())
else gg(l,0);
it++;
if(it!=col[x].end())
}else
} return 0;
}
Ynoi2016 這是我自己發明的
link 支援換根和給定兩個點,求子樹中滿足權值相同的方案數 換根操作和遙遠的國度一題類似,直接對應到 rm 序上處理即可 後面的問題和 texttt 類似 仍然使用子樹對應在 rm 序上是一段連續區間,然後容斥得到下式 sum get l 1 1,x times get l 2 1,x get r...
YNOI2016 這是我自己的發明
看到這個標題立刻想到 絕地科學家,八倍不屏息啊,八百里外把頭打啊.首先我們發現如果只考慮第二個操作,這棵樹就是假的,我們可以直接莫隊解決 如果考慮換根的話.可以把乙個操作換成小於等於9個操作就可以了 當然怎麼換,有一些非常噁心的分類討論 嚶嚶嚶ynoi 題是好題 但是要卡常 首先要fread fwr...
Ynoi2016 這是我自己的發明(莫隊)
話說這道題資料是不是都是鏈啊,我不手動擴棧就全 re 不過 a 了這題還是很爽的,通過昨晚到今天早上的奮鬥,終於肝出了這題 其實樓上說的也差不多了,就是把區間拆掉然後莫隊瞎搞 弱化版 bzoj snoi2017 乙個簡單的詢問 那我先講弱化版吧 可以發現 sum get l 1,r 1,x time...