【学习笔记】NOIP暴零赛3
博弈(game)
观察到博弈过程中胜负态不会发生改变,那么求出从每个棋子出发能走的最长链,然后背包即可。
复杂度O(nm)O(nm)O(nm)。
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int mod=998244353;
const int N=305;
int n,m,dp[N],in[N],g[N*N],g2[N*N],vis[N];
ll res;
string s;
queue<int>Q;
vector<int>ve[N];
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m>>s;for(int i=1;i<=m;i++){int u,v;cin>>u>>v,u--,v--;if(u>v)swap(u,v);ve[v].pb(u),in[u]++;}for(int i=0;i<n;i++)if(!in[i])Q.push(i);while(Q.size()){int u=Q.front();Q.pop();for(auto v:ve[u]){if(--in[v]==0)Q.push(v);if(s[u]==s[v])dp[v]=max(dp[v],dp[u]+1),vis[v]=1;else if(s[u]!=s[v]&&!vis[u]&&!dp[u])dp[v]=max(dp[v],1);}}g[0]=g2[0]=1;for(int i=0;i<n;i++){if(s[i]=='W'){for(int j=n*n;j>=dp[i];j--){g[j]=(g[j]+g[j-dp[i]])%mod;}}else{for(int j=n*n;j>=dp[i];j--){g2[j]=(g2[j]+g2[j-dp[i]])%mod;}}}for(int i=1;i<=n*n;i++){g2[i]=(g2[i-1]+g2[i])%mod;}for(int i=1;i<=n*n;i++){res=(res+(ll)g[i]*g2[i-1])%mod;}cout<<res;
}
排列 (perm)
神仙题。
考虑怎么转化这个性质。等价于,不能存在一个区间,里面同时存在(a,b),(b,c)(a,b),(b,c)(a,b),(b,c)而不存在(a,c)(a,c)(a,c)。
由此可以想到传递闭包:每个区间,如果建一个图,就都必须具有传递性。
然后我们发现,只需要每个前缀都有传递性,每个后缀都有传递性就好了。
不要问我怎么想到的,以及证明,国内谜语人太多了,可以去骂写题解的人
也就是说,任取一个iii,设GiG_iGi为考虑前iii条边组成的图,那么GiG_iGi和GiG_iGi的补图都有传递性。
有一个很神奇的结论:满足这样条件的GGG恰好有n!n!n!个,这是因为,任取一个排列ppp,如果a<ba<ba<b并且aaa在ppp中的位置在bbb的后面,那么连边(a,b)(a,b)(a,b),这样构造出来的图一定是满足传递性的,并且这是一个双射。
可能打表反而更实际一些
然后,最无脑的想法是,因为合法的前缀只有n!n!n!个,所以状态数只有O(n!)O(n!)O(n!),也就是说可以直接把整张图的每条边存起来,然后暴力转移。不过既然我们都知道这样的GGG和一个排列ppp构成双射了,那么在ppp中转移则显得合情合理,一个合法的GGG加入一条边(a,b)(a,b)(a,b)后仍然合法,当且仅当GGG对应的排列ppp中aaa恰好在bbb前面的位置,加入边(a,b)(a,b)(a,b)相当于是交换(a,b)(a,b)(a,b)的位置。
复杂度O(n!×n)O(n!\times n)O(n!×n)。
对不起代码咕掉了,因为感受到了出题人的恶意
另外,这题的想法也太聪明了吧。。。
考场上只写了20pts20pts20pts的暴搜,大概是因为被搞心态了所以没想到40pts40pts40pts的无脑状压dpdpdp,不过这种失分还是挺无语的
出题人你还是要有同理心啊
子段和 (seg)
放在t3t3t3其实还是比较水的。
直接用数据结构暴力维护就能做到O(n2logw)O(n^2\log w)O(n2logw),可以得到70pts70pts70pts。
然而没写对拍结果写炸了,警钟长鸣
接下来一步应该容易想到:对于max\maxmax相同的区间,我们每次要取出min\minmin最小的那一个,对于这个过程,我们可以用一个set\text{set}set来维护。考虑堆套set\text{set}set,堆里面每个元素维护区间max\maxmax相同的区间的集合,用set\text{set}set维护这些区间的最小值的位置。这里有一个比较巧妙的想法,就是把堆中的元素存在一个数组里,这样每次从堆中取元素时就不用把它复制一遍了。
复杂度O(nlogn)O(n\log n)O(nlogn)。
后来发现题解的思路确实更加聪明。
考虑给定kkk,怎么求g(k)g(k)g(k)呢,二分答案www,令aaa为给出序列的前缀和,a0=0a_0=0a0=0,每次操作就是对一段后缀−1-1−1,最后要使得∀i<j,aj−ai≤w\forall i<j,a_j-a_i\le w∀i<j,aj−ai≤w。
直接从前往后贪心,维护一个lim\text{lim}lim表示后面的aaa经过操作后都不能超过lim\text{lim}lim。如果ai>lima_i>\text{lim}ai>lim那么就在这里执行ai−lima_i-\text{lim}ai−lim次操作,得到新的aaa。然后令lim:=min(lim,ai+w)\text{lim}:=\min(\text{lim},a_i+w)lim:=min(lim,ai+w)。
正解非常脑洞。考虑直接把所有www的lim\text{lim}lim一起维护,设这个函数为L(w)L(w)L(w),另外维护A(w)A(w)A(w)表示目前的代价。剩下的就是用数据结构大力乱搞。
先贴一个70pts70pts70pts的代码吧。原谅我没有能力刚正解。
毕竟quack也说了这题到这里就差不多了。。。
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int mod=998244353;
int n,p[200005][20],p2[200005][20],Log[200005];
ll a[200005],s[200005],Min[200005][20],Max[200005][20],K,res,inv2=(mod+1)/2;
vector<pair<ll,ll>>v;
int qmin(int l,int r){int k=Log[r-l+1];return (Min[l][k]<Min[r-(1<<k)+1][k])?p[l][k]:p[r-(1<<k)+1][k];
}
int qmax(int l,int r){int k=Log[r-l+1];return (Max[l][k]>Max[r-(1<<k)+1][k])?p2[l][k]:p2[r-(1<<k)+1][k];
}
struct node{int l,r;ll S;bool operator <(const node &a)const{return s[qmax(l,r)]-S<s[qmax(a.l,a.r)]-a.S;}
};
priority_queue<node>q;
vector<node>vec;
ll Sum(ll l,ll r){l%=mod,r%=mod;return (r-l+1)*(l+r)%mod*inv2%mod;
}
void calc(ll &K,ll Max,ll x,ll y){if(K/x>=y){res+=Sum(Max-y+1,Max)*(x%mod)-y;res%=mod,K-=x*y;}else{res+=Sum(Max-K/x+1,Max)*(x%mod)-(K/x),res%=mod;Max-=K/x,K%=x,res+=(K%mod)*(Max%mod),res%=mod,K=0;}
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=2;i<=n;i++)Log[i]=Log[i/2]+1;for(int i=1;i<=n;i++){cin>>a[i],s[i]=max(s[i-1]+a[i],0ll),Min[i][0]=Max[i][0]=s[i],p[i][0]=p2[i][0]=i;}for(int j=1;j<20;j++){for(int i=1;i<=n-(1<<j)+1;i++){Min[i][j]=min(Min[i][j-1],Min[i+(1<<j-1)][j-1]),Max[i][j]=max(Max[i][j-1],Max[i+(1<<j-1)][j-1]);p[i][j]=(Min[i][j]==Min[i][j-1])?p[i][j-1]:p[i+(1<<j-1)][j-1],p2[i][j]=(Max[i][j]==Max[i][j-1])?p2[i][j-1]:p2[i+(1<<j-1)][j-1]; }}q.push({1,n,0});cin>>K;while(q.size()){ll MAX=s[qmax(q.top().l,q.top().r)]-q.top().S,S2(inf);vec.clear();if(!MAX)break;while(q.size()&&s[qmax(q.top().l,q.top().r)]-q.top().S==MAX){int l=q.top().l,r=q.top().r;ll S=q.top().S;q.pop();S2=min(S2,s[qmin(l,r)]-S),vec.pb({l,r,S});}if(q.size())S2=min(S2,MAX-(s[qmax(q.top().l,q.top().r)]-q.top().S));for(int i=0;i<vec.size();i++){int l=vec[i].l,r=vec[i].r,p=qmin(l,r);ll S=vec[i].S;if(s[p]-S-S2==0){if(p>l)q.push({l,p-1,S+S2});if(p<r)q.push({p+1,r,S+S2});}else q.push({l,r,S+S2});}calc(K,MAX,vec.size(),S2);if(!K)break;}if(K){for(int i=1;i<=n;i++)a[i]=min(a[i],0ll);sort(a+1,a+1+n),reverse(a+1,a+1+n);for(int i=2;i<=n;i++){calc(K,a[i-1],i-1,a[i-1]-a[i]);if(!K)break;}if(K){calc(K,a[n],n,inf);}}cout<<(res+mod)%mod;
}
相关文章:
【学习笔记】NOIP暴零赛3
博弈(game) 观察到博弈过程中胜负态不会发生改变,那么求出从每个棋子出发能走的最长链,然后背包即可。 复杂度O(nm)O(nm)O(nm)。 #include<bits/stdc.h> #define ll long long #define pb push_back using namespace std; const int mod9982443…...

