CTSC2018 青蕈領主

2021-09-19 09:11:56 字數 1061 閱讀 2325

【ctsc2018】青蕈領主

解析:首先有個結論:對於任意i,j(i既然如此,我們就可以把他所給定的資訊轉化為樹狀結構

我們發現問題轉換為求fi表示對於1,2,3....i+1求出有多少個排列使得在排除1的情況下使得不存在乙個子區間(不能有1)滿足他是連續的(該定義原題中已經給出了)

顯然上述的1可以替換成i+1,兩者等價

難點:那麼我們考慮一下對於f[i]來說加入i+1會有什麼情況

1.如果原來關於i的排列是滿足上述條件的,那麼我們發現只要我們不把i+1加在i的兩邊就符合條件,否則不符合條件

2.如果原來關於i的排列不滿足上述條件,那麼該序列中的極大連續真子區間不會超過1個,所以我們可以列舉這個區間的大小,不妨設它為j,首先該區間的數的選擇情況為i-j-1,然後就是子問題,此貢獻就是f[j],然後縮點之後還有貢獻為f[i-j],總的貢獻為(i-j-1)*f[j]*f[i-j],但是這裡要注意,就是這個j是有範圍的:2<=j<=i-2

綜上所述

對於這個我們只需要分治ntt就行了

#include#define ll long long

using namespace std;

const ll mod=998244353;

const int n=2e5+10;

ll a[n],b[n],f[n];

int lim[n],rev[n];

int t,n,len,k;

ll ans;

ll ksm(ll x,ll y)

void ntt(ll *a,int len,int t)

void lalala_l(int l,int mid,int r)

}void solve(int l,int r)

if (l==r) return;

int sum=0,s=r-1;

while (s>=l)

solve(s-lim[s]+1,s);

s-=lim[s]; sum++;

} ans=(ans*f[sum])%mod;

}int main()

}

CTSC2018 混合果汁

為何要用整體二分,整體二分應該怎樣二分,和 poi2011 met meteors十分相像,這裡就不再重複。那麼對於乙個顧客來講,如果當前的區間總份數小於他想要的份數,或者是區間最小 大於他能接受的最大 就把該顧客劃分到右區間,如若滿足則劃分到左區間。想要和 poi2011 met meteors一...

CTSC 2018 混合果汁

題目鏈結 演算法 對於每組詢問 首先二分答案 顯然 最優策略為優先選擇 低的 建立可持久化線段樹 簡單維護即可 時間複雜度 o nlogn 2 includeusing namespace std define n 100010typedef long long ll typedef long do...

CTSC2018 混合果汁

題目鏈結 luogu loj一道簡單的主席樹 考慮按 d 排序,然後二分乙個答案 x 對 geq x 的 d 建一棵主席樹即可.主席樹上維護兩個資訊 果汁的量和總價.然後在主席樹上二分即可.時間複雜度 o n log 2n 如下 好像才 38 行呢 include include include i...