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 ...
随机推荐
- mysql 必知必会整理—视图[十二]
前言 简单整理一下视图. 正文 视图: 需要MySQL 5 MySQL 5添加了对视图的支持.因此,本章内容适用于MySQL 5及以后的版本. 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动 ...
- mybatis generator生成mapper接口后的代理类,很方便使用。
1.spring 配置: <bean id="superMapperProxy" class="com.qws.v1.daoImpl.MapperProxy&quo ...
- shell脚本中的运算符和条件判断
shell脚本中的运算符和条件判断: 一.算术运算符 在Shell脚本中,你可以使用各种运算符来执行数学运算.比较和逻辑操作. 计算方式: $[ ] $(( )) 例: a=$[(9+5)90] 打印 ...
- T-SQL中执行存储过程与C#执行同样操作的比较
1 exec sp_executesql N"UPDATE [dbo].[Courses] 2 SET [Title] = @0 3 WHERE (([CourseID] = @1) AND ...
- JavaWeb技术JSP连接数据库操作
"感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 0X01 ...
- 力扣81(java&python)-搜索旋转排序数组 II(中等)
题目: 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 ...
- 使用AnalyticDB轻松实现以图搜图和人脸检索
1. 背景 以图搜图在生活中有着广泛的应用, 当我们在电视上看到有人穿着一件美丽的裙子或者帅气的球鞋也想拥有时, 我们可以拍张照片然后打开淘宝然后上传照片就可以快速的找到这个商品. 我们看到一张电影截 ...
- 应用容灾中,MySQL数据表是否需要跨云同步?
简介: 容灾系统的重要目标在于保证系统数据和服务的"连续性".当系统发生故障时,容灾系统能够快速恢复服务和保证数据的有效性.为了防止天灾人祸.不可抗力,在同城或异地建立对应的IT系 ...
- DataWorks搬站方案:Azkaban作业迁移至DataWorks
简介: DataWorks迁移助手提供任务搬站功能,支持将开源调度引擎Oozie.Azkaban.Airflow的任务快速迁移至DataWorks.本文主要介绍如何将开源Azkaban工作流调度引擎中 ...
- dotnet 警惕 async void 线程顶层异常
在应用程序设计里面,不单是 dotnet 应用程序,绝大部分都会遵循让应用在出现未处理异常状态时终结的原则.在 dotnet 应用里面,如果一个线程顶层出现未捕获异常,则应用进程将会被认为出现异常状态 ...