T1

看起来十分复杂,打表后发现答案是 \(n*m\mod p\)

具体的证明。。。

原式的物理意义,就是从坐标原点(0,0),用每一种合法的斜率,

穿过坐标[1 ~ n , 1 ~ m]的方阵中的整点的个数,总数即 n*m。

T2

考试时没想到 \(O(n^2)\) 的做法

\[\begin{aligned} A_{k+i-1}-B_i &=A_{k+j-1}-B_j \\ A_{k+i-1}-A_{k+j-1} &= B_i-B_j \\ A_i-A_j &= B_i-B_j \end{aligned} \]

所以只要先差分,再跑一边 \(\text{KMP}\) 或字符串哈希即可

字符串哈希

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1000005;
const LL M1=998244353,M2=1004535809,B=233;
int n,m,ans;
LL X1[N],X2[N],P1[N],P2[N],Y1,Y2,x[N],y[N];
inline bool check(int i) {return(Y1+1LL*P1[m]*X1[i-1]%M1)%M1==X1[i+m-1] &&(Y2+1LL*P2[m]*X2[i-1]%M2)%M2==X2[i+m-1];
}
int main() {freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%lld",&x[i]);for(int i=1;i<=m;i++)scanf("%lld",&y[i]);for(int i=1;i<n;i++)x[i]=x[i+1]-x[i],x[i]+=2e9;for(int i=1;i<m;i++)y[i]=y[i+1]-y[i],y[i]+=2e9;--n,--m;P1[0]=P2[0]=1;for(int i=1;i<=n;i++) {X1[i]=(1LL*X1[i-1]*B%M1+1LL*x[i])%M1;X2[i]=(1LL*X2[i-1]*B%M2+1LL*x[i])%M2;P1[i]=(1LL*P1[i-1]*B)%M1;P2[i]=(1LL*P2[i-1]*B)%M2;}for(int i=1;i<=m;i++) {Y1=(1LL*Y1*B%M1+1LL*y[i])%M1;Y2=(1LL*Y2*B%M2+1LL*y[i])%M2;}for(int i=1;i<=n-m+1;i++)if(check(i))++ans;printf("%d",ans);
}

\(\text{KMP}\)

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
int n,m,ans,x[N],y[N],nxt[N];
int main() {freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&x[i]);for(int i=1;i<=m;i++)scanf("%d",&y[i]);for(int i=1;i<n;i++)x[i]=x[i+1]-x[i];for(int i=1;i<m;i++)y[i]=y[i+1]-y[i];--n,--m;for(int i=2,j=0;i<=m;i++) {while(j && y[i]!=y[j+1])j=nxt[j];if(y[i]==y[j+1])++j;nxt[i]=j;}for(int i=0,j=0;i<=n;i++) {while(j && x[i]!=y[j+1])j=nxt[j];if(x[i]==y[j+1])++j;if(j==m)++ans,j=nxt[j];}printf("%d",ans);
}

T3

考试时:不考虑 \(k\) 直接树形 DP ,奇妙地拿了 30

赛后:由于原题意思就是不能直接地祖孙关系,因为一个子树地 DFS 序是连续的

只要选的区间不相交即可,用 DP 解决

设 \(dp_{i,j}\) 为第 \(j\) 个果子选了 DFS 序为 \(i\) 的节点的最大美味值

可以从 \(dp_{i+1,j}\) ,\(dp_{\text{next subtree},j}\) ,和 \(dp_{\text{next subtree},j-1}+w_{\text{node of i}}\) 转移

数据十分奇妙,要开滚动数组。

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,k,op,dp[N][2],f[N],w[N],to[N],lst[N],nxt[N],rk[N],sz[N],odd,ans;
void Pre(int u) {rk[++odd]=u,sz[u]=1;for(int i=lst[u],v;i;i=nxt[i])Pre(v=to[i]),sz[u]+=sz[v];
}
int main() {freopen("galo.in","r",stdin);freopen("galo.out","w",stdout);scanf("%d%d",&n,&k),++k;for(int i=2;i<=n;i++) {scanf("%d%d",&f[i],&w[i]);to[i]=i,nxt[i]=lst[f[i]];lst[f[i]]=i;}Pre(1);for(int C=1,j=0;C<=k;C++,j^=1) {for(int i=n;i>=1;i--)dp[i][j]=max(dp[i+1][j],max(dp[i+sz[rk[i]]][j],dp[i+sz[rk[i]]][j^1]+w[rk[i]]));ans=max(ans,dp[1][j]);}printf("%d",ans);
}

T4

好家伙,看到子树修改,本蒟蒻直接一个树剖,好吧看错题+爆栈直接 WA 10

正解:直接 BFS 即可,设 \(F_i\) 为从根到这个点有多少个打了标记,若 \(F_i+Color_i\) 是偶数就不用翻转

#include<bits/stdc++.h>
using namespace std;
inline int Rd() {register int x=0;char C=getchar();for(;C<'0'||C>'9';C=getchar()) ;for(;C>'/'&&C<':';C=getchar()) x=(x<<1)+(x<<3)+(C^48);return x;
}
const int N=500005;
int n,x[N],vis[N],lst[N],nxt[N],to[N],f[N],q[N],head,tail=1;
int main() {freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);n=Rd();for(int i=1;i<=n;i++)x[i]=Rd();for(int i=1,fr;i<n;i++) {fr=Rd(),to[i]=Rd();nxt[i]=lst[fr],lst[fr]=i;      }q[1]=1;for(int u,flg;head<tail;) {u=q[++head],flg=(f[u]+x[u])&1;if(flg)vis[u]=1;for(int i=lst[u],v;i;i=nxt[i])f[v=to[i]]=f[u]+flg,q[++tail]=v;}for(int i=1;i<=n;i++)if(vis[i])printf("%d ",i);
}

