T1string

T1开的不错,看到这个题很激动,类似与HEOI2016排序,好像还要更简单一些,于是迅速冲了个桶排。因为洛谷上排序那道题是用桶排水的,所以我觉得没必要打线段树了,极端大数据20秒冲过,心想还行,起码80左右。

其实想的都挺美好哈哈,种种原因之下吧,桶排竟然跟垃圾快排拿一个分。。。。好吧,还是疏忽了。

线段树就是很基础的板子,记录区间覆盖,及时up down ,最后递归输出就好。唯一的细节是注意好update时每个字母对应的区间端点不要搞错了,别的废话就不多说了。

code

  1. #include<bits/stdc++.h>
  2. #define re register
  3. using namespace std;
  4. char a[100010];
  5. int f[27],n,m;
  6. struct zxb
  7. {int l,r,ji;}tree[400010];
  8. namespace AYX
  9. { inline void pushup(int x){if(tree[x<<1].ji==tree[x<<1|1].ji)tree[x].ji=tree[x<<1].ji;}
  10. inline void pushdown(int x){if(tree[x].ji)tree[x<<1].ji=tree[x<<1|1].ji=tree[x].ji;tree[x].ji=0;}
  11. inline void build(int x,int l,int r)
  12. { if(l==r)
  13. { tree[x].ji=a[l]-'a'+1;
  14. return;
  15. }
  16. int mid=(l+r)>>1;
  17. build(x<<1,l,mid);
  18. build(x<<1|1,mid+1,r);
  19. pushup(x);
  20. }
  21. inline void query(int x,int l,int r,int L,int R)
  22. { if(l>=L and r<=R and tree[x].ji)
  23. {f[tree[x].ji]+=r-l+1;return;}
  24. pushdown(x);
  25. int mid=(l+r)>>1;
  26. if(mid>=L)query(x<<1,l,mid,L,R);
  27. if(mid<R)query(x<<1|1,mid+1,r,L,R);
  28. }
  29. inline void update(int x,int l,int r,int L,int R,int j)
  30. { if(l>=L and r<=R){tree[x].ji=j;return;}
  31. pushdown(x);
  32. int mid=(l+r)>>1;
  33. if(mid<R)update(x<<1|1,mid+1,r,L,R,j);
  34. if(mid>=L)update(x<<1,l,mid,L,R,j);
  35. }
  36. inline void p(int x,int l,int r)
  37. { if(tree[x].ji){for(int i=l;i<=r;++i)putchar(tree[x].ji+'a'-1);return;}
  38. int mid=(l+r)>>1;
  39. p(x<<1,l,mid);
  40. p(x<<1|1,mid+1,r);
  41. }
  42. inline short main()
  43. { //freopen("c.in","r",stdin);
  44. scanf("%d%d",&n,&m);
  45. scanf("%s",a+1);
  46. build(1,1,n);
  47. while(m--)
  48. { int l,r,opt,sum=0;
  49. scanf("%d%d%d",&l,&r,&opt);
  50. memset(f,0,sizeof(f));
  51. query(1,1,n,l,r);sum=l;
  52. if(opt==1)
  53. {
  54. for(int i=1;i<=26;++i)
  55. if(f[i])update(1,1,n,sum,sum+f[i]-1,i),sum+=f[i];
  56. }
  57. else
  58. { for(int i=26;i;--i)
  59. if(f[i])update(1,1,n,sum,sum+f[i]-1,i),sum+=f[i];
  60. }
  61. }
  62. p(1,1,n);
  63. }
  64. }
  65. signed main()
  66. {return AYX::main();}

T2matrix

一道计数DP,不得不说,出题人的思路太妙了。

矩阵放数,有限制,那就来枚举限制。本体一个很棘手的问题是l和r区间有重合,根本没法搞,这也启示我们要在对应区间上做文章。先从一边开始,我在第i列,而有j列填了右区间。这样的状态有三种转移,一是向后走但不填数,直接加上就好(f[i+1][j]+=f[i][j])二是在填一个属于右区间的数,f[i+1][j+1]=f[i][j]* (r[i+1]-j);这个很容易理解,前面已经填了j个,我新增的这一个就是端点位于i左侧除去填过的j个后的任意一个。三是要满足i自身以内左端点要搞完,要填的数就是l[i]-l[i-1] 而总共有i-j-l[i-1]个位置,要乘上组合数A。

