NOIP模拟86(多校19)
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)的更多相关文章
- NOIP模拟83(多校16)
前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...
- Noip模拟44 2021.8.19
比较惊人的排行榜 更不用说爆零的人数了,为什么联赛会这么难!!害怕了 还要再努力鸭 T1 Emotional Flutter 考场上没切掉的神仙题 考率如何贪心,我们把黑色的条延长$s$,白色的缩短$ ...
- Noip模拟20 2021.7.19
T1 玩具 题目读错意思直接报零... 拼接方式没读懂以为是个数学题,用卡特兰数,可是的确想多了 数据范围表达出你怎么暴力都行,选择$n^3,dp$ 相当于一片森林,每次多加一条边就合并成一棵树 在$ ...
- NOIP模拟92(多校25)
前言 所以说这次是 HZOI 多校联测巅峰????(题目,数据过水??) T1 石子合并 解题思路 签到题. 发现我们可以给每个数字附一个正负号,每个数字的贡献就是它本身乘上这个符号. 发现至少应该有 ...
- NOIP模拟84(多校17)
T1 宝藏 解题思路 考场上一眼出 \(nlog^2\) 做法,然后没看见是 1s 3e5 的数据,我竟然以为自己切了?? 考完之后尝试着把二分改为指针的移动,然后就过了??或许是数据水吧,感觉自己的 ...
- NOIP模拟85(多校18)
前言 好像每个题目背景所描述的人都是某部番里的角色,热切好像都挺惨的(情感上的惨). 然后我只知道 T1 的莓,确实挺惨... T1 莓良心 解题思路 首先答案只与 \(w\) 的和有关系,于是问题就 ...
- NOIP模拟88(多校21)
前言 对于这套题的总体感觉就是难,然后就是自己很菜... 对于 T1 考试时只会一个最垃圾的背包,考完之后对于思路这一块也不是很顺利,大概这就是薄弱的地方吧. 然后 T2 是比较简单的一道题了,但是考 ...
- NOIP模拟96(多校29)
T1 子集和 解题思路 大概是一个退背包的大白板,然而我考场上想复杂了,竟然还用到了组合数. 但是大概意思是一样的,有数的最小值一定是一个在 \(a\) 数组中存在的数字. 那么我们想办法除去它对应的 ...
- NOIP模拟99(多校31)
T1 法阵 解题思路 原题3100,张口放 T1(出题人原话) 思维题,合法的情况其实就是上下两个梯形拼起来的样子. 他们的边界都是在 \(i\) 轴上面,但是不能相交. 于是我们可以尝试两者相交的纵 ...
随机推荐
- 删除数组中指定的元素,然后将后面的元素向前移动一位,将最后一位设置为NULL 。 String[] strs={“aaa”,”ccc”,”ddd”,”eee”,”fff”,”ggg”}; 指定删除字符串“ccc”,把后的元素依次向前移动!!!
public static void main(String[] args) { int temp = -1; String[] strs = {"aaa", "ccc& ...
- 注意!PHP中字符串与数字的比较
在日常开发过程中,运算符是我们每天都会接触到的.这个运算符中其实埋了非常多的坑,今天我们就来看下字符串和数字用比较需要注意的问题. 首先来看看这些代码: echo '"1234" ...
- Windows下升级Python3.7.7后(原Python3.6.2版本)如何切换Python版本
笔者:风起怨江南 出处:https://www.cnblogs.com/mengjinxiang 笔者原创,文章欢迎转载,如果喜欢请点赞+关注,谢谢! 问题:window系统下,如果升级了最新的Pyt ...
- filter_var() 验证邮箱、ip、url的格式 php
验证邮箱格式的正确与否:你的第一解决方案是什么呢? 不管你们怎么思考的:反正我首先想到的就是字符串查找看是否有@符号: 但是对于结尾的.com或者.net 亦或者.cn等等越来越多的域名验证感觉棘手: ...
- 《如何进行接口mock测试》
前言: Mock通常是指:在测试一个对象时,我们构造一些假的对象来模拟与其交互.而这些Mock对象的行为是我们事先设定且符合预期.通过这些Mock对象来测试对象在正常逻辑,异常逻辑或压力情况下工作是否 ...
- 『Python』matplotlib的imshow用法
热力图是一种数据的图形化表示,具体而言,就是将二维数组中的元素用颜色表示.热力图之所以非常有用,是因为它能够从整体视角上展示数据,更确切的说是数值型数据. 使用imshow()函数可以非常容易地制作热 ...
- Elasticsearch、XXLJob以及最近的学习记录
Elasticsearch.XXLJob以及最近的学习记录 前言 在这九月的最后一周,来总结一下最近的学习记录,主要是对于Elasticsearch.XXLjob的初步学习,想着还是多记录点,以便后面 ...
- Loj#143-[模板]质数判定【Miller-Rabin】
正题 题目链接:https://loj.ac/p/143 题目大意 给出一个数\(p\),让你判定是否为质数. 解题思路 \(Miller-Rabin\)是一种基于费马小定理和二次探测定理的具有较高正 ...
- ASP.NET Core中将Json字符串转换为JsonResult
ASP.NET Core中返回JsonResult 最近在使用NET 5.0做WebApi中,发现只能返回string类型,不能用JsonResult返回实体,于是查阅资料找到解决办法. 两种方式分别 ...
- 5分钟实现用docker搭建Redis集群模式和哨兵模式
如果让你为开发.测试环境分别搭一套哨兵和集群模式的redis,你最快需要多久,或许你需要一天?2小时?事实是可以更短. 是的,你已经猜到了,用docker部署,真的只需要十几分钟. 一.准备工作 拉取 ...