T1

题目大意:从原点开始循环执行命令,问最后的位置

好吧这就是一道幼儿园的周期问题,模拟即可

#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int T,tt,n,xx,yy,lx,ly;
long long fx,fy;
char op[N];
int main() {
scanf("%s%d",op+1,&T);
n=strlen(op+1),tt=T/n;
for(int i=1;i<=n;i++) {
if(op[i]=='E')++xx;
else if(op[i]=='W')--xx;
else if(op[i]=='S')--yy;
else if(op[i]=='N')++yy;
}
for(int i=1;i<=(T%n);i++) {
if(op[i]=='E')++lx;
else if(op[i]=='W')--lx;
else if(op[i]=='S')--ly;
else if(op[i]=='N')++ly;
}
fx=1LL*xx*tt+lx;
fy=1LL*yy*tt+ly;
printf("%lld %lld",fx,fy);
}

T2

初始是 1 ,一次可以加 \(x\) 或加 \(y\) 或加 \(z\) ,问上限为 \(h\) 时最多能的到多少个数

\(40 \ \text{pts}\) :无脑的暴力

\(100 \ \text{pts}\) 设 \(D_i\) 为只用 \(y,z\) 的最小\(c\mod x=i\) ,所以

\(D_0=0\)

\(D_{(i+y)\mod x}=D_i+y\)

\(D_{(i+z)\mod x}=D_i+z\)

这样可以用最短路来转移。答案就是 \(\sum_{i=0}^{x-1}(\lfloor\dfrac{h-D_i}{x}\rfloor+1)*(n\ge D_i)\)

剩下的 \(h-D_i\) 都只用 \(x\) ,就有 \(\lfloor\dfrac{h-D_i}{x}\rfloor\) ,还可以不用 \(x\) ,所以加一

2021.3.15 19:46 发现这是一题经典的同余最短路

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005;
LL n,res,dis[N];
int x,y,z,cnt,l,r,q[N],vis[N];
int main() {
scanf("%lld%d%d%d",&n,&x,&y,&z),--n;
memset(dis,100,sizeof(dis));
dis[0]=0,q[r=1]=0;
for(int u,v;l<r;) {
u=q[++l],vis[u]=0;
if(dis[u]+y<dis[v=(u+y)%x])dis[v]=dis[u]+y,q[++r]=v;
if(dis[u]+z<dis[v=(u+z)%x])dis[v]=dis[u]+z,q[++r]=v;
}
for(int i=0;i<x;i++)
if(n>=dis[i])res+=(n-dis[i])/x+1;
printf("%lld",res);
}

T3

题意:维护一个序列,操作 1 把 \(L\le\forall i\le R\) 的元素加上 \(F_{i-L+1}\) 其中 \(F\) 表示斐波那契数列

良心的暴力分:\(40\),折腾一个小时线段树的结果

赛后:我*,懒标记可以用 vector !!!为什么不会超时:我也不知道

然后线段树巨大常数会超时,用分块。下传标记、修改、查询都是 \(O(\sqrt n)\) ,总 \(O(m\sqrt n)\)