三个方程一出,此题解决了80%。最后还要注意jc啦inv啦都要去线性递推,直接莽qpow的话会TLE.

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int mod=998244353;
  5. int n,m,ll[100001],rr[100001],l[100001],r[100001],f[3001][3001],inv[10001],jc[10001];
  6. namespace AYX
  7. { inline int qpow(int a,int b)
  8. { int base=1;
  9. while(b)
  10. { if(b&1)base=base*a%mod;
  11. a=a*a%mod;
  12. b>>=1;
  13. }
  14. return base;
  15. }
  16. inline short main()
  17. { scanf("%lld%lld",&n,&m);
  18. for(int i=1;i<=n;++i)scanf("%lld%lld",&ll[i],&rr[i]),++l[ll[i]],++r[rr[i]];
  19. for(int i=1;i<=m;++i)l[i]+=l[i-1],r[i]+=r[i-1];
  20. jc[0]=inv[0]=inv[1]=1;
  21. for(int i=1;i<=m;++i)(jc[i]=jc[i-1]*i)%=mod,inv[i]=qpow(i,mod-2);
  22. for(int i=1;i<=m;++i)(inv[i]*=inv[i-1])%=mod;
  23. f[0][0]=1;
  24. for(int i=0;i<=m;++i)
  25. for(int j=0;j<=i;++j)
  26. { if(i)(f[i][j]*=((jc[i-j-l[i-1]]*inv[i-j-l[i]])%mod))%=mod;
  27. (f[i+1][j]+=f[i][j])%=mod;
  28. (f[i+1][j+1]+=f[i][j]*(r[i+1]-j)%mod)%=mod;
  29. }
  30. printf("%lld\n",f[m][n]);
  31. }
  32. }
  33. signed main()
  34. {return AYX::main();}

T3big

一堆数异或,还有个足够聪明的人来卡你,这题真的很干。暴力求出前缀后缀,40pts是没问题的。暴力分给的不少。

与异或相关,明显是要使01trie。其实这道题很烦的就是那个式子(2x/2n+2*x)%(2n),我们仔细分析,2x/2n是在干吗?乘以2是左移了一位,再除以2n,是在取二进制第n位,后面的%2^n是再截取n-1位。所以相当于整体左移,再把最高位干到最后,这个东西好像叫循环左移。

对手可以在任何情况下搞这莫一下,那我们先要求出改之后序列异或和是神魔样子。首先明确x循环左移后仍然互不相同,覆盖整个区间,所以没有必要讨论x。我们需要的是在不同位置考虑异或序列的值。对于异或,位与位之间相对独立,我们异或了所有数后左移和每个数左移后在异或是一样的,所以可以前缀和搞序列,然后扔进trie树里。

进树之后,只有一个儿子就向他跑,加上贡献,若有俩儿子就没有贡献,两个都跑,因为不论你选那一个,对手都可以选择另一个对应的断点操作,从而把你干废。

最后跑出一条路径后就update,直到跑完。

code

  1. #include<bits/stdc++.h>
  2. #define f() cout<<"fuck"<<endl
  3. using namespace std;
  4. int n,m,res,tot,a[300100],trie[4000100][2],ans[4000001],sum[1000001],mod;
  5. namespace AYX
  6. { inline void add(int x)
  7. { int now=0;
  8. for(int i=1;i<=n;++i)
  9. { int p=(x>>(n-i))&1;
  10. if(!trie[now][p])trie[now][p]=++tot;
  11. now=trie[now][p];
  12. }
  13. }
  14. inline void dfs(int x,int dep,int sss)
  15. { if(dep<0)
  16. {ans[++ans[0]]=sss;return;}
  17. if(trie[x][0] and trie[x][1])
  18. { dfs(trie[x][0],dep-1,sss);
  19. dfs(trie[x][1],dep-1,sss);
  20. }
  21. if(trie[x][0] and !trie[x][1])
  22. { sss^=(1<<dep);
  23. dfs(trie[x][0],dep-1,sss);
  24. }
  25. if(trie[x][1] and !trie[x][0])
  26. { sss^=(1<<dep);
  27. dfs(trie[x][1],dep-1,sss);
  28. }
  29. }
  30. inline short main()
  31. { scanf("%d%d",&n,&m);mod=(1<<n);
  32. for(int i=1;i<=m;++i)scanf("%d",&a[i]);
  33. sum[m]=a[m];
  34. for(int i=m-1;i>=1;--i)sum[i]=a[i]^sum[i+1];
  35. for(int i=0;i<=m;++i)
  36. { res^=((a[i]*2/mod+a[i]*2)%mod);
  37. add(res^sum[i+1]);
  38. }
  39. dfs(0,n-1,0);
  40. sort(ans+1,ans+1+ans[0]);
  41. int maxn=ans[ans[0]],ji=0;
  42. for(int i=ans[0];i;--i)
  43. if(ans[i]==maxn)++ji;
  44. else break;
  45. printf("%d\n%d\n",maxn,ji);
  46. return 0;
  47. }
  48. }
  49. signed main()
  50. {return AYX::main();}