总结

T1:学会打表

T2:多去把式子转换一下

T3:子树修改就想想 DFS 序,多考虑转换成 DP

T4:不一味的想数据结构,考虑简化

2021.03.06【NOIP提高B组】模拟 总结相关推荐

  1. 5814. 【NOIP提高A组模拟2018.8.14】 树(期望 + 倍增)

    5814. [NOIP提高A组模拟2018.8.14] 树 Problem 给定一棵nnn个点的树,m" role="presentation">mmm次询问,每次 ...

  2. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  3. JZOJ 5820. 【NOIP提高A组模拟2018.8.16】 非法输入

    Description 在算法竞赛中,题目一般保证了输入数据的合法性.然而在工程开发中,我们往往不期望程 序得到的输入都是合法的. D 君正忙着向校内 OJ 添加题目,在写了第 233 个 val.c ...

  4. 5817. 【NOIP提高A组模拟2018.8.15】 抄代码

    Description J 君是机房的红太阳,每次模拟她总是 AK 虐场.然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君 ...

  5. 2021.8.14【提高B组模拟6】T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)

    United Cows of Farmer John 题目传送门 解题思路 树状数组乱糊 AC代码 #include<cstdio> #include<cstring> usi ...

  6. 5819. 【NOIP提高A组模拟2018.8.15】 大逃杀

    Description 自从 Y 君退役之后,她就迷上了吃鸡,于是她决定出一道吃鸡的题. Y 君将地图上的所有地点标号为 1 到 n,地图中有 n − 1 条双向道路连接这些点,通过一条 双向道路需要 ...

  7. 【NOIP提高A组模拟】艾比所特

    Description 阿良良木历将要迎来人生(不,是吸血鬼生涯)的第二次战斗--与身为人类和吸血鬼混血儿的艾比所特在直江津高中的操场solo,以取回Heartunderblade的左脚. 艾比所特个 ...

  8. 5778. 【NOIP提高A组模拟2018.8.8】没有硝烟的战争

    Description 被污染的灰灰草原上有羊和狼.有N只动物围成一圈,每只动物是羊或狼. 该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x ...

  9. 2021.8.11【提高B组模拟3】T1 积木(乱糊暴搜)(正解:状压dp)

    积木 题目大意 输入样例 3 8 7 6 3 9 4 1 10 5 输出样例 18 题目数据 解题思路 暴搜就没什么好讲的了 原本以为只有40,AC了就离谱 (数据真水) 正文:状压dp 前提:我这个 ...

  10. 2021.8.9【提高B组模拟1】T2 QYQ在艾泽拉斯(Tarjan强连通分量)(并查集)

    QYQ在艾泽拉斯 题目大意 输入样例 3 2 1 2 3 1 1 2 1 0 输出样例 4 样例说明: QYQ从3号点开始,走到2号点,最后走到1号点,结束旅程,共获得1+2+1=4价值的宝物 题目数 ...

最新文章

  1. Java并发- 读写锁中的性能之王:StampedLock
  2. python入门教程完整版(懂中文就能学会)-Python入门教程完整版!(懂中文的就能学会)...
  3. jQuery仿淘宝商城天猫鼠标移动过去,透明度降低
  4. Mysql数据库常用操作整理
  5. 自监督和语言监督我全都要?Facebook多模态预训练模型SLIP给你答案!
  6. php 命名空间(,PHP命名空间(Namespace)简明教程
  7. 风雨20年:我所积累的20条编程经验 (转)
  8. Sparrow - Distributed, Low Latency Scheduling
  9. 更改SAP的字段翻译
  10. python中qt有哪些控件_使用PyQt5调用Qt程序,基础PythonQt控件的使用方法
  11. android启动服务的生命周期,Android Service的两种启动方式以及生命周期
  12. Linux服务器性能的重要指标:打开文件数的限制
  13. 虚拟机连不上网 Xshell连不上虚拟机
  14. Web服务器处理Servlet处理请求过程
  15. mysql的db.opt文件_MySQL数据库的db.opt文件
  16. scratch少儿编程与游戏:丛林狩猎
  17. 帝云CMS内容管理系统
  18. 迁徙数据平台简单介绍
  19. 麻省理工学院公开课:经典力学
  20. 伪装图片 攻击php,攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)...

热门文章

  1. Git分支的作用与使用
  2. Unknown package: com.xxx
  3. 界面追踪法求解流体流动的表面张力
  4. Flutter 实现切角渐变矩形
  5. 使用uniapp绘制一个折线图(uCharts)
  6. 2021年起重机司机(限桥式起重机)最新解析及起重机司机(限桥式起重机)考试试卷
  7. 计算机网络(学习过程中--持续更新)
  8. 嵌入式设备的JTAG,Angle,和ICE三种调试笔记
  9. Windows10 22H2 19045.2130推送了!
  10. 【C语言】之实现简单的打字程序