NOIP模拟91(多校24)
T1 破门而入
解题思路
签到题(然而我数组开小直接变成暴力分。。。)
发现其实就是第一类斯特林数,然后 \(n^2\) 推就好了。
感觉可以用 NTT 优化成 \(nlogn\) ,但是好像并没有什么卵用(再说了,我也不会。。)
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=3e3+10,mod=998244353;
int n,m,ans,f[N][N];
void add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
#undef int
int main()
{
#define int long long
freopen("broken.in","r",stdin); freopen("broken.out","w",stdout);
n=read(); m=read(); f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=min(i,m);j++)
f[i][j]=(f[i-1][j-1]+(i-1)*f[i-1][j]%mod)%mod;
for(int i=1;i<=m;i++) add(ans,f[n][i]); printf("%lld",ans);
return 0;
}
T2 翻转游戏
解题思路
比第一题还水,发现一个区间 \([l,r]\) 有贡献当且仅当 \(ch_l\neq ch_r\) 。
直接 \(\mathcal{O}(n)\) 扫一遍就好了。
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=3e6+10;
int n,ans=1,cnt[30];
char s[N];
#undef int
int main()
{
#define int long long
freopen("turn.in","r",stdin); freopen("turn.out","w",stdout);
scanf("%s",s+1); n=strlen(s+1);
for(int i=1;i<=n;i++) ans+=i-1-cnt[s[i]-'a'],cnt[s[i]-'a']++;
printf("%lld",ans);
return 0;
}
T3 奶油蛋糕塔
解题思路
可能这个题的做法比较多一些,壮压图论均可。
图论做法就是把四个不同的颜色作为四个点,那么每一块蛋糕就成了两个点之间的连边。
然后两条重边可以看做一条自环,那么我们枚举选择的点集问题就变成了在一个没有自环重边的图上选择边使得权值和最大。
如果是欧拉路那么都可以选,否则删去一条价值最小的边就好了。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
#define count __builtin_popcount
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,ans,all,val[4],id[100],mn[4][4],d[4][4],du[4];
struct Node{int x,y,val;} s[N];
void solve(int sta)
{
memset(d,0,sizeof(d)); memset(val,0,sizeof(val)); memset(du,0,sizeof(du));
for(int i=0;i<4;i++) for(int j=i+1;j<4;j++) mn[i][j]=INF;
int minn=INF,cnt=0,tot=0;
for(int i=1;i<=n;i++)
{
if( (((sta>>s[i].x)&1)^1) || (((sta>>s[i].y)&1)^1) ) continue;
if(s[i].x==s[i].y){val[s[i].x]+=s[i].val;continue;}
du[s[i].x]++; du[s[i].y]++; mn[s[i].x][s[i].y]=min(mn[s[i].x][s[i].y],s[i].val);
if(!d[s[i].x][s[i].y]){d[s[i].x][s[i].y]=s[i].val;continue;}
if((sta>>s[i].x)&1) val[s[i].x]+=s[i].val+d[s[i].x][s[i].y];
else val[s[i].y]+=s[i].val+d[s[i].x][s[i].y];
d[s[i].x][s[i].y]=0;
}
for(int i=0;i<4;i++) if(((sta>>i)&1) && !du[i] && count(sta)!=1) return ;
for(int i=0;i<4;i++) if((sta>>i)&1) cnt+=val[i];
for(int i=0;i<4;i++) for(int j=i+1;j<4;j++) cnt+=d[i][j];
for(int i=0;i<4;i++) tot+=du[i]&1;
if(tot==2||!tot) return ans=max(ans,cnt),void();
for(int i=0;i<4;i++) for(int j=i+1;j<4;j++)
if(du[i]!=1&&du[j]!=1) minn=min(minn,mn[i][j]);
if(minn!=INF) return ans=max(ans,cnt-minn),void();
}
#undef int
int main()
{
#define int long long
freopen("cake.in","r",stdin); freopen("cake.out","w",stdout);
n=read(); id['W']=0; id['X']=1; id['Y']=2; id['Z']=3;
for(int i=1,val;i<=n;i++)
{
s[i].val=read(),s[i].x=id[getchar()],getchar(),s[i].y=id[getchar()];
if(s[i].x>s[i].y) swap(s[i].x,s[i].y); all+=s[i].val;
}
for(int i=1;i<(1<<4);i++) solve(i);
printf("%lld",ans);
return 0;
}
T4 多重影分身之术
解题思路
二分答案 DP 均可(然而我考场上只想到了一个垃圾的 \(n^2\) 傻瓜 DP。。)
二分一个最小时间,对于一个点而言,如果左边有没有拾起来的卷轴,就应该向左走,可以先向左再向右或者先向右再向左。
对于一个左边没有卷轴的点直接向右走就好了。
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=3e5+10,INF=2e9;
int n,m,ans,s[N],p[N];
bool check(int tim)
{
int pos=1;
for(int i=1;i<=n;i++)
{
if(p[pos]<s[i])
{
if(s[i]-p[pos]>tim) return false;
int lim=max(s[i],max(tim-(s[i]-p[pos])+p[pos],(tim-s[i]+p[pos])/2+s[i]));
while(pos<=m&&p[pos]<=lim) pos++; continue;
}
while(pos<=m&&p[pos]<=s[i]+tim) pos++;
}
return pos>m;
}
#undef int
int main()
{
#define int long long
freopen("duplication.in","r",stdin); freopen("duplication.out","w",stdout);
n=read(); m=read(); s[n+1]=INF; p[m+1]=INF;
for(int i=1;i<=n;i++) s[i]=read(); sort(s+1,s+n+1);
for(int i=1;i<=m;i++) p[i]=read(); sort(p+1,p+m+1);
int l=0,r=INF; while(l<=r){int mid=(l+r)>>1;if(check(mid))r=mid-1,ans=mid;else l=mid+1;}
printf("%lld",ans);
return 0;
}
NOIP模拟91(多校24)的更多相关文章
- NOIP模拟83(多校16)
前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...
- NOIP模拟92(多校25)
前言 所以说这次是 HZOI 多校联测巅峰????(题目,数据过水??) T1 石子合并 解题思路 签到题. 发现我们可以给每个数字附一个正负号,每个数字的贡献就是它本身乘上这个符号. 发现至少应该有 ...
- NOIP模拟84(多校17)
T1 宝藏 解题思路 考场上一眼出 \(nlog^2\) 做法,然后没看见是 1s 3e5 的数据,我竟然以为自己切了?? 考完之后尝试着把二分改为指针的移动,然后就过了??或许是数据水吧,感觉自己的 ...
- NOIP模拟85(多校18)
前言 好像每个题目背景所描述的人都是某部番里的角色,热切好像都挺惨的(情感上的惨). 然后我只知道 T1 的莓,确实挺惨... T1 莓良心 解题思路 首先答案只与 \(w\) 的和有关系,于是问题就 ...
- NOIP模拟86(多校19)
T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ...
- NOIP模拟88(多校21)
前言 对于这套题的总体感觉就是难,然后就是自己很菜... 对于 T1 考试时只会一个最垃圾的背包,考完之后对于思路这一块也不是很顺利,大概这就是薄弱的地方吧. 然后 T2 是比较简单的一道题了,但是考 ...
- NOIP模拟96(多校29)
T1 子集和 解题思路 大概是一个退背包的大白板,然而我考场上想复杂了,竟然还用到了组合数. 但是大概意思是一样的,有数的最小值一定是一个在 \(a\) 数组中存在的数字. 那么我们想办法除去它对应的 ...
- NOIP模拟99(多校31)
T1 法阵 解题思路 原题3100,张口放 T1(出题人原话) 思维题,合法的情况其实就是上下两个梯形拼起来的样子. 他们的边界都是在 \(i\) 轴上面,但是不能相交. 于是我们可以尝试两者相交的纵 ...
- HZOJ 20190818 NOIP模拟24题解
T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
随机推荐
- java中jar文件
1.文档性质的jar文件 可以将有包名的类的字节码文件压缩成一个jar文件,供其他源文件用import语句导入jar文件中的类. 以下结合具体的两个类给出生成的jar文件的步骤eg23中TestTwo ...
- 力扣153(java&python)-寻找旋转排序数组中的最小值(中等)
题目: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以 ...
- OceanBase初体验之从MySQL迁移数据到OceanBase集群
前置条件 MySQL 环境 OceanBase 环境 测试用的表结构和一些数据 先在源端 MySQL 用如下脚本创建测试表,以及写入10000条数据用于迁移测试. use test; CREATE T ...
- [Linux] 日志管理: rsyslog 日志格式 / 配置文件详解
1. 日志文件格式包含以下四列: 事件时间 | 发生事件的服务器的主机名 | 产生事件的服务名或程序名 | 事件的具体信息 2. /etc/rsyslog.conf 配置文件 # 服务名称 [连接符号 ...
- 12.prometheus监控之Domain域名过期监控
一.域名过期时间监控 域名的监控通过domain_exporter来完成 domain_exporter:https://github.com/caarlos0/domain_exporter/rel ...
- Oracle和达梦:获取表是否被锁定
1.获取表是否被锁定 select "V$SESSIONS".SESS_ID,"V$SESSIONS".SQL_TEXT,"V$SESSIONS&qu ...
- 接私活利器!推荐一个基于SpringBoot3的后台管理框架
大家好,我是 Java陈序员. 今天,给大家推荐一个后台管理框架,适合二次定制开发.接私活.源码学习等场景. 关注微信公众号:[Java陈序员],获取开源项目分享.AI副业分享.超200本经典计算机电 ...
- 鸿蒙HarmonyOS实战-ArkUI事件(手势方法)
一.手势方法 应用程序的手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式.手势操作可以包括点击.滑动.双击.捏合等动作,用于实现不同的功能和操作. HarmonyOS中常见的手势操作及其 ...
- Android Framework学习之系统启动流程
最近抽空看了framework一些内存,总结一下,留作后续回顾复习
- 各大插件市场智能助手评分榜出炉!百度Comate稳居第一
近日,在VSCode.Jetbrains等各大插件市场智能助手评分榜中,百度Comate分别以4.5和4.4位列第一,通义灵码位居第二.第三,CodeGeeX.iFlyCode.aiXcoder.Gi ...