Tasks - AtCoder Beginner Contest 295

这篇是超级抽象的简要tj,看不懂不要骂我这个蒟蒻QWQ

D - Three Days Ago (atcoder.jp)

\(f_i\)表示\([1,i]\)的所有数的奇偶情况,如果\(b\)有奇数个,那么\(f_i|=2^b\),特别的,\(f_0=0\),答案就是\(\sum\limits_{i=1}^n \sum\limits_{j=0}^{i-1} [f_j=f_i]\)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+5;
int n,f[N];
char s[N];
map<int,int> mp;
ll ans;
int main(){
scanf("%s",s+1);
n=strlen(s+1);
++mp[0];
for(int i=1;i<=n;++i) f[i]=f[i-1],f[i]^=(1<<(int)(s[i]-'0'));
for(int i=1;i<=n;++i) ans+=mp[f[i]],++mp[f[i]];
printf("%lld\n",ans); return 0;
}

E - Kth Number (atcoder.jp)

最后的答案为\(\sum\limits_{i=1}^m i*\{i作为A_k的概率\}\),就相当于求\(\sum\limits_{i=1}^m \{A_k\geq i的概率\}\)

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+5,MOD=998244353;
int n,m,k,a[N],C[N][N],ans,p[N],q[N];
void Init(){
for(int i=0;i<=n;++i){
C[i][0]=1;
for(int j=1;j<=i;++j) C[i][j]=(1ll*C[i-1][j]+1ll*C[i-1][j-1])%MOD;
}
}
int power(int x,int y){
int ans=1;
for(;y;y>>=1,x=1ll*x*x%MOD) if(y&1) ans=1ll*ans*x%MOD;
return ans;
}
int main(){
scanf("%d%d%d",&n,&m,&k),Init();
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=m;++i){
int nd=n+1-k,cnt=0;
for(int j=1;j<=n;++j) nd-=(a[j]>=i),cnt+=(!a[j]);
if(nd<0||nd>cnt){
if(nd<0) ans=(ans+1ll)%MOD;
continue;
}
int pp=1ll*(m-i+1)*power(m,MOD-2)%MOD,qq=(MOD+1-pp)%MOD;
p[0]=q[0]=1;
for(int j=1;j<=cnt;++j) p[j]=1ll*p[j-1]*pp%MOD,q[j]=1ll*q[j-1]*qq%MOD;
for(int j=nd;j<=cnt;++j) ans=(1ll*ans+1ll*C[cnt][j]*p[j]%MOD*q[cnt-j]%MOD)%MOD;
}
printf("%d",ans);
return 0;
}

F - substr = S (atcoder.jp)

答案肯定是\(ask(r)-ask(l-1)\)

枚举\(S\)处于当前数字的位置,如果现在给一个排名\(k\),那么我们就可以根据这个排名得出当前数字应该是多少

所以考虑\(S\)所处的位置下的最大排名,也就是最大个数,最后答案就是所有位置下的个数的和

#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int l,r,pw[20];
int ask(int i,int k,string s){
int a=s.size(),b=k-a+1;
if(b<0) return -1;
--i;
if(s[0]=='0') i+=pw[b];
int x=i/pw[b],y=i%pw[b];
return x*pw[k+1]+stoll(s)*pw[b]+y;
}
int ans;
int solve(int x,string s){
ans=0;
for(int k=0;k<=15;++k){
int t=ask(1,k,s);
if(t==-1||t>x) continue;
int l=0,r=pw[16-s.size()],mid;
while(l<r){
mid=l+r+1>>1;
if(ask(mid,k,s)>x) r=mid-1;
else l=mid;
}
ans+=r;
}
return ans;
}
signed main(){
int T; scanf("%lld",&T);
pw[0]=1; for(int i=1;i<=17;++i) pw[i]=pw[i-1]*10;
while(T--){
cin>>s>>l>>r;
printf("%lld\n",solve(r,s)-solve(l-1,s));
}
return 0;
}

G - Minimum Reachable City (atcoder.jp)

可以发现,连了一条边过后会构成一个环,环上的点在一条链上,并且环上所有点的答案都跟新为这个环上深度最浅的点的答案

所以自然而然就想到并查集,也就是将环上所有点都连向最浅的点,因为环上的点一定在一条链上,所以如果下次构成的环经过了这个环的点,那么就可以直接跳过这些点,跳到这个环上所有的点的指向的点\(x\)上去,此时,要么下次构成的环的最高的点\(y\)也指向\(x\),这个就不用管;要么就是\(x\)指向\(y\)。

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=2e5+5;
int n;
vector<int> edge[N];
int ans[N],fa[N],fr[N];
void dfs(int u){
ans[u]=u,fa[u]=u;
for(auto v:edge[u]){
dfs(v);
ans[u]=min(ans[u],ans[v]);
}
}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main(){
scanf("%d",&n);
for(int i=2,u,v;i<=n;++i) scanf("%d",&fr[i]),edge[fr[i]].pb(i);
dfs(1);
int q,op,u,v; scanf("%d",&q);
while(q--){
scanf("%d%d",&op,&u);
if(op==1){
scanf("%d",&v),v=find(v);
while(u!=v){
u=find(u);
if(u==v) continue;
fa[u]=v,u=fr[u];
}
}else printf("%d\n",ans[find(u)]);
} return 0;
}

