T1 特殊字符串

解题思路

\(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献。

转移枚举当前位置于之前位置结尾的组合加上贡献即可。

对于边界问题,容易发现选择 1 一定不劣。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e5+10,INF=1e18;
int n,m,ans,f[N][30],val[30][30];
char s[N],ch1,ch2;
#undef int
int main()
{
#define int long long
freopen("shiki.in","r",stdin); freopen("shiki.out","w",stdout);
n=read(); scanf("%s",s+1); m=read();
for(int i=1,v;i<=m;i++)
{
getchar(); ch1=getchar(); getchar(); ch2=getchar(); v=read();
val[ch1-'a'][ch2-'a']+=v;
}
for(int i=1;i<=n;i++) for(int j=0;j<26;j++) f[i][j]=-INF; f[1][s[1]-'a']=0;
for(int i=2;i<=n;i++)
{
for(int j=0;j<26;j++) f[i][j]=f[i-1][j];
for(int j=0;j<26;j++) f[i][s[i]-'a']=max(f[i][s[i]-'a'],f[i-1][j]+val[j][s[i]-'a']);
}
for(int i=0;i<26;i++) ans=max(ans,f[n][i]); printf("%lld",ans);
return 0;
}

T2 宝可梦

解题思路

调了一下午,换了两三种做法,最后换回我原来的做法,尝试着调了一下段错误,发现真的只是数组开小了那么简单!!!

我还以为是系统栈空间炸了。。。

如果当前方向是可以走的话直接向前走,否则的话因为是沿着右墙走所以直接左转。

然后对于右手边没有墙的时候,就直接向右手边走就好了。50行精品超短小暴力

由于题目保证路径是唯一的因此所有点之间形成了一种树形结构。

那么我们选择一个出发点一直走一定会遍历完整张图,并且形成了一个欧拉序。

于是我们就可以对于一个点按照正反方向走两边(询问是有方向的),对于每一个询问查找对应点之间的距离就好了。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=5e5+10,INF=1e18;
int n,m,q,all,sum[10],pos[5][N][5];
int r[10]={0,4,3,1,2},l[10]={0,3,4,2,1};
int d1[10]={0,-1,1,0,0},d2[10]={0,0,0,-1,1};
vector<char> e[N];
bool vis[N];
char ch[N];
inline int id(int x,int y){return (x-1)*m+y;}
void work(int x,int y,int fx)
{
int p=fx,tx=x,ty=y;
pos[p][id(x,y)][fx]=min(pos[p][id(x,y)][fx],sum[p]);
int nx=x+d1[fx],ny=y+d2[fx];
if(e[nx][ny]=='.') sum[p]++,x=nx,y=ny;
else fx=l[fx];
if(e[x+d1[r[fx]]][y+d2[r[fx]]]=='.') fx=r[fx];
while(x!=tx||y!=ty||p!=fx)
{
pos[p][id(x,y)][fx]=min(pos[p][id(x,y)][fx],sum[p]);
int nx=x+d1[fx],ny=y+d2[fx];
if(x==tx&&y==ty&&fx==p) break;
if(e[nx][ny]=='.') sum[p]++,x=nx,y=ny;
else for(int i=1;i<=3;i++)
{
fx=r[fx];
if(x==tx&&y==ty&&fx==p) break;
}
if(x==tx&&y==ty&&fx==p) break;
if(e[x+d1[r[fx]]][y+d2[r[fx]]]=='.') fx=r[fx];
}
}
#undef int
int main()
{
#define int long long
freopen("pokemon.in","r",stdin); freopen("pokemon.out","w",stdout);
n=read(); m=read(); memset(pos,0x3f,sizeof(pos));
for(int i=1;i<=n;i++)
{
e[i].push_back('X'); scanf("%s",ch+1);
for(int j=1;j<=m;j++) e[i].push_back(ch[j]);
e[i].push_back('X');
}
for(int i=0;i<=m+1;i++) e[0].push_back('X'),e[n+1].push_back('X');
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) all+=(e[i][j]=='.');
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(e[i][j]=='.'){for(int k=1;k<=2;k++)work(i,j,k);goto V;}
V:; q=read();
while(q--)
{
int x,y,tx,ty,fx; x=read(); y=read(); tx=read(); ty=read();
scanf("%s",ch+1); fx=(ch[1]=='U')?1:((ch[1]=='D')?2:((ch[1]=='L')?3:4));
int ans=INF;
for(int p=1;p<=2;p++)
for(int i=1;i<=4;i++)
{
if(pos[p][id(x,y)][fx]>=INF||pos[p][id(tx,ty)][i]>=INF) continue;
if(pos[p][id(tx,ty)][i]>=pos[p][id(x,y)][fx]) ans=min(ans,pos[p][id(tx,ty)][i]-pos[p][id(x,y)][fx]);
else ans=min(ans,sum[p]+(pos[p][id(tx,ty)][i]-pos[p][id(x,y)][fx]));
}
printf("%lld\n",ans);
}
return 0;
}