Java JSR规范列表
Java JSR规范列表目录概述需求:设计思路实现思路分析1.JSR2.JSR方法3.web service4.Webservice:5.数据处理器拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,m…...

Java必备小知识点1
Java程序类型: Applications和AppletApplications:是指在计算机操作系统中运行的程序。是完整的程序,能独立运行。被编译后,用普通的Java解释器就可以使其边解释边执行。必定含有一个main方法,程序执行时,首先寻找main方法&#x…...
JavaScript作用域、闭包
文章目录作用域、作用域链作用域作用域链循环中的作用域自由变量、闭包自由变量闭包的定义、表现、应用如何确定在闭包中获取正确的变量总结作用域、作用域链 作用域 编程语言中存储、访问、修改变量当中的值是一项基本能力、存储变量、访问变量必须按照一定的规则࿰…...
JavaScript Date(日期) 对象
JavaScript Date 对象是 JavaScript 中用于处理日期和时间的内置对象。它可以用于获取当前时间、设置日期和时间、计算日期和时间之间的差异、以及将日期和时间格式化为各种字符串格式。在本文中,我们将详细介绍 JavaScript Date 对象的作用和在实际工作中的用途。 …...
rust过程宏 proc-macro-workshop解题-4-sorted
名字版本号rust1.69.0OSubuntu 22.04这一大关卡介绍的是属性式过程宏。 第一关:01-parse-enum 还是简单的看我们是否已经实现了一个属性式过程宏的空架子,如果有这个空架子,就直接通过了。 use proc_macro::TokenStream; use proc_macro2; use syn;#[proc_macro_attribut…...