T4 所驼门王的宝藏

tarjan大水题,然而我不会。。。板子早忘得差不多了,今天终于复习了一下。

本题就是建边麻烦,O(n)的话是构造出几个假点,代表一行或一列,然后就用门都连这个点,建图就完成了。

剩下的就是套路缩点+DAG+DP,这是纯板子。

code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,r,c,hd[10000001],head[10000001],to[10000001],toto[10000001],nxt[10000001],ext[10000001],dp[10000001],f[10000001],id[10000001],dfn[10000001],low[10000010],xx[10010000],yy[10000100],du[10000010],tot,cnt,lll,ppp,zhan[10000010],top,cnt1,hh[10000001];
  4. int dx[10]={-1,-1,-1,0,0,1,1,1},dy[10]={-1,0,1,-1,1,-1,1,0};
  5. map <pair<int ,int >,int >cao;
  6. namespace AYX
  7. { inline void tarjan(int x)
  8. { low[x]=dfn[x]=++ppp;
  9. zhan[++top]=x;
  10. for(int i=head[x];i;i=nxt[i])
  11. { int v=toto[i];
  12. if(!dfn[v])
  13. { tarjan(v);
  14. low[x]=min(low[v],low[x]);
  15. }
  16. else if(!id[v])low[x]=min(low[x],dfn[v]);
  17. }
  18. if(dfn[x]==low[x])
  19. { id[x]=++tot;
  20. hh[id[x]]=f[x];
  21. while(zhan[top]!=x)
  22. { id[zhan[top]]=id[x];
  23. hh[id[x]]+=f[zhan[top]];
  24. --top;
  25. }
  26. top--;
  27. }
  28. }
  29. inline void add(int u,int v)
  30. { toto[++cnt]=v;
  31. nxt[cnt]=head[u];
  32. head[u]=cnt;
  33. }
  34. inline void addaa(int u,int v)
  35. { to[++cnt1]=v;
  36. ext[cnt1]=hd[u];
  37. hd[u]=cnt1;
  38. }
  39. inline short main()
  40. { scanf("%d%d%d",&n,&r,&c);
  41. for(int i=1;i<=n;++i)
  42. { f[r+c+i]=1;
  43. int x,y,z;
  44. scanf("%d%d%d",&x,&y,&z);
  45. add(x,r+c+i);add(y+r,r+c+i);
  46. if(z==1)add(r+c+i,x);
  47. if(z==2)add(r+c+i,y+r);
  48. if(z==3)xx[i]=x,yy[i]=y;
  49. cao[make_pair(x,y)]=i;
  50. }
  51. for(int i=1;i<=n;++i)
  52. if(xx[i])for(int j=0;j<8;++j)if(cao[make_pair(xx[i]+dx[j],yy[i]+dy[j])])add(r+c+i,cao[make_pair(xx[i]+dx[j],yy[i]+dy[j])]+c+r);
  53. for(int i=1;i<=n+r+c;++i)if(!dfn[i])tarjan(i);
  54. for(int i=1;i<=n+r+c;++i)
  55. for(int j=head[i];j;j=nxt[j])
  56. { int v=toto[j];
  57. if(id[i]!=id[v])
  58. { addaa(id[i],id[v]);
  59. ++du[id[v]];
  60. }
  61. }
  62. queue<int >q;
  63. for(int i=1;i<=tot;++i)if(!du[i])q.push(i),dp[i]=hh[i];
  64. while(!q.empty())
  65. { int x=q.front();q.pop();
  66. for(int i=hd[x];i;i=ext[i])
  67. { int v=to[i];
  68. dp[v]=max(dp[v],dp[x]+hh[v]);
  69. --du[v];
  70. if(!du[v])q.push(v);
  71. }
  72. }
  73. int ans=0;
  74. for(int i=1;i<=tot;++i)
  75. ans=max(ans,dp[i]);
  76. printf("%d\n",ans);
  77. return 0;
  78. }
  79. }
  80. signed main()
  81. {return AYX::main();}

