生成魔咒

  1. /*
  2. 后缀数组+双向链表
  3. 参照:https://blog.csdn.net/clove_unique/article/details/53911757
  4. */
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<algorithm>
  8. using namespace std;
  9. const int N=1e5+;
  10. int n,cnt,c[N],ans[N],s[N],t[N],rank[N],trank[N],sa[N],tsa[N],h[N],nxt[N],pre[N];
  11. long long res;
  12. void DA(){
  13. int p,maxx=cnt;
  14. memset(c,,sizeof c);
  15. for(int i=;i<=n;i++) c[rank[i]=s[i]]++;
  16. for(int i=;i<=maxx;i++) c[i]+=c[i-];
  17. for(int i=n;i;i--) sa[c[rank[i]]--]=i;
  18. trank[sa[]]=p=;
  19. for(int i=;i<=n;i++){
  20. if(rank[sa[i]]!=rank[sa[i-]]) p++;
  21. trank[sa[i]]=p;
  22. }
  23. for(int i=;i<=n;i++) rank[i]=trank[i];
  24. for(int k=;p<n;k<<=,maxx=p){
  25. p=;
  26. for(int i=n-k+;i<=n;i++) tsa[++p]=i;
  27. for(int i=;i<=n;i++) if(sa[i]>k) tsa[++p]=sa[i]-k;
  28. memset(c,,sizeof c);
  29. for(int i=;i<=n;i++) trank[i]=rank[tsa[i]];
  30. for(int i=;i<=n;i++) c[trank[i]]++;
  31. for(int i=;i<=maxx;i++) c[i]+=c[i-];
  32. for(int i=n;i;i--) sa[c[trank[i]]--]=tsa[i];
  33. trank[sa[]]=p=;
  34. for(int i=;i<=n;i++){
  35. if(rank[sa[i]]!=rank[sa[i-]]||rank[sa[i]+k]!=rank[sa[i-]+k]) p++;
  36. trank[sa[i]]=p;
  37. }
  38. for(int i=;i<=n;i++) rank[i]=trank[i];
  39. }
  40. for(int i=,k=;i<=n;i++){
  41. int j=sa[rank[i]-];
  42. while(s[i+k]==s[j+k]) k++;
  43. h[rank[i]]=k;if(k>) k--;
  44. }
  45. }
  46. int main(){
  47. scanf("%d",&n);
  48. for(int i=;i<=n;i++) scanf("%d",&s[i]),t[i]=s[i];
  49. for(int i=;i<=n/;i++) swap(s[i],s[n-i+]);
  50. sort(t+,t+n+);
  51. cnt=unique(t+,t+n+)-(t+);
  52. for(int i=;i<=n;i++) s[i]=lower_bound(t+,t+cnt+,s[i])-t;
  53. DA();
  54. for(int i=;i<=n;i++){
  55. nxt[i]=i+;
  56. pre[i]=i-;
  57. }
  58. for(int i=;i<=n;i++){
  59. int k=rank[i];
  60. ans[i]=n-i+-max(h[k],h[nxt[k]]);
  61. h[nxt[k]]=min(h[k],h[nxt[k]]);
  62. nxt[pre[k]]=nxt[k];
  63. pre[nxt[k]]=pre[k];
  64. }
  65. for(int i=n;i;i--){
  66. res+=ans[i];
  67. printf("%lld\n",res);
  68. }
  69. return ;
  70. }

排列计数

  1. /*
  2. ans=C(n,m)*dp(n-m);|dp(i)表示i的错排数
  3. */
  4. #include<cstdio>
  5. using namespace std;
  6. typedef long long ll;
  7. inline ll read(){
  8. ll x=;char ch=getchar();
  9. while(ch<''||ch>''){ch=getchar();}
  10. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  11. return x;
  12. }
  13.  
  14. #define FRE(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
  15. #define fre(name) freopen(#name".txt","r",stdin);
  16. #ifdef WIN32
  17. #define LL "%I64d"
  18. #else
  19. #define LL "%lld"
  20. #endif
  21.  
  22. const ll S=1e6;
  23. const ll N=S+;
  24. const ll mod=1e9+;
  25. ll cas,n,m,ans,dp[N],fz[N],fm[N];
  26. ll fpow(ll a,ll p){
  27. ll res=;
  28. for(;p;p>>=,a=a*a%mod) if(p&) res=res*a%mod;
  29. return res;
  30. }
  31. void first(){
  32. dp[]=;dp[]=;
  33. fz[]=fz[]=fm[]=fm[]=;
  34. for(ll i=;i<=S;i++) dp[i]=(i*dp[i-]%mod+((i&)?-:)+mod)%mod;
  35. for(ll i=;i<=S;i++) fz[i]=fz[i-]*i%mod;
  36. fm[S]=fpow(fz[S],mod-);
  37. for(ll i=S-;i>=;i--) fm[i]=fm[i+]*(i+)%mod;
  38. }
  39. void solve(){
  40. for(cas=read();cas--;){
  41. n=read();m=read();
  42. ans=(((fz[n]*fm[m])%mod*fm[n-m])%mod*dp[n-m])%mod;
  43. printf(LL "\n",ans);
  44. }
  45. }
  46. int main(){
  47. //FRE(permutation);
  48. first();
  49. solve();
  50. return ;
  51. }

