【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...