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 ...
随机推荐
- git fork 项目的更新
fork:github网站的操作,将开源项目复制一份到自己的仓库中 那fork的项目在原仓库更新后,如何同步呢? 1.查看远程仓库 $ git remote -v origin https://cod ...
- 牛客网-SQL专项训练21
①Mysql中表student_info(id,name,birth,sex),字段类型都是varchar,插入如下记录:('1014' , '张三' , '2002-01-06' , '男'); S ...
- MySQL实战—更新过程
和查询流程不同的是,更新流程涉及两个重要的日志模块:redo log(重做日志)和 binlog(二进制日志). redo log redo log通常是物理日志,记录的是数据页的物理修改,而不是某一 ...
- 科学地花钱:基于端智能的在线红包分配方案 (CIKM2020)
简介: 红包是电商平台重要的用户运营手段,本文将介绍1688基于端智能技术开发的two-stage红包分发方案.这一方案持续在线上生效,相较于原有算法有明显提升. 一.前言 本文是作者在1688进行新 ...
- DTCC 2020 | 阿里云赵殿奎:PolarDB的Oracle平滑迁移之路
简介: Oracle兼容性是业务客户从Oracle生态迁移到PolarDB生态的第一步也是至关重要的一步,PolarDB通过不断沉淀支持大量实际业务的真实Oracle兼容性功能,确保客户业务可以真正做 ...
- 基于WASM的无侵入式全链路A/B Test实践
简介: 我们都知道,服务网格(ServiceMesh)可以为运行其上的微服务提供无侵入式的流量治理能力.通过配置VirtualService和DestinationRule,即可实现流量管理.超时重试 ...
- 零基础玩转SLS日志查询-SLS Query Builder发布
简介:日志服务(Log Service,简称 SLS) 是阿里云提供的行业领先的日志大数据解决方案,一站式提供数据收集.清洗.分析.可视化.告警等功能.智能查询分析是数据中台重要的一环,SLS支持秒 ...
- 《MySql必知必会》笔记整理
数据库基础 关键词: 数据库 表(表名唯一,取决多个因素,如不同数据库的表可以同名) 模式(关于数据库和表的布局及特性的信息) 列(表中的字段) 行[行(raw)和记录(record)很大程度可以等同 ...
- LVGL SCROLL循环滚动
一.案例测试 这里我使用LVGL的版本是8.3.3 运行案例 lvgl_examples\scroll\lv_example_scroll_6 效果如下所示 二.现象 这里先描述一下现象,当我们使用 ...
- Oracle中ALTER TABLE的五种用法(三)
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...