T3 矩阵

解题思路

其实就是一个爆搜,显然如果有两个相邻的点数值相等答案就是 -1 。

否则的话由于是等比数列搜索深度不会超过 \(log\) 层,因此复杂度是对的。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
#define left Left
#define right Right
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=4e4+10;
int n,m,ans=1;
int d1[10]={0,1,-1,0,0};
int d2[10]={0,0,0,1,-1};
unordered_map<int,int> mp[N];
vector<int> s[N];
inline int id(int x,int y){return (x-1)*m+y;}
inline bool check(){return (1.0*clock())/(1.0*CLOCKS_PER_SEC)<=0.98;}
void dfs(int x,int y,int dis,int num)
{
ans=max(ans,dis);
for(int i=1;i<=4;i++)
{
int nx=x+d1[i],ny=y+d2[i];
if(s[nx][ny]==s[x][y]*num)
dfs(nx,ny,dis+1,num);
}
}
void solve(int i,int j)
{
for(int k=1;k<=4;k++)
{
int x=i+d1[k],y=j+d2[k];
if(s[x][y]<s[i][j]||s[x][y]%s[i][j]) continue;
dfs(x,y,2,s[x][y]/s[i][j]);
}
}
#undef int
int main()
{
#define int long long
freopen("matrix.in","r",stdin); freopen("matrix.out","w",stdout);
n=read(); m=read(); for(int i=0;i<=m+1;i++) s[0].push_back(0),s[n+1].push_back(0);
for(int i=1;i<=n;i++)
{
s[i].push_back(0);
for(int j=1;j<=m;j++) s[i].push_back(read());
s[i].push_back(0);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=4;k++)
{
int x=i+d1[k],y=j+d2[k];
if(s[x][y]==s[i][j]) printf("-1"),exit(0);
}
for(int i=1;i<=n&&check();i++)
for(int j=1;j<=m&&check();j++)
solve(i,j);
printf("%lld",ans);
return 0;
}

T4 乘法

大坑未补

