[关闭]
@994495jj 2017-05-31T11:46:46.000000Z 字数 6251 阅读 981

FZU周练-0530老队员场题解

(ACM)数学----概率论 (ACM)数据结构----线段树 (ACM)动态规划----数位dp



题目链接


B. FZU 2103 Bin & Jing in wonderland(概率论)

题意

题解

代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <vector>
  5. #include <cstdio>
  6. #include <string>
  7. #include <cmath>
  8. #include <queue>
  9. #include <set>
  10. #include <map>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned long long ull;
  14. typedef pair<int,int> pii;
  15. typedef pair<ll,ll> pll;
  16. #define mp make_pair
  17. #define pb push_back
  18. #define fi first
  19. #define se second
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define de(x) cout << #x << "=" << x << endl
  23. double A[55];
  24. double p[25];
  25. double s[25];
  26. int a[30],cnt[25];
  27. double kpow(double a,ll k) {
  28. double ans=1;
  29. while(k) {
  30. if(k&1) ans=ans*a;
  31. a=a*a;
  32. k>>=1;
  33. }
  34. return ans;
  35. }
  36. int main() {
  37. ///init
  38. A[0]=1;
  39. for(int i=1;i<55;++i) A[i]=A[i-1]*i;
  40. int T;scanf("%d",&T);
  41. while(T--) {
  42. ///
  43. int n,k,r;scanf("%d%d%d",&n,&k,&r);
  44. ///init
  45. memset(cnt,0,sizeof(cnt));
  46. ///read
  47. for(int i=1;i<=n;++i) scanf("%lf",p+i),s[i]=s[i-1]+p[i];
  48. for(int i=1;i<=r;++i) scanf("%d",a+i);
  49. ///sort a
  50. sort(a+1,a+1+r);
  51. ///solve
  52. double ans=A[k];
  53. for(int i=1;i<=r;++i) {
  54. if(a[i]!=a[1]) {
  55. ans=ans*p[a[i]];
  56. }
  57. ++cnt[a[i]];
  58. }
  59. for(int i=1;i<=n;++i) {
  60. if(i!=a[1]&&cnt[i]) ans=ans/A[cnt[i]];
  61. }
  62. double res=0;
  63. int to=k-(r-cnt[a[1]]);
  64. for(int i=cnt[a[1]];i<=to;++i) {
  65. double t=ans;
  66. t=t*kpow(s[a[1]-1],to-i);
  67. t=t*kpow(p[a[1]],i);
  68. t=t/A[to-i];
  69. t=t/A[i];
  70. res=res+t;
  71. }
  72. printf("%.6lf\n",res);
  73. }
  74. return 0;
  75. }

D. FZU 2105 Digits Count(线段树)

题意

题解