NOIP 模拟五 考试总结的更多相关文章

  1. 【noip模拟】考试总结

    今天睡了14个小时啊 把一星期的觉都补回来了 要不是被叫醒了 我肯定还在睡觉- - 其实现在还想睡... 集训真是伤身啊 感觉再睡就要睡成sb了 鉴于昨天被完虐(真·完虐 怒垫底) 来写篇总结 得分: ...

  2. NOIP 模拟 6 考试总结

    T1 这道题是一道裸的暴力,考场写挂了 \(5pts\) 原因竟是忘了删注释,难受 题解 T2 这道题是一道启发式合并,没想出来,拿了个暴力分跑了 题解 T3 这道题就是一道数学期望,想出来就水得很, ...

  3. NOIP 模拟九 考试总结

    T1 考场上先干的T2,最后慌慌张张没去想正解,打算把树建起来,拿70分的部分分,于是写树剖LCA,板子好像忘了,回忆了好久还模拟了好几遍才打对树剖LCA............期望70,结果0.考试 ...

  4. NOIP 模拟 10 考试总结

    T1 一道很妙的题,打暴力分也很多,但是考试的时候忘开 long long 了. 题解 T2 一道挺水的题,不过...(打挂了) 题解 T3 此题甚妙,转化真多,不过对思维是一个非常大的扩展 题解 考 ...

  5. NOIP 模拟六 考试总结

    T1辣鸡 T1就搞得这莫不愉快.. 大致题意是给你几个矩形,矩形覆盖的点都标记上,每个矩形无重复部分,求满足(x,y) (x+1,y+1)都标记过的点对数,范围1e9. 看起来很牛的样子,我确实也被1 ...

  6. NOIP 模拟一 考试总结

    序列 考场上信心满满的打了nlogn的做法,我以为我稳了.据考试结束1h时发现看错题目了,打成了不连续的子序列.匆匆改了n2logn的做法.考试结束后,我发现我跪了.原来到终点才会发现我做的和人家不是 ...

  7. 2016.11.6 night NOIP模拟赛 考试整理

    题目+数据:链接:http://pan.baidu.com/s/1hssN8GG 密码:bjw8总结: 总分:300分,仅仅拿了120份. 这次所犯的失误:对于2,3题目,我刚刚看就想到了正确思路,急 ...

  8. NOIP 模拟 7 考试总结

    T1 超级大水题,用 \(kmp\) 和 \(hash\) 均能过,但都忘了,结果只打了个暴力.难受.板子题,题解就不放了 Code #include<bits/stdc++.h> #de ...

  9. NOIP 模拟 9 考试总结

    T1 一道推规律的题,没想出来,暴力打得常数还太大了,挂了不少 题解 T2 这是一道二分题,很巧妙,但是对于想我一样懒得人,那个数据结构就水过去了 (裸的分块加强大的卡长和合适的块的大小可以卡过去) ...

随机推荐

  1. 刷题-力扣-1011. 在 D 天内送达包裹的能力

    1011. 在 D 天内送达包裹的能力 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/capacity-to-ship-packag ...

  2. 详细解读go语言中的map

    Map map底层是由哈希表实现的 Go使用链地址法来解决键冲突. map本质上是一个指针,指向hmap 这里的buckets就是桶,bmap 每一个bucket最多可以放8个键值对,但是为了让内存排 ...

  3. roscore启动不完全问题

    运行roscore,得到如下日志,且一直卡着无法继续执行 ... logging to /home/xbit/.ros/log/79f2952c-589c-11ea-8213-d0abd5e7d222 ...

  4. linux centos7 移动文件到指定目录

    2021-08-26 在 centos7 环境下怎么移动一个文件到其他的目录下呢? 使用命令  mv 文件名 指定目录  即可完成该操作. 那么怎么将一个文件夹下的内容移动到另一个文件夹下呢?比如有时 ...

  5. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  6. Robot Framework(10)- 使用资源文件

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 啥是资源文件 资 ...

  7. Linux - yum 安装软件时被 PackageKit 锁定

    问题描述 yum 安装软件的时候报错 sudo yum install netease-cloud-music 已加载插件:fastestmirror, langpacks /var/run/yum. ...

  8. table头部固定,内容滚动,类似新闻一下向上滚动

    html: <div class="ul_box"> <table class="table1"> <thead> < ...

  9. 【第十二篇】- Git 服务器搭建之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git 服务器搭建 上一章节中我们远程仓库使用了 Github,Github 公开的项目是免费的,2019 年开始 Github 私有存储库也可以无限制使用. 这当然我们也可以自己搭建一台 Git 服 ...

  10. 创建一个web项目