#include<bits/stdc++.h>
#define RG register
using namespace std;
typedef long long LL;
const LL P=1000000009;
const int N=100005,SQ=1005;
inline int Rd() {
RG 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;
}
LL x[N],sm[SQ],ans,f[N]={0,1,1},s[N]={0,1,2};
vector<int>tg[SQ];
int n,T,pos[N],L[SQ],R[SQ],bl;
inline void down(RG int p) {
if(tg[p].empty())return;
for(RG int i=0;i<tg[p].size();i++)
for(RG int j=L[p];j<=R[p];j++)
(x[j]+=f[j-tg[p][i]+1])%=P;
tg[p].clear();
}
inline void mdy(RG int l,RG int r) {
RG int p=pos[l],q=pos[r];
if(p==q) {
for(RG int i=l;i<=r;i++)
(x[i]+=f[i-l+1])%=P,
(sm[p]+=f[i-l+1])%=P;
return;
}
for(RG int i=l;i<=R[p];i++)
(x[i]+=f[i-l+1])%=P,
(sm[p]+=f[i-l+1])%=P;
for(RG int i=p+1;i<=q-1;i++)
(sm[i]+=(s[R[i]-l+1]-s[L[i]-l]+P)%P)%=P,
tg[i].push_back(l);
for(RG int i=L[q];i<=r;i++)
(x[i]+=f[i-l+1])%=P,
(sm[q]+=f[i-l+1])%=P;
}
inline void ask(RG int l,RG int r) {
RG int p=pos[l],q=pos[r];
if(p==q) {
down(p);
for(RG int i=l;i<=r;i++)(ans+=x[i])%=P;
return;
}
down(p),down(q);
for(RG int i=l;i<=R[p];i++)(ans+=x[i])%=P;
for(RG int i=p+1;i<=q-1;i++)(ans+=sm[i])%=P;
for(RG int i=L[q];i<=r;i++)(ans+=x[i])%=P;
}
int main() {
n=Rd(),T=Rd();
for(RG int i=3;i<=n;i++)
f[i]=(f[i-1]+f[i-2])%P,
s[i]=(s[i-1]+f[i])%P;
for(RG int i=1;i<=n;i++)x[i]=1LL*Rd();
bl=sqrt(1.0*n);
for(RG int i=1;i<=bl;i++)L[i]=R[i-1]+1,R[i]=i*bl;
if(R[bl]<n)++bl,L[bl]=R[bl-1]+1,R[bl]=n;
for(RG int i=1;i<=bl;i++)
for(RG int j=L[i];j<=R[i];j++)
pos[j]=i,(sm[i]+=x[j])%=P;
for(RG int opt,l,r;T--;) {
opt=Rd(),l=Rd(),r=Rd();
if(opt==1)mdy(l,r);
else ans=0,ask(l,r),printf("%lld\n",ans);
}
}

方法 2

维护一个贡献数组 \(d\) ,可以 \(O(1)\) 修改:

\(d_l\leftarrow d_l+1\)

\(d_{r+1}\leftarrow d_{r+1}-f_{r-l+2}\)

\(d_{r+2}\leftarrow d_{r+2}-f_{r-l+1}\)

重算:\(O(n)\) 计算 \(d\) ,即对原数组的贡献 \(d_i=d_{i-1}+d_{i-2}\)

但是这样复杂度依然不理想,发现瓶颈是重算

运用平衡规划(好高级的样子),每 \(k\) 次进行重算

发现询问时不一定刚刚重算完,所以这一段贡献单独算进答案

