Description

 Solution

T1 shopping

目测是插板法乱搞一下

发现题解写的是容斥dp:

\[ans = \sum_i (-1)^ig[i]
\]

\(g[i]\)表示的有\(i\)个商店必然达到上限的方案数

考虑转化,设\(f[i][j]\)表示前\(i\)个商店,必然超过限制的商店的(上限+1)的和是\(j\)

\[f[i][j]=f[i-1][j]-f[i-1][j-w[i]-1]
\]

所以答案就可以这样计算:

\[ans=\sum_i f[n][i] C(k+n-1,n-1)
\]

后面那一块就是插板法

  1. /*容斥dp */
  2. #include<bits/stdc++.h>
  3. #define ll long long
  4. using namespace std;
  5. inline int read()
  6. {
  7. int x=0,f=1;char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  10. return x*f;
  11. }
  12. const int MN=5e6+5,MM=301,mod=1e9+7;
  13. int n,m,k,wi[MM],f[2][MM*MM+MN],fac[MN<<1],inv[MN<<1];
  14. int C(int x,int y){if(y<=0)return 1;return 1ll*fac[x]*inv[y]%mod*inv[x-y]%mod;}
  15. int fpow(int x,int M){int r=1;for(;M;M>>=1,x=1ll*x*x%mod)if(M&1)r=1ll*r*x%mod;return r;}
  16. int main()
  17. {
  18. register int i,j,qz=0,ans=0;
  19. n=read(),m=read(),k=read();
  20. for(i=1;i<=m;++i) wi[i]=read(),qz+=wi[i];
  21. for(fac[0]=i=1;i<=n+k;++i)fac[i]=1ll*fac[i-1]*i%mod;
  22. for(inv[n+k]=fpow(fac[n+k],mod-2),i=n+k-1;~i;--i)inv[i]=1ll*inv[i+1]*(i+1)%mod;
  23. f[1][wi[1]+1]=mod-1;f[1][0]=1;
  24. for(i=2;i<=m;++i)
  25. {
  26. for(j=0;j<=qz+m;++j)
  27. {
  28. int l=j-wi[i]-1;f[i&1][j]=f[(i&1)^1][j];
  29. if(l>=0) f[i&1][j]+=mod-f[(i&1)^1][l],f[i&1][j]%=mod;
  30. }
  31. }
  32. for(i=0;i<=k;++i)ans+=1ll*f[m&1][i]*C(k+n-i-1,n-1)%mod,ans%=mod;
  33. printf("%d\n",ans);
  34. }

T2 highway

发现\(n\)很小,所以对于已经按照边权排号序的边集,求\(Kruskal\)生成森林的只要\(O(\alpha(n)n)\)

考虑线段树维护区间,每个节点保存用到的边(有序的),合并的时候做一次\(Kruskal\)即可

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. inline int read()
  5. {
  6. int x=0,f=1;char ch=getchar();
  7. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  8. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  9. return x*f;
  10. }
  11. #define reg register
  12. const int MN=105,MM=1e5+5;
  13. int n,m,q;
  14. struct edge{int u,v,w;}e[MM];
  15. struct Node
  16. {
  17. vector<int> ed;
  18. int val;
  19. Node(){ed.clear();val=0;}
  20. }T[MM<<2];
  21. int fa[MN];
  22. int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);}
  23. bool union_(int x,int y){x=getf(x);y=getf(y);if(x==y)return false;fa[x]=y;return true;}
  24. Node merge(Node x,Node y)
  25. {
  26. reg int si=x.ed.size(),sj=y.ed.size(),i,j;
  27. for(i=1;i<=n;++i) fa[i]=i;
  28. #define J y.ed[j]
  29. #define I x.ed[i]
  30. Node r;
  31. for(i=0,j=0;i<si||j<sj;)
  32. {
  33. if(i==si||(j!=sj&&e[J].w<e[I].w))
  34. {
  35. if(union_(e[J].u,e[J].v)) r.ed.push_back(J),r.val+=e[J].w;
  36. ++j;continue;
  37. }
  38. if(union_(e[I].u,e[I].v)) r.ed.push_back(I),r.val+=e[I].w;
  39. ++i;
  40. }
  41. return r;
  42. }
  43. void build(int x,int l,int r)
  44. {
  45. if(l==r){T[x].ed.push_back(l);T[x].val=e[l].w;return;}
  46. int mid=(l+r)>>1;
  47. build(x<<1,l,mid);build(x<<1|1,mid+1,r);
  48. T[x]=merge(T[x<<1],T[x<<1|1]);
  49. }
  50. Node query(int x,int l,int r,int a,int b)
  51. {
  52. if(l==a&&r==b) return T[x];
  53. int mid=(l+r)>>1;
  54. if(b<=mid) return query(x<<1,l,mid,a,b);
  55. if(a>mid) return query(x<<1|1,mid+1,r,a,b);
  56. else return merge(query(x<<1,l,mid,a,mid),query(x<<1|1,mid+1,r,mid+1,b));
  57. }
  58. int main()
  59. {
  60. n=read();m=read();q=read();
  61. reg int i,l,r;
  62. for(i=1;i<=m;++i) e[i].u=read(),e[i].v=read(),e[i].w=read();
  63. build(1,1,m);
  64. while(q--)
  65. {
  66. l=read(),r=read();
  67. printf("%d\n",query(1,1,m,l,r).val);
  68. }
  69. return 0;
  70. }

