Ynoi2016 這是我自己的發明(莫隊)

2022-04-29 23:36:08 字數 1979 閱讀 3497

話說這道題資料是不是都是鏈啊,我不手動擴棧就全 \(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...