話說這道題資料是不是都是鏈啊,我不手動擴棧就全 \(re\)...
不過 \(a\) 了這題還是很爽的,通過昨晚到今天早上的奮鬥,終於肝出了這題
其實樓上說的也差不多了,就是把區間拆掉然後莫隊瞎搞
弱化版:bzoj [snoi2017]乙個簡單的詢問
那我先講弱化版吧
可以發現
\[\sum_^get(l_1,r_1,x)\times get(l_2,r_2,x)=\sum_^get(0,r_1,x)\times get(0,r_2,x)-\sum_^get(0,l_1-1,x)\times get(0,r_2,x)
\]\[-\sum_^get(0,r_1,x)\times get(0,l_2-1,x)+\sum_^get(0,l_1-1,x)\times get(0,l_2-1,x)
\]我們對上面的式子直接上莫隊,開兩個陣列統計即可
#include #define ll long long
using namespace std;
const int maxn=100000+10;
int n,m,a[maxn],b[maxn],c[maxn],tot,blo;ll ans[maxn],now;
struct queryq[maxn<<2];
bool cmp(query a,query b);
if(l2>1) q[++tot]=(query);
if(l1>1&&l2>1) q[++tot]=(query);
} sort(q+1,q+tot+1,cmp);
int l=0,r=0;
for(int i=1;i<=tot;i++)
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}
然後寫完弱化版就來做這題了……我的**洛谷 \(ac\),\(bzoj\ ac\),\(loj\ tle\),強行上 \(fread\ fwrite\) 才卡過去
其實這道題差不多,轉化為 \(dfs\) 序,然後類似樹剖換根的思想分類討論:
1、\(x=rt\)
2、\(rt\) 在以 \(1\) 為根時 \(x\) 的子樹中
3、\(rt\) 不在以 \(1\) 為根時 \(x\) 的子樹中
然後第一種和第三種情況比較簡單,第二種情況要找 \(rt\) 在**,我用的樹剖,其實還可以用倍增,轉化為兩段區間,然後合併 \(x\) 的區間和 \(y\) 的區間
那麼就要分九種情況討論了 怪不得lxl的題目那麼毒瘤
嚴重壓行後 \(91\) 行,還是比較清爽的
\(code\ below:\)
#pragma comment(linker, "/stack:102400000,102400000")
#include #define ll long long
using namespace std;
const int maxn=100000+10;
int n,m,rt=1,a[maxn],mp[maxn],b[maxn],c[maxn],cnt,blo,t;ll ans[maxn*5],now;
int top[maxn],siz[maxn],son[maxn],fa[maxn],id[maxn],head[maxn],to[maxn<<1],nxt[maxn<<1],tot,tim;
struct queryq[maxn*80];
bool cmp(query a,query b);
if(l1>1) q[++cnt]=(query);
if(l2>1) q[++cnt]=(query);
if(l1>1&&l2>1) q[++cnt]=(query);
}int main()
for(i=1;i<=j;i++) printf("%lld\n",ans[i]);
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 鏡中的昆蟲
區間不用種類的數的個數。這個問題可以轉化為對每個點維護乙個 pre 詢問 l sim r 中,有多少個位置是在 0 sim l 1 之間的。這個問題可以用二維偏序做。然後對於區間賦值的操作,可以證明,如果我們找到所有有變化的位置並且把它改掉,它的總更改次數為 o n m 級別的。那具體實現可以用 s...