T3 sailing

第一步,我们考虑舰队可以”整体地“位于哪几个位置

把环境和舰队的图都转化成一个\(01\)序列,可以位于一个位置当且仅当在某个区间中没有两个数同为\(1\)

考虑把其中一个序列倒序处理,就可以用\(NTT\)算出上面的答案

第二步,可以位于某个位置并不代表一定可以移动的到

从一个一定满足的位置(比如说舰队的原位置)开始\(bfs\),显然所有合法的位置都是相互联通的

第三步,求可以到达的格子数

一个格子可以到达,说明将舰队的\(01\)序列放在某个合法的位置上,这个位置是\(1\)

显然也可以用\(NTT\)来解决

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. inline int read()
  5. {
  6. int x=0,f=1;char ch=getchar();
  7. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  8. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  9. return x*f;
  10. }
  11. #define reg register
  12. const int MN=705,P=998244353,g=3,invg=332748118;
  13. int n,m;
  14. int a[MN*MN*4],b[MN*MN*4],c[MN*MN*4],N,di,invN,pos[MN*MN*4];
  15. char mp[MN][MN];
  16. bool rea[MN][MN];
  17. int fpow(int x,int m){int r=1;for(;m;m>>=1,x=1ll*x*x%P)if(m&1)r=1ll*r*x%P;return r;}
  18. void NTT(int *a,int type)
  19. {
  20. reg int wi,w,i,j,p,k;
  21. for(i=0;i<N;++i)if(i<pos[i])std::swap(a[i],a[pos[i]]);
  22. for(i=1;i<N;i<<=1)
  23. {
  24. wi=fpow(type>0?g:invg,(P-1)/(i<<1));
  25. for(j=i<<1,p=0;p<N;p+=j)
  26. for(w=1,k=0;k<i;++k,w=1ll*w*wi%P)
  27. {
  28. int X=a[p+k],Y=1ll*a[i+p+k]*w%P;
  29. a[p+k]=(X+Y)%P;a[i+p+k]=(X-Y+P)%P;
  30. }
  31. }
  32. if(type<0)for(i=0;i<N;++i)a[i]=1ll*a[i]*invN%P;
  33. }
  34. std::queue<std::pair<int,int> > q;
  35. const int dx[4]={0,-1,0,1},dy[4]={1,0,-1,0};
  36. void bfs(int x,int y)
  37. {
  38. q.push(make_pair(x,y));rea[x][y]=false;
  39. while(!q.empty())
  40. {
  41. int X=q.front().first,Y=q.front().second;q.pop();
  42. a[(X-1)*m+Y]=1;
  43. for(reg int i=0;i<4;++i)if(rea[X+dx[i]][Y+dy[i]])
  44. rea[X+dx[i]][Y+dy[i]]=false,q.push(make_pair(X+dx[i],Y+dy[i]));
  45. }
  46. }
  47. int main()
  48. {
  49. int i,j,x1=P,x2=-P,y1=P,y2=-P,ans=0;
  50. n=read();m=read();
  51. for(i=1;i<=n;++i) scanf("%s",mp[i]+1);
  52. for(i=1;i<=n;++i)for(j=1;j<=m;++j)
  53. {
  54. if(mp[i][j]=='#') a[(i-1)*m+j]=1;
  55. if(mp[i][j]=='o') x1=min(x1,i),x2=max(x2,i),y1=min(y1,j),y2=max(y2,j);
  56. }
  57. int T=(x2-x1)*m+y2-y1+1;
  58. for(i=1;i<=n;++i)for(j=1;j<=m;++j)
  59. if(mp[i][j]=='o') b[(i-x1)*m+j-y1+1]=c[T-(i-x1)*m-j+y1]=1;
  60. for(N=1,di=0;N<=m*n*2;N<<=1,++di);invN=fpow(N,P-2);
  61. for(i=0;i<N;++i) pos[i]=(pos[i>>1]>>1)|((i&1)<<(di-1));
  62. NTT(a,1);NTT(b,1);NTT(c,1);
  63. for(i=0;i<N;++i) a[i]=1ll*a[i]*c[i]%P;
  64. NTT(a,-1);
  65. for(i=1;i+(x2-x1)<=n;++i)for(j=1;j+(y2-y1)<=m;++j)if(a[T+(i-1)*m+j]==0)rea[i][j]=true;
  66. memset(a,0,sizeof a);bfs(x1,y1);NTT(a,1);
  67. for(i=0;i<N;++i) a[i]=1ll*a[i]*b[i]%P;
  68. NTT(a,-1);
  69. for(i=2;i<=n*m+1;++i) if(a[i]) ++ans;
  70. return 0*printf("%d\n",ans);
  71. }

