2021.03.13【NOIP提高A&B组】模拟 总结
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组】模拟 总结的更多相关文章
- 2021.05.03【NOIP提高B组】模拟 总结
比较水的一场比赛,却不能 AK T1 有 \(n\) 次,每次给 \(A_i,B_i\) 问以 \(i\) 结尾的 \(A,B\) 的匹配中最大和的最小值 问最大和的最小值,却不用二分. 如果暴力排序 ...
- 2021.04.03【NOIP提高B组】模拟 总结
T1 题目大意:求最小的 \(n\in[0,lim]\) 使得区间 \([L,R]\) 在线段树建树 \(build(0,n)\) 的区间内 考场时想到了正解,结果推式子退错了... 其实就是从下往上 ...
- 纪中集训2020.02.03【NOIP提高组】模拟B 组总结反思——登机(board),游戏(game),分组(group)
T1 JZOJ5535. 登机(board) 比赛时 一在题目列表里看到题目标题,就热血沸腾了,不知道为什么,老师居然放了一道之前做过的题目.我清楚地记得这题是DP,于是很快码了出来.讲一讲我的思路, ...
- 2021.04.24【NOIP提高B组】模拟 总结
2021.04.24[NOIP提高B组]模拟 总结 T1 题意:有一圈数.两两之间有加法或乘法操作, 问你开始断掉那条边使得剩下的序列经过某种操作后的值最大 看上去是个区间 dp .然后直接断环成列, ...
- 1043 方格取数 2000 noip 提高组
1043 方格取数 2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...
- [NOIP提高组2018]货币系统
[TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...
- NOIP提高组初赛难题总结
NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...
- 津津的储蓄计划 NOIp提高组2004
这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...
- NOIP提高组2004 合并果子题解
NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...
随机推荐
- Java中读取 .properties 和 .xml 文件
配置文件内容获取 总结内容 1. Java中为什么要使用配置文件 2. Java中常用的配置文件类型有哪些以及它们的特点 Properties配置文件 XML配置文件 总结 总结内容 1. Java中 ...
- xtrabackup备份和恢复数据脚本
该脚本用于备份和恢复MySQL数据库. 总结xtrabackup备份的两个坑: 1.在恢复数据的过程中,如果中途出错,则数据将会被破坏,后续很难再恢复. 2.在恢复过程中,如果版本过低,在准备全量数据 ...
- maven打包jar到本地仓库
1.执行如下命令 mvn install:install-file -Dfile=guava-28.2-jre.jar -DgroupId=com.google.guava -DartifactId= ...
- 使用IDEA生产JavaDoc文档
源代码 package com.*****.base; //文档注解 /** * @Author intelliyu * @version 1.0 //版本 * since 1.8 //指明需要最早使 ...
- PowerBI开发:用自然语言来探索数据--Q&A
Power BI报表的用户,肯定会被Q&A的功能惊艳到,在查看报表时,仅仅通过输入文本就可以探索数据,并且结果是可视化的,更令人惊艳的时,结果几乎是实时显示出来的.这使得Q&A Vis ...
- el-menu菜单 -- unique-opened 子菜单唯一性失效
总结: 点击的是 el-sub-menu . 所以 el-sub-menu 的唯一性是必须的.否则 unique-opened 属性不生效
- 基于Ansible实现Apache Doris快速部署运维指南
Doris Ansible 使用指南 Apache Doris 介绍 Apache Doris是一个现代化的MPP分析型数据库产品.仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析.Apac ...
- 用python爬虫,对12306网站进行模拟登陆
from selenium import webdriver from time import sleep from PIL import Image from selenium.webdriver ...
- 【Azure 应用服务】Azure Function 启用 Managed Identity后, Powershell Funciton出现 ERROR: ManagedIdentityCredential authentication failed
问题描述 编写Powershell Function,登录到China Azure并获取Azure AD User信息,但是发现遇见了 [Error] ERROR: ManagedIdentityCr ...
- python基础-基本数据类型(二)
一.序列类型 序列类型是用来表示有序的元素集合 1.字符串(str) python中字符串通常用str表示,字符串是使用单引号,双引号,三引号包裹起来的字符的序列,用来表示文本信息. 1.1 字符串的 ...