ABC295(D~G)的更多相关文章

  1. 在Windows/Ubuntu下安装OpenGL环境(GLUT/freeglut)与跨平台编译(mingw/g++)

    GLUT/freeglut 是什么? OpenGL 和它们有什么关系? OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用.如果需要在程序里直接使用OpenGL, ...

  2. visual studio code(vs code) 编译、运行、调试程序(调用g++)

    g++的安装过程忽略,记不清有没有"安装路径不能有空格"这种问题. 网上翻了几个博客,找到的配置文件在g++下都不能运行,遂折腾. 安装vscode与插件 插件为ms-vscode ...

  3. MySQL 5.7 虚拟列 (virtual columns)

    参考资料: Generated Columns in MySQL 5.7.5 MySQL 5.7新特性之Generated Column(函数索引) MySQL 5.7原生JSON格式支持 Gener ...

  4. Flash制作遇到的小问题1--为何变形需要将图形打散(Ctrl+b)

    今天上Flash实验课遇到一个小问题,就是我在画一个矩形如下图:

  5. vim 命令学习(基础篇)

    [1]三种模式 vi的三种模式:命令模式.末行模式.编辑模式. 三种模式相互切换逻辑与命令图: 1.命令模式是vi的默认模式(即每打开一个文件时的初始模式). 2.命令模式切换至末行模式,末行模式切换 ...

  6. CSS布局解决方案(终结版)

    作者:无悔铭 https://segmentfault.com/a/1190000013565024 前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环.在页面框架的搭建之中,又有居中布局.多 ...

  7. MySQL 5.7 虚拟列 (virtual columns)(转)

    原文地址:https://www.cnblogs.com/raichen/p/5227449.html 参考资料: Generated Columns in MySQL 5.7.5 MySQL 5.7 ...

  8. Vim 命令、操作、快捷键(收藏大全)

    ------ 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filenam ...

  9. Chapter05 流程控制(Process Control)

    目录 Chapter05 流程控制 5.1 顺序控制 5.2 分支控制 if-else 单分支基本语法: 双分支基础语法: 多分支基础语法 5.3 嵌套分支 5.4 switch分支结构 5.5 Fo ...

  10. G - RPG的错排(错排)

    Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿 ...

随机推荐

  1. Redis 原理 - Hash

    Hash 数据结构 使用 ziplist 当同时满足下面两个条件时,使用 ziplist 存储数据 元素个数少于512个 (hash-max-ziplist-entries: 512) 每个元素长度小 ...

  2. 爆肝 1 周,为我的白板工具支持了 mermaid 流程图,为 ai 生成流程图铺平道路

    朋友们好,前一段时间在博客园推荐了我的白板工具 Drawnix,得到了很多朋友的支持,非常感谢,最近 Drawnix 又有了一些重要更新,其中最实用的应该是支持 mermaid 语法的流程图了. 这是 ...

  3. Java8 Lambda Collection 的常见用法

    import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.huto ...

  4. ESP32+Arduino入门(四):OLED屏随机显示古诗

    前言 我觉得去做一些简单又好玩的案例是入门很好的选择. 在实践的过程中会碰到很多需求很多问题在解决这些需求这些问题的过程就是在学习的过程. 今天我来分享一个随机显示古诗的案例,如果对此感兴趣可以跟我一 ...

  5. surging 集成SuperSocket预发布版本2.0

    一.概述 周末在家试着扩展SuperSocket,因为之前都是只支持.net framework, 后面出现支持.NET CORE 的SuperSocket 2.0 ,然后集成进来和dotnetty ...

  6. ​.NET AI Preview 2 发布:支持 Aspire 与 Qdrant 向量库集成,加速云原生 AI 开发​

    引言 随着人工智能(AI)技术的迅猛发展,开发者对简单.高效的AI开发工具需求日益增加.微软 .NET 团队最近发布了 .NET AI 模板的 Preview 2 版本,这一更新为开发者带来了诸多令人 ...

  7. CSS 魔法与布局技巧

    CSS 布局与视觉效果常用实践指南 在我一篇随笔中其实有说到十大布局,里面有提到 flex 布局.grid 布局.响应式布局,不过没有提到容器查询这个,现在说下这三个布局然后穿插下容器查询把. 1️⃣ ...

  8. Font Awesome文档使用手册

    Font Awesome 字体为您提供可缩放矢量图标,它可以被定制大小.颜色.阴影以及任何可以用CSS的样式. 使用文档:https://fa4.uihtm.com/ Font Awesome 是一套 ...

  9. 开源PDF处理工具——Ghostscript的安装和使用

    1. 安装 Ghostscript Windows 下载 Ghostscript: 官网:https://www.ghostscript.com/download/gsdnld.html 选择适合你的 ...

  10. C#网络编程(四)----HttpClient

    简介 HttpClient是C#中用于发送/接收HTTP请求的核心类,属于 System.Net.Http 命名空间.它是 .NET 中处理网络通信的现代 API,设计目标是替代早期的 WebClie ...