Blog来自PaperCloud,未经允许,请勿转载,TKS!

FCS省选模拟赛 Day1的更多相关文章

  1. FCS省选模拟赛 Day7

    Description  Solution T1 island 考虑把问题成两部分计算 纵坐标的距离和很好计算,在输入的同时一次计算了就完事 横坐标又分成两部分 分别在\(y\)轴不同侧的矩形的距离和 ...

  2. FCS省选模拟赛 Day3

    Description  Solution T1 game 咕咕咕 T2 string fail树各个节点的深度之和怎么求? 我们考虑每个前缀的深度是什么 发现这个值就相当于有多少个前缀等于它的后缀 ...

  3. FCS省选模拟赛 Day4

    传送门 Solution Code  /* 斯坦纳树:O(n*3^n+kE*2^n) 暂且把O(k*E)当成是spfa的复杂度 15:15~16:20 原题:bzoj_4774 */ #include ...

  4. FCS省选模拟赛 Day5

    传送门 Solution Code  #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?( ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #48 - Streaming #3 (NOIP模拟赛Day1)

    A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...

  9. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...

随机推荐

  1. pycharm从本地离线添加模块

    豆瓣的源: http://pypi.douban.com/simple pip install matplotlib -i http://pypi.douban.com/simple --truste ...

  2. javasript简单实现文字的展开收起(无动画)

    今天在工作遇到展开和收起的需求,在网上找了很多方法,今天来写一下我觉得比较简单的方法 在项目中需要达到如图这种效果 首先想的是使用overflow简单且粗暴,在需要展开的的文字定义样式 { overf ...

  3. Python简单实现在线更新下载

    Python简单实现 软件在线更新 在线下载(Python simple implementation of software online update and download) 文章来自:htt ...

  4. Sbase数据库自动截断日志

    http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36273.1550/html/sprocs/X3 ...

  5. iPhone的xib与iPad的xib相互转换

    1. xib转换 iPhone版本APP开发完成后需要再开发iPad版本的APP,需要把iPhone版本的xib文件添加到iPad项目中去,但是Xcode中iPhone和iPad使用的xib格式不能完 ...

  6. SAP Marketing Cloud功能简述(五) : 销售计划管理

    Grace前四篇介绍SAP Marketing Cloud的文章: SAP Marketing Cloud功能简述(一) : Contacts和Profiles SAP Marketing Cloud ...

  7. 绘图 Matplotlib Numpy Pandas

    丈夫气力全,一个拟当千.猛气冲心出,视死亦如眠. 绘图 Matplotlib可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法. 能将数据进行可视化,更直观的呈现使数据更 ...

  8. iptables和lvs

    解压密码6Hai7Gf8   路由转发 0是不转发,1是转发 [root@m01 roles]# cat /proc/sys/net/ipv4/ip_forward 0 临时生效 [root@m01 ...

  9. Exchange 退信550 5.1.11 RESOLVER.ADR.ExRecipNotFound

    问题描述: 在Exchange 2013环境下,某客户将一个用户的邮箱test@abc.com禁用,过了几天又想连接该邮箱,但是却没有找到禁用的邮箱,然后客户就Enable-MailBox重新创建了一 ...

  10. 【译】STM32L4x6系列用户手册第四章 - 防火墙(FireWall)

    4        防火墙(FW) 4.1        简介 防火墙用于保护非易失性存储器中的特定部分的代码或数据,和/或保护SRAM1中的易失性数据,免受在保护区域外部执行的其余代码的非法访问. 4 ...