征途

  1. /*
  2. ans=m(x_1^2+X_2^2+……+x_m^2)-(x_1+X_2+……+x_m)^2
  3. 令dp[i][j]表示前i个数已经选择到了x_j的最小值;这样就变成了一个区间dp
  4. 我懒,就不写单调队列优化了
  5. */
  6. #include<cstdio>
  7. #include<cstring>
  8. using namespace std;
  9. typedef long long ll;
  10.  
  11. #define pf(x) ((x)*(x))
  12. #define fro __attribute__((optimize("O2")))
  13. #define FRE(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
  14. #define fre(name) freopen(#name".txt","r",stdin);
  15. #ifdef WIN32
  16. #define LL "%I64d"
  17. #else
  18. #define LL "%lld"
  19. #endif
  20.  
  21. const int N=;
  22. int n,m,a[N],p[N][N];
  23. ll ans,sum[N],dp[N][N];
  24.  
  25. fro int main(){
  26. //FRE(journey);
  27. scanf("%d%d",&n,&m);
  28. for(int i=;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-]+a[i];
  29. memset(dp,0x3f3f3f3f,sizeof dp);
  30. dp[][]=;
  31. for(int j=;j<=m;j++){
  32. for(int i=j;i<=n;i++){
  33. for(int k=p[i-][j];k<i;k++){
  34. if(dp[i][j]>dp[k][j-]+pf(sum[i]-sum[k])){
  35. dp[i][j]=dp[k][j-]+pf(sum[i]-sum[k]);
  36. p[i][j]=k;
  37. }
  38. }
  39. }
  40. }
  41. ans=dp[n][m]*(ll)m-pf(sum[n]);
  42. printf(LL,ans);
  43. return ;
  44. }

SDOI 2016 Round1 Day2的更多相关文章

  1. 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数

    本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...

  2. 【BZOJ 4518】【SDOI 2016 Round1 Day2 T3】征途

    比较明显的斜率优化DP,省选时因为时间太紧张和斜率DP写得不熟等原因只写了60分的暴力DP,其实当时完全可以对拍来检验标算的正确,但是我当时too naive- 很快打完了,调了将近一晚上QAQ,因为 ...

  3. 【NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2】游记

    我第一次写游记,,,, 正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪 ...

  4. 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏

    考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...

  5. SDOI 2016 Round1 Day1

    储能表 /* 引自zyz大佬的数学思想 */ #include<cstdio> #include<iostream> using namespace std; typedef ...

  6. SDOI 2019 Round1 游记

    \(SDOI~2019 ~ Round1\) 游记 \(Day ~0\) 报道.骑车子去的,好热.到了之后看到好几个同校神仙,还从那里莫名其妙的等了一会,然后交了钱签了名就拿挂牌走人了.现在居然还有受 ...

  7. SDOI 2016 游戏

    树链剖分 线段树维护区间最小值,区间最大值 更新,对于每一个区间,找到当前区间的最小值的最大值,和要更新的值比较,如果比最大值还大,则此数对于以后的询问无任何贡献,直接返回即可,若有贡献,则一直递归到 ...

  8. SDOI 2016 数字配对

    题目大意:给定n个数字以及每个数字的个数和权值,将满足条件的数字配对,使得总代价不小于0,且配对最多 最大费用最大流拆点,对于每个点,连一条由S到该点的边,容量为b,花费为0,再连一条到T的边 对于每 ...

  9. SDOI 2016 征途 决策单调性

    题目大意:有一个数列,将其分成m段,求最小方差 先弄出n^3的dp,打出决策点,然后发现决策点是单调递增的,决策单调性搞一搞就可以了 #include<bits/stdc++.h> #de ...

随机推荐

  1. linux下获取服务器硬件信息的脚本

    这是个简单的脚本,便于查询服务器的硬件信息: #!/bin/bash # # Description: # Used to get the hardware config information. # ...

  2. c#生成rsa公钥和私钥

    c#生成rsa公钥和私钥的类库,包括加密解密,可以用在网站和winform项目 源码地址: http://download.csdn.net/detail/jine515073/8383809

  3. Laravel Debugbar

    Installation Require this package with composer: composer require barryvdh/laravel-debugbar After up ...

  4. 'cl.exe' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    1.首先找到vcvars32.bat文件,一般在C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin文件夹下 2.打开cmd黑窗 ...

  5. php连接mssql pdo

    怀疑mssql的默认编码...应该不是utf8吧??? <?php $cnx = new PDO("odbc:Driver={SQL Server};Server=XEJMZWMDIX ...

  6. e578. Setting the Clipping Area with a Shape

    This example demonstrates how to set a clipping area using a shape. The example sets an oval for the ...

  7. Swing组件都采用MVC设计模式

    Swing组件都采用MVC(Model-View-Controller,既模型-视图-控制器)设计模式,从而可以实现GUI组件的显示逻辑和数据逻辑的分离,允许程序员自定义Render来改变GUI组件的 ...

  8. C# 过滤sql特殊字符方法集合

    1./// <summary>    /// 过滤不安全的字符串    /// </summary>    /// <param name="Str" ...

  9. 【Java面试题】25 同步和异步有何异同,在什么情况下分别使用他们?举例说明。

    如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取. 当应用程序在对象上调用了一个需要花费很长时间 ...

  10. POI-根据Cell获取对应的String类型值

    /** * 根据不同情况获取Java类型值 * <ul><li>空白类型<ul><li>返回空字符串</li></ul>< ...