JZOJ 5628. 【NOI2018模拟4.4】Travel
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 5628. 【NOI2018模拟4.4】Travel
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
有N個人出去旅行,第i個人去A國有Ai種游玩方式,去B國有Bi種游玩方式,問至少有C個人去A國的情況下,所有人的游玩方式有多少種不同的可能。
兩種所有人的游玩方式不同當且僅當存在一個人選擇的游玩方式不同,或選擇去的國家不同。
接下來有P次修改,每次修改一個人的Ai和Bi。
Input
第一行兩個正整數(shù),表示N,C,含義如題所示。
接下來一行N個整數(shù),第i個整數(shù)表示Ai。
接下來一行N個整數(shù),第i個整數(shù)表示Bi。
接下來一行一個正整數(shù)表示P。
接下來P行,每行三個整數(shù)i,x,y,表示修改Ai為x,Bi為y。
Output
對每次修改輸出一行一個整數(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
對于100%的數(shù)據(jù)滿足:Ai,Bi,x,y在int范圍內。
Solution
直接線段樹……
由于 c 特別的小,考慮正難則反。
即用總方案數(shù) tot ,減去有 0 到 c?1 個人到A國的方案數(shù) ans 。
易得:
tot=∏i=1n(ai+bi)開 c 棵線段樹,代表一個區(qū)間代表恰好有 i 個人去A國的方案數(shù)。
那么有:
ans=∑i=0c?1f[root][i]每次轉移時枚舉左右子樹的 i ,O(c2) 轉移即可。
總時間復雜度 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; }總結
以上是生活随笔為你收集整理的JZOJ 5628. 【NOI2018模拟4.4】Travel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5627. 【NOI2018模
- 下一篇: JZOJ 5630. 【NOI2018模