数据结构与算法—队列
队列 队列介绍 有序列表,可以用数组或者链表实现。遵循先进先出原则。 数组实现队列 public class ArrayQueue {public static void main(String[] args) {ArrayQueue queue new ArrayQueue(3);// 接收用户输入char key ;Scanner sc new Scanner(System.in);…...

AcWing3416.时间显示——学习笔记
目录 题目 代码 AC结果 思路 关键步骤 题目 3416. 时间显示 - AcWing题库https://www.acwing.com/problem/content/description/3419/ 代码 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input new Scanner(System.in…...
贴吧手机端防删图GIF动态图制作解析
贴吧存活 思路技术运气 1:防删图不是存活的绝对因素,除了防删图,还有账号,ip,内容,吧的问题 2:一个图不是每个吧都可以发 3:一个贴不被删不仅仅看图片 4:有时候运气也很…...

iOS接入Google登录
1.在Google Cloud后台配置客户端ID 首先要在 Google Cloud 中创建一个项目。新创建的Project需要先配置同意屏幕。一共有4步骤需要配置。 1.OAuth 同意屏幕 User Type选择"外部"进行创建。填写必必要的信息,应用名称、用户支持电子邮件地址、开发者电子邮…...

【C语言】大小端字节序问题
一、大小端字节序问题 大小端是由CPU决定的,大小端可以理解为字节顺序,所以大小端全称叫大端字节序、小端字节序。其实大端、小端这两个词是从《格列佛游记》里出来的。《格列佛游记》有一段讲的是吃鸡蛋是从大的那头敲开还是小的那头敲开的问题…...

Linux | 网络通信 | 序列化和反序列化的讲解与实现
文章目录为什么要序列化?协议的实现服务端与客户端代码实现为什么要序列化? 由于默认对齐数的不同,不同的平台对相同数据进行内存对齐后,可能得到不同的数据。如果直接将这些数据进行网络传输,对方很可能无法正确的获…...

C#的委托原理刨析and事件原理刨析和两者的比较
什么是委托委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容参数和返回类型的方法进行绑定。 你可以通过委托实例调用方法。简单的理解,委托是方法的抽象类,它定…...

Redis学习【8】之Redis RDB持久化
文章目录Redis 持久化1 持久化基本原理2 RDB(Redis DataBase) 持久化2.1 持久化的执行2.2 手动 save 命令2.3 手动 bgsave 命令2.4 自动条件触发2.5 查看持久化时间3 RDB 优化配置3.1 save3.2 stop-write-on-bgsave-error3.3 rdbcompression3.4 rdbchecksum3.5 sanitize-dump-p…...

SpringSecurity认证
文章目录登陆校验流程依赖yaml实现建表、工具类、实体类加密器、AuthenticationManager登录逻辑登录过滤器、配置过滤器登出登陆校验流程 认证 登录: ①自定义登录接口 调用ProviderManager的方法进行认证 如果认证通过生成token,根据userId把用…...

Socket套接字
概念 Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。 分类 Socket套接字主要针对传输层协议划分为如下三类: 流套接字:使用传输层TCP…...

mysql详解之innoDB
索引 Mysql由索引组织,所以索引是mysql多重要概念之一。 聚簇索引 InnoDB和MyISAm一样都是采用B树结构,但不同点在于InnoDB是聚簇索引(或聚集索引),将数据行直接放在叶子节点后面。 这里可能存在一个误区࿱…...
电信运营商的新尝试:探索非通信领域的发展
近年来,随着电信运营商竞争的日趋激烈和网络建设的成本不断攀升,许多电信运营商已经开始缩减IT投资。然而,在如此情况下,电信运营商仍然需要寻找新的增长机会。那么,在持续缩减IT投资的情况下,电信运营商可…...

第07章_单行函数
第07章_单行函数 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经…...

Echarts实现多柱状图重叠重叠效果
有两种重叠效果: 1. 多个柱子重叠为一个 2. 多个柱子重叠为两组 第一种,图例: 这个灰色不是阴影哦, 是柱子. 1. 使用详解 (1) series.Z 折线图组件的所有图形的 z 值。控制图形的前后顺序。 z 值小的图形会被 z 值大的图形覆盖。z 相比 zlevel 优先级更低,而且不会…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...