日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 5628. 【NOI2018模拟4.4】Travel

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 5628. 【NOI2018模拟4.4】Travel 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

有N個人出去旅行,第i個人去A國有Ai種游玩方式,去B國有Bi種游玩方式,問至少有C個人去A國的情況下,所有人的游玩方式有多少種不同的可能。
兩種所有人的游玩方式不同當且僅當存在一個人選擇的游玩方式不同,或選擇去的國家不同。
接下來有P次修改,每次修改一個人的Ai和Bi。

Input

第一行兩個正整數,表示N,C,含義如題所示。
接下來一行N個整數,第i個整數表示Ai。
接下來一行N個整數,第i個整數表示Bi。
接下來一行一個正整數表示P。
接下來P行,每行三個整數i,x,y,表示修改Ai為x,Bi為y。

Output

對每次修改輸出一行一個整數,表示總方案數 mod 10007。

Sample Input

4 2
1 2 3 4
1 2 3 4
1
4 1 1

Sample Output

66

Data Constraint

對于100%的數據滿足:Ai,Bi,x,y在int范圍內。

Solution

  • 直接線段樹……

  • 由于 c 特別的小,考慮正難則反。

  • 即用總方案數 tot ,減去有 0c?1 個人到A國的方案數 ans 。

  • 易得:

    tot=i=1n(ai+bi)

  • c 棵線段樹,代表一個區間代表恰好有 i 個人去A國的方案數。

  • 那么有:

    ans=i=0c?1f[root][i]

  • 每次轉移時枚舉左右子樹的 iO(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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。