容易发现当 \(k=\sqrt m\) 时复杂度最优,为 \(O((n+m)\sqrt m)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL P=1000000009;
const int N=100005;
int n,T,bl,ls=1,opt[N],l[N],r[N];
LL res,x[N],sm[N],d[N],f[N]={0,1,1},s[N]={0,1,2};
int main() {
scanf("%d%d",&n,&T);
for(int i=3;i<=n;i++) {
f[i]=(f[i-1]+f[i-2])%P;
s[i]=(s[i-1]+f[i])%P;
}
for(int i=1;i<=n;i++) {
scanf("%d",&x[i]);
sm[i]=(sm[i-1]+x[i])%P;
}
bl=sqrt(1.0*T);
for(int i=1;i<=T;i++) {
scanf("%d%d%d",&opt[i],&l[i],&r[i]);
if(opt[i]==1) {
++d[l[i]];
d[r[i]+1]-=f[r[i]-l[i]+2];
d[r[i]+2]-=f[r[i]-l[i]+1];
} else {
res=(sm[r[i]]-sm[l[i]-1]+P)%P;
for(int j=ls;j<=i;j++)
if(opt[j]==1 && r[j]>=l[i] && l[j]<=r[i])
res=(res+s[min(r[i],r[j])-l[j]+1]-s[max(l[i],l[j])-l[j]]+P)%P;
printf("%lld\n",res);
}
if(i%bl==0) {
sm[1]=(x[1]+=d[1]),ls=i+1;
for(int j=2;j<=n;j++) {
(d[j]+=d[j-1]+d[j-2]+P)%=P;
(x[j]+=d[j]+P)%=P;
sm[j]=(sm[j-1]+x[j])%P;
}
memset(d,0,sizeof(d));
}
}
}

T4

赛时:怎么又是期望 dp ,放弃了

赛后:三行代码认真的吗?

其实就是把相邻两个数的较大值取倒数,然后求和

#include<bits/stdc++.h>
using namespace std;
const int N=10000005;
int n,A,B,C,x[N];
double s;
int main() {
scanf("%d%d%d%d%d",&n,&A,&B,&C,x+1);
for(int i=2;i<=n;i++)
x[i]=(1LL*x[i-1]*A+1LL*B)%100000001;
for(int i=1;i<=n;i++)x[i]=x[i]%C+1;
for(int i=1;i<=n;i++)s+=1.0/max(x[i],x[i%n+1]);
printf("%.3lf",s);
}

总结

T2:了解了同余最短路,希望下次知道

T3:原来懒标记可以这样+奇妙的差分+平衡规划

T4:不要以为期望 dp 很难

2021.03.13【NOIP提高A&B组】模拟 总结的更多相关文章

  1. 2021.05.03【NOIP提高B组】模拟 总结

    比较水的一场比赛,却不能 AK T1 有 \(n\) 次,每次给 \(A_i,B_i\) 问以 \(i\) 结尾的 \(A,B\) 的匹配中最大和的最小值 问最大和的最小值,却不用二分. 如果暴力排序 ...

  2. 2021.04.03【NOIP提高B组】模拟 总结

    T1 题目大意:求最小的 \(n\in[0,lim]\) 使得区间 \([L,R]\) 在线段树建树 \(build(0,n)\) 的区间内 考场时想到了正解,结果推式子退错了... 其实就是从下往上 ...

  3. 纪中集训2020.02.03【NOIP提高组】模拟B 组总结反思——登机(board),游戏(game),分组(group)

    T1 JZOJ5535. 登机(board) 比赛时 一在题目列表里看到题目标题,就热血沸腾了,不知道为什么,老师居然放了一道之前做过的题目.我清楚地记得这题是DP,于是很快码了出来.讲一讲我的思路, ...

  4. 2021.04.24【NOIP提高B组】模拟 总结

    2021.04.24[NOIP提高B组]模拟 总结 T1 题意:有一圈数.两两之间有加法或乘法操作, 问你开始断掉那条边使得剩下的序列经过某种操作后的值最大 看上去是个区间 dp .然后直接断环成列, ...

  5. 1043 方格取数 2000 noip 提高组

    1043 方格取数  2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...

  6. [NOIP提高组2018]货币系统

    [TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...

  7. NOIP提高组初赛难题总结

    NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...

  8. 津津的储蓄计划 NOIp提高组2004

    这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...

  9. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

随机推荐

  1. Java报错: A component required a bean of type 'com.sirifeng.testmybatis.mapper.BookMapper' that could not be found.

    在学习Spring-boot-mybatis时,报错A component required a bean of type 'com.sirifeng.testmybatis.mapper.BookM ...

  2. Java重载容易引发的错误—返回类型

    方法的签名仅仅与方法名和参数类型相关,而与访问控制符.返回类型无关,以及方法体中的内容都没有关系,下面用一个例子说明; 如果Student类两种签名,myStudent(int,int)返回int 类 ...

  3. Visual Studio 安装 MFC

    **Visual Studio 安装 MFC 库**   打开 Visual Studio Installer //程序   选择对应的版本 (本人 VS2022)->修改   [点击]单个组件 ...

  4. ThingsBoard安装编译搭建环境踩坑记录

    1.首先从github拉下来项目,我们采用源码编译的方式部署 git clone https://github.com/thingsboard/thingsboard.git 2.切换分支 git c ...

  5. Codeforces Round #133 (Div. 2), A.【据图推公式】 B.【思维+简单dfs】

    Problem - 216A - Codeforces Problem - B - Codeforces A Tiling with Hexagons 题意: 给出a b c ,求里面有多少个六边形 ...

  6. 前端性能优化之js,css调用优化

    规则1:减少HTTP请求     把多个JS请求合并为一个JS请求,把多个CSS请求合并为一个CSS请求.从而减少从客户端向服务器端的请求数.     规则3:添加Expires头     用http ...

  7. git 将本地文件推送到远程分支的分支

    1.  新建文件夹复制远程分支 2. 切换到远程分支 3. 推送到远程 添加到暂存区,先运行 " git add . " 查看文件状态                     在运 ...

  8. XCTF练习题---MISC---Ditf

    XCTF练习题---MISC---Ditf flag:flag{Oz_4nd_Hir0_lov3_For3ver} 解题步骤: 1.观察题目,下载附件 2.这道题是安恒办的一场比赛题目,下载附件以后是 ...

  9. [总结] 零散的 tricks

    对于类似构造方案的题目,先确定其中一些关键位置的方案,然后看是否能较为简单地推出其他位置的方案. 一个长度为 \(n\) 的序列,满足 \[a_1\le-a_4\le a_7\le-a_{10}\le ...

  10. 团队Beta2

    队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 接下来的计划 完成短租车,页面美化 **还 ...