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)的更多相关文章

  1. NOIP模拟83(多校16)

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

  2. NOIP模拟92(多校25)

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

  3. NOIP模拟84(多校17)

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

  4. NOIP模拟85(多校18)

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

  5. NOIP模拟86(多校19)

    T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ...

  6. NOIP模拟88(多校21)

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

  7. NOIP模拟96(多校29)

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

  8. NOIP模拟99(多校31)

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

  9. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

  10. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

随机推荐

  1. 推荐一波微软家的浏览器:EDGE

    前段时间英雄联盟(LOL)队伍 EDG 夺冠成为热门事件,上了各大热搜,即使大家不玩英雄联盟,相信也多多少少有听说相关信息吧! 今天我们的主角并不是 EDG,而是微软的新版浏览器 EDGE !!! 微 ...

  2. 云服务器ECS共享标准型S6全新发布,行业内最具性价比

    近日,阿里云弹性计算发布全新一代云服务ECS共享标准型S6,性能相对上一代实例提升15%以上,价格相对上一代最高降低42%,是目前国内云计算厂商更能够提供的最具性价比的云服务器产品.一些中小型网站.轻 ...

  3. 阿里云视觉智能开放平台正式上线,阿里集团核心视觉AI能力对外开放

    1月底,阿里云正式推出以计算机视觉AI能力为核心的视觉智能开放平台(vision.aliyun.com),平台目前已上线8大类目,超过50多种视觉AI能力,面向人脸识别,文字识别,商品理解,内容安全, ...

  4. 双11特刊 | 一文揭秘云数据库RDS如何顺滑应对流量洪峰

    ​简介:从绿色低碳到硬核科技,看RDS如何用绿色科技助力2021"双11"? 双十一回顾 从平台到商家,再从物流到客户手中,云数据库RDS支撑着双11集团电商的在线业务.RDS首次 ...

  5. [Go] assignment count mismatch 1 = 2

    Golang 中这个错误的的意思是赋值变量的数目不匹配. 举例: result := json.Marshal(List) 由于没有给返回值中的 error 正确赋值,就会报  assignment ...

  6. WPF 使用 ManipulationDemo 工具辅助调试设备触摸失效问题

    本文将和大家介绍我所在的团队开源的 ManipulationDemo 工具.通过 ManipulationDemo 工具可以提升调试设备触摸失效的效率 此工具在 GitHub 上完全开源,请看 htt ...

  7. notepad运行python代码的步骤

    notepad运行python代码的步骤: 1.用notepad++打开python文件.或者新建文件,保存为.py格式. 2.在菜单栏上面有一个运行,我们点击运行->运行,或者使用快捷键F5. ...

  8. .NET开源、功能强大、跨平台的图表库 - LiveCharts2

    前言 今天大姚给大家分享一个.NET开源(MIT License).功能强大.简单.灵活.跨平台的图表.地图和仪表库:LiveCharts2.   项目介绍 LiveCharts2是一个.NET开源. ...

  9. 2021~2022Apache大数据相关项目盘点

    一.晋升为Apache TLP(Top-Level Project)的大数据相关项目 1.1.Apache DataSketches (20210203) 1.2.Apache Gobblin (20 ...

  10. 面向教师的OBS直播速成教程

    引言 本文是面向教师讲述的如何使用OBS软件进行课程直播的速成教程. 本文配套视频链接如下️ 面向教师的OBS直播教学速成教程_哔哩哔哩_bilibili 环境准备 1. 下载对应本机系统版本的并安装 ...