NOIP模拟86(多校19)的更多相关文章

  1. NOIP模拟83(多校16)

    前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...

  2. Noip模拟44 2021.8.19

    比较惊人的排行榜 更不用说爆零的人数了,为什么联赛会这么难!!害怕了 还要再努力鸭 T1 Emotional Flutter 考场上没切掉的神仙题 考率如何贪心,我们把黑色的条延长$s$,白色的缩短$ ...

  3. Noip模拟20 2021.7.19

    T1 玩具 题目读错意思直接报零... 拼接方式没读懂以为是个数学题,用卡特兰数,可是的确想多了 数据范围表达出你怎么暴力都行,选择$n^3,dp$ 相当于一片森林,每次多加一条边就合并成一棵树 在$ ...

  4. NOIP模拟92(多校25)

    前言 所以说这次是 HZOI 多校联测巅峰????(题目,数据过水??) T1 石子合并 解题思路 签到题. 发现我们可以给每个数字附一个正负号,每个数字的贡献就是它本身乘上这个符号. 发现至少应该有 ...

  5. NOIP模拟84(多校17)

    T1 宝藏 解题思路 考场上一眼出 \(nlog^2\) 做法,然后没看见是 1s 3e5 的数据,我竟然以为自己切了?? 考完之后尝试着把二分改为指针的移动,然后就过了??或许是数据水吧,感觉自己的 ...

  6. NOIP模拟85(多校18)

    前言 好像每个题目背景所描述的人都是某部番里的角色,热切好像都挺惨的(情感上的惨). 然后我只知道 T1 的莓,确实挺惨... T1 莓良心 解题思路 首先答案只与 \(w\) 的和有关系,于是问题就 ...

  7. NOIP模拟88(多校21)

    前言 对于这套题的总体感觉就是难,然后就是自己很菜... 对于 T1 考试时只会一个最垃圾的背包,考完之后对于思路这一块也不是很顺利,大概这就是薄弱的地方吧. 然后 T2 是比较简单的一道题了,但是考 ...

  8. NOIP模拟96(多校29)

    T1 子集和 解题思路 大概是一个退背包的大白板,然而我考场上想复杂了,竟然还用到了组合数. 但是大概意思是一样的,有数的最小值一定是一个在 \(a\) 数组中存在的数字. 那么我们想办法除去它对应的 ...

  9. NOIP模拟99(多校31)

    T1 法阵 解题思路 原题3100,张口放 T1(出题人原话) 思维题,合法的情况其实就是上下两个梯形拼起来的样子. 他们的边界都是在 \(i\) 轴上面,但是不能相交. 于是我们可以尝试两者相交的纵 ...

随机推荐

  1. Git 初识和使用

    目录 目录 目录 概念 工作区/暂存区/版本库 master 版本号 常见命令 环境搭建 Linux 下 Git 和 GitHub 环境的搭建 Git 本地操作 本地仓库的创建和使用 查看信息 查看状 ...

  2. python win32com 处理excle 写一个公共的类

    利用win32com处理excle,这样可以不管文件是老的xls还是新的xlsx格式,非常方便. 类的源码如下: import win32com.client as win32 class easyE ...

  3. vue-router路由钩子

    路由跳转前后,需要做某些操作,这时就可以使用路由钩子来监听路由的变化. 接收三个参数: to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: F ...

  4. 【PHP数据结构】其它排序:简单选择、桶排序

    这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...

  5. html2canvas实现截取指定区域或iframe的区域

    官网文档: http://html2canvas.hertzen.com/ 使用的是 jquery 3.2.1   html2canvas 1.0.0-rc.7 截取根据id的指定区域: var ca ...

  6. Docker系列(5)- 常用命令(1) | 帮助命令

    帮助命令 [root@localhost ~]# docker version #显示docker的版本信息 [root@localhost ~]# docker info #显示docker的系统信 ...

  7. docker network 参数

    一. 格式 docker network COMMAND 二.COMMAND 讲解 2.1 .docker network connect 格式 docker network connect [OPT ...

  8. CF1556E-Equilibrium【栈,树状数组】

    正题 题目连接:https://codeforces.com/contest/1556/problem/E 题目大意 两个长度为\(n\)的序列\(a,b\),\(q\)次询问一个区间\([l,r]\ ...

  9. JDBC连接mariadb时使用依赖

    问题描述:最近在尝试使用mariadb,使用idea开发,在使用jdbc连接数据库的时候,一般会用到driver,user,pwd,url,使用mysql的例子太多了,也有很多详细的教程,但是现在尝试 ...

  10. gcc、g++、gdb安装

    Windows安装 有闲工夫在Windows上安装g++/gcc/gdb,还不如装个虚拟机安装Linux,在Linux上安装 但是我还是要讲的 首先,需要安装MinGW,MinGW,是Minimali ...