代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <vector>
  5. #include <cstdio>
  6. #include <string>
  7. #include <cmath>
  8. #include <queue>
  9. #include <set>
  10. #include <map>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned long long ull;
  14. typedef pair<int,int> pii;
  15. typedef pair<ll,ll> pll;
  16. #define mp make_pair
  17. #define pb push_back
  18. #define fi first
  19. #define se second
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define de(x) cout << #x << "=" << x << endl
  23. const int N=1000005;
  24. char s[14];
  25. bool rev[4][N<<2];
  26. int a[N],sum[4][N<<2],lazy[4][N<<2];
  27. void build(int l,int r,int rt) {
  28. for(int i=0;i<4;++i) lazy[i][rt]=-1,rev[i][rt]=0;
  29. if(l==r) {
  30. for(int i=0;i<4;++i) {
  31. sum[i][rt]=(a[l]&1);
  32. a[l]>>=1;
  33. }
  34. return ;
  35. }
  36. int m=(l+r)>>1;
  37. build(lson);
  38. build(rson);
  39. for(int i=0;i<4;++i) sum[i][rt]=sum[i][rt<<1]+sum[i][rt<<1|1];
  40. }
  41. void DOWN(int i,int rt,int l,int r) {
  42. int m=(l+r)>>1;
  43. if(lazy[i][rt]!=-1) {
  44. int c=lazy[i][rt];
  45. if(c) {
  46. sum[i][rt<<1]=m-l+1;
  47. sum[i][rt<<1|1]=r-m;
  48. lazy[i][rt<<1]=lazy[i][rt<<1|1]=1;
  49. rev[i][rt<<1]=rev[i][rt<<1|1]=0;
  50. } else {
  51. sum[i][rt<<1]=sum[i][rt<<1|1]=0;
  52. lazy[i][rt<<1]=lazy[i][rt<<1|1]=0;
  53. rev[i][rt<<1]=rev[i][rt<<1|1]=0;
  54. }
  55. lazy[i][rt]=-1;
  56. }
  57. if(rev[i][rt]) {
  58. sum[i][rt<<1]=m-l+1-sum[i][rt<<1];
  59. sum[i][rt<<1|1]=r-m-sum[i][rt<<1|1];
  60. rev[i][rt<<1]^=1;
  61. rev[i][rt<<1|1]^=1;
  62. rev[i][rt]=0;
  63. }
  64. }
  65. void upd(int i,int L,int R,int c,int l,int r,int rt) {
  66. if(R<l||r<L) return ;
  67. if(L<=l&&r<=R) {
  68. if(c==0) {
  69. sum[i][rt]=0;
  70. lazy[i][rt]=0;
  71. rev[i][rt]=0;
  72. } else if(c==1) {
  73. sum[i][rt]=r-l+1;
  74. lazy[i][rt]=1;
  75. rev[i][rt]=0;
  76. } else {
  77. sum[i][rt]=r-l+1-sum[i][rt];
  78. rev[i][rt]^=1;
  79. }
  80. return ;
  81. }
  82. DOWN(i,rt,l,r);
  83. int m=(l+r)>>1;
  84. upd(i,L,R,c,lson);
  85. upd(i,L,R,c,rson);
  86. sum[i][rt]=sum[i][rt<<1]+sum[i][rt<<1|1];
  87. }
  88. int qry(int L,int R,int l,int r,int rt) {
  89. if(R<l||r<L) return 0;
  90. if(L<=l&&r<=R) {
  91. int ans=0;
  92. for(int i=3;i>=0;--i) {
  93. ans=ans*2+sum[i][rt];
  94. }
  95. return ans;
  96. }
  97. int m=(l+r)>>1;
  98. for(int i=0;i<4;++i) DOWN(i,rt,l,r);
  99. return qry(L,R,lson)+qry(L,R,rson);
  100. }
  101. int main() {
  102. int T;scanf("%d",&T);
  103. while(T--) {
  104. ///
  105. int n,m;scanf("%d%d",&n,&m);
  106. ///read
  107. for(int i=1;i<=n;++i) scanf("%d",a+i);
  108. ///build
  109. build(1,n,1);
  110. ///solve
  111. for(int i=1;i<=m;++i) {
  112. int c,l,r;
  113. scanf("%s",s);
  114. if(s[0]=='A') {
  115. scanf("%d%d%d",&c,&l,&r);++l;++r;
  116. for(int j=0;j<4;++j) {
  117. if(c%2==0) upd(j,l,r,0,1,n,1);
  118. c>>=1;
  119. }
  120. } else if(s[0]=='O') {
  121. scanf("%d%d%d",&c,&l,&r);++l;++r;
  122. for(int j=0;j<4;++j) {
  123. if(c&1) upd(j,l,r,1,1,n,1);
  124. c>>=1;
  125. }
  126. } else if(s[0]=='X') {
  127. scanf("%d%d%d",&c,&l,&r);++l;++r;
  128. for(int j=0;j<4;++j) {
  129. if(c&1) upd(j,l,r,2,1,n,1);
  130. c>>=1;
  131. }
  132. } else {
  133. scanf("%d%d",&l,&r);++l;++r;
  134. printf("%d\n",qry(l,r,1,n,1));
  135. }
  136. }
  137. }
  138. return 0;
  139. }

G. FZU 2108 Mod problem

题意

题解

