codeforces 453C Little Pony and Summer Sun Celebration

codeforces 453C Little Pony and Summer Sun Celebration

这道题很有意思,虽然网上题解很多了,但是我还是想存档一下我的理解。

题意可以这样转换:初始所有点有 \(01\) 状态,每经过一次状态就翻转,求一条路径使得最后状态全 \(1\)

以某个状态 \(1\) 的点开始,搜出它的dfs序。dfs序的长度必定是 \(2n-1\)(因为dfs树有 \(n-1\) 条边,每条边遍历两次)。我们把这个dfs序列存在数组 \(res[0..2n-2]\) 中。当遍历到 \(res[i]\) 时,如果 \(res[i-1]\) 的状态是 \(1\),并且以后不会再遍历到 \(res[i-1]\),那么我们可以在原序列(\(...->res[i-1]->res[i]->...\))的基础上再加上 \(->res[i-1]->res[i]->\)(新序列 \(...->res[i-1]->res[i]->\)res[i-1]->res[i]\(->...\))。最后如果 \(res[2n-2]\) 状态是 \(1\),从序列中删除即可。

基于这种构造方法,最后序列的长度范围在 \([2n-1, 4n-1]\)。(比dfs序列最多多 \(2n\) 个)

以下代码有两种实现方式,一种是先把dfs序搜出来再做,一种是dfs过程中直接求出最终序列。

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;const int N=101010;
int n,m;
int a[N];
vi res, ans;
vi g[N];
bool vis[N], la[N<<1];void dfs(int u,int fa) {res.pb(u);vis[u]=1;rep(i,0,sz(g[u])) {int v=g[u][i];if(v==fa||vis[v]) continue;dfs(v, u);res.pb(u);}
}inline void upd(int u) {ans.pb(u);a[u]^=1;
}inline void print() {rep(i,1,n+1) if(a[i]) {puts("-1");return ;}printf("%d\n",sz(ans));rep(i,0,sz(ans)) printf("%d%c",ans[i]," \n"[i==sz(ans)-1]);
}int main() {while(~scanf("%d%d",&n,&m)) {///initrep(i,0,n+1) g[i].clear();res.clear();ans.clear();memset(la,0,sizeof(la));///readrep(i,0,m) {int u,v;scanf("%d%d",&u,&v);g[u].pb(v);g[v].pb(u);}rep(i,1,n+1) scanf("%d",a+i);///solvememset(vis,0,sizeof(vis));rep(i,1,n+1) if(a[i]) {dfs(i, i);break;}memset(vis,0,sizeof(vis));for(int i=sz(res)-1;~i;--i) if(!vis[res[i]]) {vis[res[i]]=1;la[i]=1;}rep(i,0,sz(res)) {int u=res[i];upd(u);if(i&&a[res[i-1]]&&la[i-1]) {upd(res[i-1]);upd(u);}}if(sz(ans)&&a[ans[sz(ans)-1]]) a[ans[sz(ans)-1]]=0, ans.pop_back();print();}return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;const int N=101010;
int n,m;
int a[N];
vi ans;
vi g[N];
bool vis[N], la[N<<1];inline void upd(int u) {ans.pb(u);a[u]^=1;
}void dfs(int u,int fa) {upd(u);vis[u]=1;rep(i,0,sz(g[u])) {int v=g[u][i];if(v==fa||vis[v]) continue;dfs(v, u);upd(u);if(a[v]) {upd(v);upd(u);}}
}inline void print() {rep(i,1,n+1) if(a[i]) {puts("-1");return ;}printf("%d\n",sz(ans));rep(i,0,sz(ans)) printf("%d%c",ans[i]," \n"[i==sz(ans)-1]);
}int main() {while(~scanf("%d%d",&n,&m)) {///initrep(i,0,n+1) g[i].clear();ans.clear();memset(la,0,sizeof(la));memset(vis,0,sizeof(vis));///readrep(i,0,m) {int u,v;scanf("%d%d",&u,&v);g[u].pb(v);g[v].pb(u);}rep(i,1,n+1) scanf("%d",a+i);///solverep(i,1,n+1) if(a[i]) {dfs(i, i);break;}if(sz(ans)&&a[ans[sz(ans)-1]]) a[ans[sz(ans)-1]]=0, ans.pop_back();print();}return 0;
}

转载于:https://www.cnblogs.com/wuyuanyuan/p/8675210.html

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

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

相关文章

MongoDB无法注册windows服务问题解决 Error connecting to the Service Control Manager: 拒绝访问 Mongodb M

发现在mongodb.log里出现 2017-07-07T17:01:55.3390800 I CONTROL [main] Error connecting to the Service Control Manager: 拒绝访问。 (5) 错误 1.检查mongodb.conf配置内容是否有误. 2.cmd需要以管理员方式启动(c盘system32下cmd.exe). 3.执行mongod.exe --bind_ip 1…

保存图片验证码到redis数据库

def get_image_code(image_code_id): # 1 实用工具类生成验证码 name, text, image_data captcha.generate_captcha() #将验证码的数据和编号存储到 redis 中 try: #redis_store.set() 设置数据 #redis_store.expires()设置有效期 #setex&#xff1a;设置数据的同时设置有效期…

Eclipse项目无错误但是有红叉问题解决

这个问题可以从两方面下手。 1.是项目右键 ->properties ->java buildpath 解决里面的红叉问题。 2.就是项目.classpth文件问题解决 首先window ->show view-> other ->找到problem 如果是 The project cannot be built until build path errors are resol…

批量处理JDBC语句提高处理速度

当需要成批插入或者更新记录时。可以采用Java的批量更新机制&#xff0c;这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率JDBC的批量处理语句包括下面两个方法&#xff1a;– addBatch(String)&#xff1a;添加需要批量处理的SQL语句或…

TCP close_wait内幕

最近调试时遇到一个tcp连接 一发交易server端就从es连接状态变成close_wait状态的问题。 tcp连接需要三次握手&#xff0c;而被动关闭连接则是需要四次握手的&#xff0c;不能说单方面关闭连接就是成功关闭连接了。 首先我们要搞清楚close_wait出现的机制和原理。 close_wai…

p-value

p-value p-value翻译为假定值&#xff0c;假设几率。我们在生物信息中通常使用p值方法&#xff08;P-Value, Probability, Pr&#xff09;来做检验。那么p-value是什么呢&#xff1f;其实P-value就是一种概率&#xff0c;表示在原假设为真的前提下出现观察样本以及更极端情况的…

webstorm激活

2018-12-20(最新可用&#xff0c;选中间的activetion code)&#xff1a; 前提&#xff1a;修改本地的hosts配置文件&#xff08;/etc/hosts&#xff09; 最后一行新增这句话&#xff1a;0.0.0.0 account.jetbrains.com 然后去 http://idea.lanyus.com/ 这个网站生成一个激活码…

面向对象初调用:foolish 电梯

本周我们完成的任务是傻瓜电梯的调度&#xff0c;对于那十分十分详细的指导书&#xff0c;我感觉想要说明白题目要求&#xff0c;是做不到的&#xff0c;所以就把指导书贴出来给大家看了&#xff0c;&#xff0c;由于在下还不会网页制作&#xff0c;只能通过百度网盘了&#xf…

Studio 3T更改使用时间破解免费使用方式(转,可以使用)

echo off ECHO 重置Studio 3T的使用日期...... FOR /f "tokens1,2,* " %%i IN (reg query "HKEY_CURRENT_USER\Software\JavaSoft\Prefs\3t\mongochef\enterprise" ^| find /V "installation" ^| find /V "HKEY") DO ECHO yes | reg a…

Maven学习之(一)基本配置

安装maven还几次没成功&#xff0c;不过最后还是查资料成功了&#xff0c;所以记录一下。 1.安装JDK&#xff0c;比较简单&#xff0c;就不说明了。 2.配置java的环境变量 JAVA_HOME &#xff08;最开始因为java配置成C:\Program Files (x86)\Java\jdk1.8.0_144\bin 所以出问题…

Rabbitmq java.util.concurrent.TimeoutException小问题解决

最近在研究rabbitmq的各个工作模式时。 出现了一个rabbitmq java.util.concurrent.TimeoutException异常 java.util.concurrent.TimeoutExceptionat com.rabbitmq.utility.BlockingCell.get(BlockingCell.java:77)at com.rabbitmq.utility.BlockingCell.uninterruptibleGet(B…

个人服务器

1、用yum install 安装太方便了&#xff0c;不用考虑依赖 yum install java yum install mysql yum install tomcat 一下子就搞定了。 安装好mysql好像并不能启动&#xff0c;还要yum install mariadb-server -y 具体看&#xff1a;https://blog.csdn.net/lixingdefeng…

org.hibernate.QueryTimeoutException: Could not execute JDBC batch update问题解决(转)

这个bug的原因就是 在插入数据操作时 插入字段的长度 超出了数据库表设计时的该字段长度 导致的这个异常 解决办法&#xff1a; 1.减短字段长度 2.增加字段长度限制 例&#xff1a;alter table table_name modify column_name varchar(50); 转&#xff1a;https://blo…

Neither BindingResult nor plain target object for bean name 'xxx' availabl问题解决

明明已经按网上进行处理了为什么还是这个异常呢&#xff1f; 解决方法&#xff1a; 1.<form:form modelAttribute"user" 标签内绑定页面传来的数据。 2.在页面上加上 <jsp:useBean id"command" class"com.mvc.domain.BlogForm" scope&q…

JS中Date.parse()和Date.UTC()返回值不一致

Date.parse() 方法解析一个表示某个日期的字符串&#xff0c;并返回从1970-1-1 00:00:00 UTC 到该日期对象&#xff08;该日期对象的UTC时间&#xff09;的毫秒数&#xff0c;如果该字符串无法识别&#xff0c;或者一些情况下&#xff0c;包含了不合法的日期数值&#xff08;如…

浅学习使用Ribbon 和 Feign的理解和使用

Ribbon是Netflix公司开源的一个负载均衡的项目,是一个基于 HTTP、TCP的客户端负载均衡器. 什么是负载均衡? 负载均衡是微服务架构中必须使用的技术&#xff0c;通过负载均衡来实现系统的高可用、集群扩容等功能。负载均衡可通过 硬件设备及软件来实现&#xff0c;硬件比如&am…

OSI七层协议模型

OSI七层协议模型 1. OSI七层和TCP/IP四层的关系 OSI引入了服务、接口、协议、分层的概念&#xff0c;TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。OSI先有模型&#xff0c;后有协议&#xff0c;先有标准&#xff0c;后进行实践&#xff1b;而TCP/IP则相反&#xff0c;先有协议和…

Centos启动卡住,starting auditd: [failed]

具体原因可能是什么权限导致的吧 &#xff0c;母鸡啊 解决方式&#xff1a; 在重启客户端时输入 i 然后输入 a &#xff0c;在<_root KEYBOARDTYPEpc KEYTABLEus rd_NO_DM后空格输入 single再 enter就进入了

FPGA中计数器设计探索

FPGA中计数器设计探索&#xff0c;以计数器为32位为例&#xff1a; 第一种方式&#xff0c;直接定义32位计数器。 reg [31:0]count; quartus ii 下的编译&#xff0c;资源消耗情况。 85C模型下的时钟频率。 0C模型下的时钟频率。 chip planner下资源分布情况。 第二种方式&…

存储过程存储函数得简记(转)

oracle中的存储过程和存储函数的区别&#xff08;尊重劳动成果&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/qq_39778516/article/details/84033710 consistencely的博客&#xff09; 1.存储过程 存储过程&#xff08;Stored Procedure&#xff09;是在大型数…