CF Edu Round 174 题解合集

news/2025/2/21 20:18:09/文章来源:https://www.cnblogs.com/Kenma/p/18725765

here.

E 先咕了,不知道贪心怎么假的。

C

考虑最终合法的字符串,形如:

\[1,2,2,2,\cdots,2,2,2,3 \]

然后考虑对于每对 \(1,3\) 对答案的贡献是,它们中间 \(2\) 的个数,记为 \(cnt\)\(2^{cnt}-1\)

然后考虑从左往右扫,每次遇到 \(1\) 往 ds 里加入一个 \(1\),遇到 \(2\) 全局乘 \(2\),遇到 \(3\) 计算答案。

可以用线段树维护,复杂度 \(O(n \log n)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
int t,n,a[200005],cnt,ans;
int val[400005],tag[400005],ls[400005],rs[400005],dcnt,rt;
void pushup(int x){val[x]=(val[ls[x]]+val[rs[x]])%mod;
}
void pushdown(int x){if(tag[x]==1) return;val[ls[x]]=val[ls[x]]*tag[x]%mod;val[rs[x]]=val[rs[x]]*tag[x]%mod;tag[ls[x]]=tag[ls[x]]*tag[x]%mod;tag[rs[x]]=tag[rs[x]]*tag[x]%mod;tag[x]=1;
}
void build(int l,int r,int &x){x=++dcnt;if(l==r) return;int mid=(l+r)>>1;build(l,mid,ls[x]);build(mid+1,r,rs[x]);pushup(x);
}
void modify1(int l,int r,int pos,int k,int x){if(l==r){val[x]=k;return;}int mid=(l+r)>>1;pushdown(x);if(pos<=mid) modify1(l,mid,pos,k,ls[x]);else modify1(mid+1,r,pos,k,rs[x]);pushup(x); 
}
void modify2(int l,int r,int ql,int qr,int k,int x){if(ql<=l && r<=qr){val[x]=val[x]*k%mod;tag[x]=tag[x]*k%mod;return;}pushdown(x);int mid=(l+r)>>1;if(ql<=mid) modify2(l,mid,ql,qr,k,ls[x]);if(qr>=mid+1) modify2(mid+1,r,ql,qr,k,rs[x]);pushup(x);
}
int query(int l,int r,int ql,int qr,int x){if(ql<=l && r<=qr) return val[x];pushdown(x);int mid=(l+r)>>1,ans=0;if(ql<=mid) ans=(ans+query(l,mid,ql,qr,ls[x]))%mod;if(qr>=mid+1) ans=(ans+query(mid+1,r,ql,qr,rs[x]))%mod;return ans;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>t;while(t--){cin>>n;build(1,n,rt);for(int i=1;i<=n;i++){cin>>a[i];if(a[i]==1){modify1(1,n,i,1,rt);cnt++;}else if(a[i]==2){modify2(1,n,1,i,2,rt);}else{ans=(ans+query(1,n,1,i,rt)-cnt+mod)%mod;}}cout<<ans<<'\n';ans=0;for(int i=1;i<=dcnt;i++){val[i]=tag[i]=ls[i]=rs[i]=0;}dcnt=cnt=0;}
}

D

考虑将两边相等的字符去掉之后,需要翻转的子串是一个前缀或者后缀。

然后就可以二分检查合法性了。

复杂度 \(O(n \log n)\)

#include <bits/stdc++.h>
using namespace std;
int main() {int t;cin >> t;while (t--) {string s;cin >> s;int n = s.size();int i = 0;while (i < n / 2 && s[i] == s[n - i - 1]) ++i;n -= 2 * i;s = s.substr(i, n);int ans = n;for (int z = 0; z < 2; ++z) {int l = 0, r = n;while (l <= r) {int m = (l + r) / 2;vector<int> cnt(26);for (int i = 0; i < m; ++i)cnt[s[i] - 'a']++;bool ok = true;for (int i = 0; i < min(n / 2, n - m); ++i) {char c = s[n - i - 1];if (i < m) {ok &= cnt[c - 'a'] > 0;cnt[c - 'a']--;} else {ok &= (c == s[i]);}}for (auto x : cnt)ok &= (x % 2 == 0);if (ok) {r = m - 1;} else {l = m + 1;}}ans = min(ans, r + 1); reverse(s.begin(), s.end());}cout << ans << '\n';}
}

F

考虑每一个时刻,答案为 \(A\) 的连通块数量 与 \(A \cup B\) 的连通块之差。

然后直接上线段树分治 + 可撤销并查集算就行了。

复杂度 \(O(n \log n \alpha(n))\)

常数巨大。

#include<bits/stdc++.h>
#define int long long
using namespace std;
char op;
int n,m,x,y,id,cnt[3],ans[3][400005];
map<int,int> mp[2];
struct node{int x,y;
};
vector<node> v[800005][3];
struct line{int x,y,fa,siz;
};
stack<line> s[3];
int ls[800005],rs[800005],dcnt,rt;
void build(int l,int r,int &x){x=++dcnt;if(l==r) return;int mid=(l+r)>>1;build(l,mid,ls[x]);build(mid+1,r,rs[x]);
}
void modify(int l,int r,int ql,int qr,int u,int y,int op,int x){if(ql<=l && r<=qr){v[x][op].push_back((node){u,y});return;}int mid=(l+r)>>1;if(ql<=mid) modify(l,mid,ql,qr,u,y,op,ls[x]);if(qr>=mid+1) modify(mid+1,r,ql,qr,u,y,op,rs[x]);
}
int fa[3][400005],siz[3][400005];
void init(){for(int i=1;i<=n;i++){fa[0][i]=i;fa[1][i]=i;fa[2][i]=i;siz[0][i]=1;siz[1][i]=1;siz[2][i]=1;}
}
int find(int op,int x){if(fa[op][x]==x) return x;else return find(op,fa[op][x]);
}
void merge(int op,int x,int y){x=find(op,x);y=find(op,y);if(x==y) return;if(siz[op][x]>siz[op][y]) swap(x,y);s[op].push((line){x,y,fa[op][x],siz[op][y]});fa[op][x]=y;siz[op][y]+=siz[op][x];cnt[op]--;
}
void dfs(int l,int r,int op,int x){int now=s[op].size();for(int i=0;i<v[x][op].size();i++){merge(op,v[x][op][i].x,v[x][op][i].y);}if(l==r){ans[op][l]=cnt[op];}else{int mid=(l+r)>>1; dfs(l,mid,op,ls[x]);dfs(mid+1,r,op,rs[x]);}while(s[op].size()!=now){fa[op][s[op].top().x]=s[op].top().fa;siz[op][s[op].top().y]=s[op].top().siz;s[op].pop();cnt[op]++;}
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;cnt[0]=cnt[1]=cnt[2]=n;build(1,m,rt);init();for(int i=1;i<=m;i++){cin>>op>>x>>y;if(x>y) swap(x,y);int id=x*(n+1)+y; if(op=='A'){if(mp[0][id]){modify(1,m,mp[0][id],i-1,x,y,0,rt);modify(1,m,mp[0][id],i-1,x,y,2,rt);mp[0].erase(id);}else{mp[0][id]=i;}}else{if(mp[1][id]){modify(1,m,mp[1][id],i-1,x,y,1,rt);modify(1,m,mp[1][id],i-1,x,y,2,rt);mp[1].erase(id);}else{mp[1][id]=i; }}}for(map<int,int>::iterator it=mp[0].begin();it!=mp[0].end();it++){x=it->first/(n+1);y=it->first%(n+1);modify(1,m,it->second,m,x,y,0,rt);modify(1,m,it->second,m,x,y,2,rt);}for(map<int,int>::iterator it=mp[1].begin();it!=mp[1].end();it++){x=it->first/(n+1);y=it->first%(n+1);modify(1,m,it->second,m,x,y,1,rt);modify(1,m,it->second,m,x,y,2,rt);}dfs(1,m,0,rt);dfs(1,m,1,rt);dfs(1,m,2,rt);for(int i=1;i<=m;i++){cout<<ans[0][i]-ans[2][i]<<'\n';} return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887029.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NocoBase 本周更新汇总:支持全局和批量数据触发自定义操作事件

本周更新包括:支持全局和批量数据触发自定义操作事件,支持数据表预置字段扩展等。汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括的版本更新包括三个分支:main ,next和 develop。main :截止目前最稳定的版本,推荐安装此版本。 next:包含…

如何解决远程运维文件传输过程中,面临的安全与效率难题?

堡垒机是一种位于特定网络环境中,用于保障网络和数据安全的设备或系统。它通过集中管理和控制所有远程访问请求,确保每一次操作都经过严格的认证和授权。当用户采用堡垒机开展远程运维和远程访问控制时,需要将安装包、升级包、脚本、工具软件等文件资源,从外部非受控区转移…

20250220

1. 橡胶参考昨晚策略 市场休息 我们也休息。 2. 花生有个多5浪的机会

跨网文件传输的安全性如何保障?5大防护策略在这里

一、跨网文件传输的安全风险有哪些? 1、数据泄露风险 跨网数据交换时,敏感信息可能会在没有足够保护的情况下被泄露,尤其是在内网向外网传输(出网)和外网向内网传输(入网)的过程中。内部人员可能因为疏忽或恶意行为导致数据泄露,跨网数据交换系统需要能够有效防止内部泄…

Oracle-行结构转化为列结构

转换前:转换后: SQL语句:SELECT JX,ZPX,NUM FROM TABLE UNPIVOT(NUMFOR zpxIN (A AS 1,B AS 2,C AS 3)) ORDER BY JX, ZPX;

为什么Raft算法是分布式系统的首选?

背景 当今的数据中心和应用程序在高度动态的环境中运行,为了应对高度动态的环境,它们通过额外的服务器进行横向扩展,并且根据需求进行扩展和收缩。同时,服务器和网络故障也很常见。 因此,系统必须在正常操作期间处理服务器的上下线。它们必须对变故做出反应并在几秒钟内自…

深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异

深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异数据库统计信息的作用 在数据库系统中,查询优化在决定应用程序性能方面起着至关重要的作用。 高效的查询依赖于最新的数据库统计信息,这些统计信息帮助数据库的查询优化器选择最佳的执行计划。在PostgreSQL和M…

SynchronousQueue底层实现原理剖

一、SynchronousQueue底层实现原理剖 SynchronousQueue(同步移交队列),队列长度为0。作用就是一个线程往队列放数据的时候,必须等待另一个线程从队列中取走数据。同样,从队列中取数据的时候,必须等待另一个线程往队列中放数据 二、SynchronousQueue用法 先看一个Synchron…

[2025.2.18 JavaWeb学习]Mybatis

入门MyBatis是一款优秀的持久层(dao)框架,用于简化JDBC的开发 使用:IDEA创建SpringBoot模块,而后勾选MySQL Driver和MyBatis Framework pom.xml引入了mybatis-spring-boot-starter起步依赖、com.mysql依赖包、org.springframework.boot单元测试依赖 pojo中,创建实体对象,…

ROS2-PX4学习笔记

搞点小研究,欢迎对ROS2、PX4感兴趣的同学浏览。希望Mujica能好起来。ROS2-PX4学习笔记 前言 做毕设其实是个有点痛苦的过程。 毕竟所有东西都得现学,然后探索,时间又有限。 研究没接触过的新东西,总会失败,没有产出,搞久了人难受。 所以还是写一点东西吧。 我挺想把这个坑…

MessagePipe 中文文档

MessagePipe 是一个专为 .NET 和 Unity 设计的高性能内存/分布式消息管道。支持所有 Pub/Sub 场景、CQRS 中介模式、Prism 的 EventAggregator(视图与视图模型解耦)、IPC(进程间通信)-RPC 等。MessagePipeMessagePipe 是一个专为 .NET 和 Unity 设计的高性能内存/分布式消息…

Avalonia系列文章之样式与主题

随着社会的发展,大家对软件的要求,从最初的命令行输入输出,到可视化输入输出,如报表,图表等;从最初的可用性,稳定性为主,到现代软件理念中的便捷易用性转变,在保证稳定可用外,对软件的交互易用要求越来越高,而这些则离不开UI设计以及样式的应用。今天以一些简单的小…