JZOJ 5628. 【NOI2018模拟4.4】Travel
Description
有N個(gè)人出去旅行,第i個(gè)人去A國(guó)有Ai種游玩方式,去B國(guó)有Bi種游玩方式,問(wèn)至少有C個(gè)人去A國(guó)的情況下,所有人的游玩方式有多少種不同的可能。
兩種所有人的游玩方式不同當(dāng)且僅當(dāng)存在一個(gè)人選擇的游玩方式不同,或選擇去的國(guó)家不同。
接下來(lái)有P次修改,每次修改一個(gè)人的Ai和Bi。
Input
第一行兩個(gè)正整數(shù),表示N,C,含義如題所示。
接下來(lái)一行N個(gè)整數(shù),第i個(gè)整數(shù)表示Ai。
接下來(lái)一行N個(gè)整數(shù),第i個(gè)整數(shù)表示Bi。
接下來(lái)一行一個(gè)正整數(shù)表示P。
接下來(lái)P行,每行三個(gè)整數(shù)i,x,y,表示修改Ai為x,Bi為y。
Output
對(duì)每次修改輸出一行一個(gè)整數(shù),表示總方案數(shù) mod 10007。
Sample Input
4 2
1 2 3 4
1 2 3 4
1
4 1 1
Sample Output
66
Data Constraint
對(duì)于100%的數(shù)據(jù)滿足:Ai,Bi,x,y在int范圍內(nèi)。
Solution
直接線段樹(shù)……
由于 c 特別的小,考慮正難則反。
即用總方案數(shù) tot ,減去有 0 到 c?1 個(gè)人到A國(guó)的方案數(shù) ans 。
易得:
tot=∏i=1n(ai+bi)開(kāi) c 棵線段樹(shù),代表一個(gè)區(qū)間代表恰好有 i 個(gè)人去A國(guó)的方案數(shù)。
那么有:
ans=∑i=0c?1f[root][i]每次轉(zhuǎn)移時(shí)枚舉左右子樹(shù)的 i ,O(c2) 轉(zhuǎn)移即可。
總時(shí)間復(fù)雜度 O(Nc2?logN) 。
Code
#include<cstdio> #include<cctype> using namespace std; const int N=1e5+5,C=20,mo=10007; int n,c,qi,tot; int f[N<<2][C],a[N],b[N]; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline void write(int x) {if(x>9) write(x/10);putchar(x%10+'0'); } inline int ksm(int x,int y) {int s=1;while(y){if(y&1) s=s*x%mo;x=x*x%mo;y>>=1;}return s; } inline void update(int v) {int ls=v<<1,rs=ls|1;for(int i=0;i<c;i++) f[v][i]=0;for(int i=0;i<c;i++)for(int j=0;i+j<c;j++)f[v][i+j]=(f[v][i+j]+f[ls][i]*f[rs][j])%mo; } void make(int v,int l,int r) {if(l==r){f[v][0]=b[l];f[v][1]=a[l];return;}int mid=l+r>>1;make(v<<1,l,mid);make(v<<1|1,mid+1,r);update(v); } void change(int v,int l,int r) {if(l==r){f[v][0]=b[qi];f[v][1]=a[qi];return;}int mid=l+r>>1;if(qi<=mid) change(v<<1,l,mid); else change(v<<1|1,mid+1,r);update(v); } int main() {n=read(),c=read();for(int i=1;i<=n;i++) a[i]=read()%mo;for(int i=tot=1;i<=n;i++){b[i]=read()%mo;tot=tot*(a[i]+b[i])%mo;}make(1,1,n);int p=read();while(p--){qi=read();int x=read()%mo,y=read()%mo;tot=tot*ksm(a[qi]+b[qi],mo-2)%mo;tot=tot*(x+y)%mo;a[qi]=x,b[qi]=y;change(1,1,n);int ans=0;for(int i=0;i<c;i++) ans=(ans+f[1][i])%mo;ans=(tot-ans+mo)%mo;write(ans),putchar('\n');}return 0; }總結(jié)
以上是生活随笔為你收集整理的JZOJ 5628. 【NOI2018模拟4.4】Travel的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JZOJ 5627. 【NOI2018模
- 下一篇: JZOJ 5630. 【NOI2018模