代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <vector>
  5. #include <cstdio>
  6. #include <string>
  7. #include <cmath>
  8. #include <queue>
  9. #include <set>
  10. #include <map>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned long long ull;
  14. typedef pair<int,int> pii;
  15. typedef pair<ll,ll> pll;
  16. #define mp make_pair
  17. #define pb push_back
  18. #define fi first
  19. #define se second
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define de(x) cout << #x << "=" << x << endl
  23. const int N=1005;
  24. char a[N];
  25. int sta[N],L[N];
  26. ll b;
  27. ll kpow(ll a,ll k) {
  28. ll ans=1;
  29. while(k) {
  30. if(k&1) ans=ans*a%b;
  31. a=a*a%b;
  32. k>>=1;
  33. }
  34. return ans;
  35. }
  36. //返回值:长度,值
  37. pll dfs(int l,int r) {
  38. ll ans=0,len=0;
  39. for(int i=r;i>=l;) {
  40. if(a[i]=='['||a[i]==']') {
  41. --i;
  42. continue;
  43. }
  44. if(i>l&&a[i-1]==']') {
  45. pll now=dfs(L[i-1],i-1);
  46. int cnt=a[i]-'0';
  47. while(cnt--) {
  48. ans=(ans+now.se%b*kpow(10,len)%b)%b;
  49. len=len+now.fi;
  50. }
  51. i=L[i-1];
  52. } else {
  53. ans=(ans+(a[i]-'0')%b*kpow(10,len)%b)%b;
  54. ++len;--i;
  55. }
  56. }
  57. return mp(len,ans);
  58. }
  59. int main() {
  60. int T;scanf("%d",&T);
  61. while(T--) {
  62. ///read
  63. scanf("%s",a);
  64. cin>>b;
  65. ///get l
  66. int len=strlen(a),p=0;
  67. for(int i=0;i<len;++i) {
  68. if(a[i]=='[') sta[p++]=i;
  69. if(a[i]==']') L[i]=sta[--p];
  70. }
  71. ///solve
  72. cout<<dfs(0,len-1).se<<endl;
  73. }
  74. return 0;
  75. }

H. FZU 2109 Mountain Number(数位dp)

题意

题解

代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <vector>
  5. #include <cstdio>
  6. #include <string>
  7. #include <cmath>
  8. #include <queue>
  9. #include <set>
  10. #include <map>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned long long ull;
  14. typedef pair<int,int> pii;
  15. typedef pair<ll,ll> pll;
  16. #define mp make_pair
  17. #define pb push_back
  18. #define fi first
  19. #define se second
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define de(x) cout << #x << "=" << x << endl
  23. int dig[15],d[15][15][15];
  24. int dp(int po,int pre,int zero,int limit) {
  25. if(po==-1) return 1;
  26. if(!limit&&zero!=-1&&d[po][pre][zero]!=-1) return d[po][pre][zero];
  27. int up=limit?dig[po]:9;
  28. int ans=0;
  29. for(int i=0;i<=up;++i) {
  30. if(zero==-1) {
  31. if(i) {
  32. ans=ans+dp(po-1,i,po,limit&&i==dig[po]);
  33. } else {
  34. ans=ans+dp(po-1,i,zero,limit&&i==dig[po]);
  35. }
  36. } else {
  37. if((zero-po)&1) {
  38. if(i>=pre) ans=ans+dp(po-1,i,zero,limit&&i==dig[po]);
  39. } else {
  40. if(i<=pre) ans=ans+dp(po-1,i,zero,limit&&i==dig[po]);
  41. }
  42. }
  43. }
  44. if(!limit&&zero!=-1) d[po][pre][zero]=ans;
  45. return ans;
  46. }
  47. int solve(int x) {
  48. int po=0;
  49. while(x) {
  50. dig[po++]=x%10;
  51. x/=10;
  52. }
  53. return dp(po-1,0,-1,1);
  54. }
  55. int main() {
  56. int T;scanf("%d",&T);
  57. memset(d,-1,sizeof(d));
  58. while(T--) {
  59. int l,r;scanf("%d%d",&l,&r);;
  60. printf("%d\n",solve(r)-solve(l-1));
  61. }
  62. return 0;
  63. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注