读错题了有没有呀,原来 lamps 是在边上的呀,当成是在点上的了,无语。

直接一个dfs 就可以 从叶子节点开始,如果有必要转换 lamp 的状态则加一个仅包含 这个 lamp 的段

然后向上扩展,对于某个子树,根据扩展上来的段的个数,将偶数段进行合并(这是最优选择),然后可能剩

一个或者0个段没用上,再根据这个节点到父节点的lamp的状态进行分析是否要将剩下的段向上扩展。

直到根节点。

由于所给边的特殊性,可以直接遍历。

代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<set>
#include<map> #define ll long long
#define ull unsigned long long
using namespace std;
const int INF=0x3f3f3f3f;
/*
class TurnOnLamps
{
public:
int minimize(vector <int> r, string S, string I)
{
int x[100]={0};
int n=r.size();
int sum=0;
for(int i=n-1;i>=0;--i)
{
if(I[i]=='1')
{
if((S[i]=='0'&&x[i+1]==0)||(S[i]=='1'&&x[i+1]==1))
{
++sum;
x[i+1]^=1;
}
}
x[r[i]]^=x[i+1];
}
return (sum+1)/2;
}
};
*/
const int N=100;
int head[N],cnt;
struct node
{
int j,next;
int state,im;
}edge[N];
int dp[N];
int x[N];
void add(int i,int j,int state,int im)
{
edge[cnt].j=j;
edge[cnt].state=state;
edge[cnt].im=im;
head[i]=cnt++;
}
int dfs(int x,int S,int I)
{
int sum=0;
for(int t=head[x];t!=-1;t=edge[t].next)
{
sum+=dfs(edge[t].j,edge[t].state,edge[t].im);
}
dp[x]=sum/2;
int tmp=sum%2;
if(I==0)
return tmp;
else
{
if(S==1&&tmp==1)
{dp[x]+=1;return 0;}
if(S==1&&tmp==0)
return 0;
if(S==0&&tmp==0)
return 1;
if(S==0&&tmp==1)
return 1;
}
return 0;
}
class TurnOnLamps
{
public:
int minimize(vector <int> r, string S, string I)
{
memset(head,-1,sizeof(head));cnt=0;
for(unsigned int i=0;i<r.size();++i)
{
add(r[i],i+1,S[i]-48,I[i]-48);
}
int tmp=dfs(0,0,0);
for(unsigned int i=0;i<r.size()+1;++i)
tmp+=dp[i];
return tmp;
}
};

  

TopCoder SRM 583 TurnOnLamps的更多相关文章

  1. Topcoder SRM 583 DIV2 SwappingDigits

    题目题意是交换一次,使数字最小,且数字前面不能有前导0 string minNumber(string num) { string res = num; for(int i = 0 ; i < ...

  2. SRM 583 DIV1

    A 裸最短路. class TravelOnMars { public: int minTimes(vector <int>, int, int); }; vector<int> ...

  3. TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E

    传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...

  4. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  5. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  6. TopCoder SRM 667 Div.2题解

    概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...

  7. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  8. Topcoder Srm 673 Div2 1000 BearPermutations2

    \(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...

  9. Topcoder Srm 671 Div2 1000 BearDestroysDiv2

    \(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...

随机推荐

  1. Web缓存的作用与类型

    前言 Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本.缓存会根据进来的请求保存输出内容的副本:当下一个请求来到的时候,如果是相同的UR ...

  2. 使用js加载器动态加载外部Javascript文件

    原文:http://www.cnblogs.com/xdp-gacl/p/3927417.html 今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js var ...

  3. MyBatis——调用存储过程

    原文:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 ...

  4. D3.js 完整的柱形图

    一个完整的柱形图包含三部分:矩形.文字.坐标轴.制作一个实用的柱形图,内容包括:选择集.数据绑定.比例尺.坐标轴等内容. 1. 添加 SVG 画布 //画布大小 var width = 400; va ...

  5. Extjs中renderer:function函数用法

    renderer:function(value, cellmeta, record, rowIndex, columnIndex, store){ } 1.value是当前单元格的值 2.cellme ...

  6. ie、火狐、谷歌浏览器,光标定位问题

    IE:不管该行有没有文字,光标高度与font-size一致. FF:该行有文字时,光标高度与font-size一致.该行无文字时,光标高度与input的height一致. Chrome:该行无文字时, ...

  7. php中mysql数据库异步查询实现

    问题 通常一个web应用的性能瓶颈在数据库.因为,通常情况下php中mysql查询是串行的.也就是说,如果指定两条sql语句时,第二条sql语句会等到第一条sql语句执行完毕再去执行.这个时候,如果执 ...

  8. 抽象类中的抽象方法也是默认public的么(类似于interface)?

    测试下: public abstract class AbstractTest { abstract int printline(); } 在另一个package 设置 public class Ab ...

  9. JSP action elements - JavaBean

    语法 描述 jsp:include 在页面被请求的时候引入一个文件. jsp:useBean 寻找或者实例化一个JavaBean. jsp:setProperty 设置JavaBean的属性. jsp ...

  10. Cache模拟器(CacheSim)

     最近写了一个Cache的模拟器,由于平时空余时间比较分散,前前后后用了一周多的时间,基本实现的Cache的模拟功能(通过读取trace文件得到相应的命中率),能够实现直接映射.全相联.组相联三种 ...