[ZOJ Monthly, February 2012 Problem J Gao the Variable][ZOJ 3579] Solution

=.=鉴于昨天ZOJ月赛我的题坑了不少神牛,于是发发solution。

【题目大意】

给定n个变量,m个约束关系,p个得分规则,问在满足约束关系的前提下最多能得多少分。

n个变量的值只能为0或1

m个约束关系有a or b = x , a and b = x , a xor b = x三种类型

p个得分规则的形式为:(i,x,j,y,w),分别表示第i个变量值为x,第j个变量值为y,则可以得到w的分数。最终得分为所有得分之和。

1<=n,m<=100 1<=p<=5000

 

【标程解法】

只关注n个变量和m个约束关系,那么显然是一个2-sat的模型,但是加入得分规则以后,瞬间就变成了NPC。

于是就搜它…T_T

先对2-sat那个图(不知道怎么搞的看这里http://hi.baidu.com/edwardmj/blog/item/13faf30338fb2a057bec2c81.html)求个传递闭包。

然后顺手按强连通缩下点。强调一下2-sat那个图里一条边(x,y)的意思是如果选了x,那么一定要选y。

题目保证有解,那么我们只考虑有解的情况。

定义:我们称两个缩后的点A,B间有冲突,当且仅当存在var_i∈A,且var_i’∈B

先来证明一个东西:如果这个2-sat存在解,那么只要保证选择的每一步不会构成矛盾(就是说每次新选进一个缩后的点,此点均不和任何已选的点有冲突),并且选到不能选为止,则最终选出的缩后点集里,一定包含n个缩前的点,且这些点间互不冲突。

也就是说,只要每次都不矛盾,一定能选满所有变量从而得出一组解。

证明如下:

会造成选不满的情形只可能是var_i和var_i’都和已选的点冲突了。也就是说像这样(图中把已经放入已选集合的点标为红色):

我们回忆一下2-sat里面一条边的意义:(x,y) -> 选了x,那么一定要选y。因为我先作了传递闭包,所以根据图中的逻辑关系,可以想象必然存在对应的这两条红色的边。

不要忘记2-sat这个意义下边的传递性,于是再补两条边。

围观上面的两组点,因为2-sat里边的意义,所以左边的两个蓝点也要选。。。

于是得出结论,如果出现两个都不能选,那么一定是已选集合里已经出现了矛盾,而我们选的时候保证不出现矛盾,那么就一定能选满。。。所以就证完了。

于是乎,我就按变量的编号顺序搜索,如果这个点已经被选择了一个值,自然就不选另外一个值,否则就两个值都选选看…

至于剪枝什么的,就设一个贪心的估价函数,具体方法是在还不能被确定值的变量里面,当成两个都可以同时取,算算可以拿到多少分。由于这个值一定比实际值优,所以最优化剪枝的时候如果当前得分加上这个贪心的得分还超不过目前的最优值,那肯定没意义了。

还有就是在搜到两个都可以选的时候,先搜贪心出的解比较大的一个。

【吐槽】

本来想出个用最小割解的,然后纠结到后来发现实在不会了,v老师就提供了好多个奇葩的代码给我,然后全被我cha掉了。那些代码大部分上都是最小割求的较优解…

看完以后离deadline只剩8小时了T_T,于是死马当活马医出成了搜索题,胡乱加了两个剪枝以后随机了几十个数据发现100都妥妥的,于是就脑抽把范围打成100了…

如果是刻意卡的话,我觉得这个其实跑40都有问题,毕竟大致复杂度是O(2^n)的。

总之这不是一道好题,在此向各位被坑的童鞋表示歉意。。。

【代码】

http://ideone.com/UnUkI

PS.缩进可能看起来略疼…把tab换成4个空格的大小就好

记MSRA副院长郭百宁教授的讲座

– -圡人一只,就记记流水账,吐槽什么的就免了。

首先是他认为研究的4个层次。

1、编程实现、实验之流 

2、唯像理论                     

3、理论架构

4、数学

目测是这个东西:http://baike.baidu.com/view/566568.htm

//吃青春饭的程序员被划分到第一层…=.=

然后是MS里面程序猿的career paths(- -我没太听得清楚是不是这个词,根据上下文这个词较为靠谱).

据称搞研究的因为只占1%,他就一带而过了。

接下来大致是:

tester(据说比较boring…测bug的 MS 1/3的人在干这个)

软件架构师(好像主要包括对project分模块的,还有具体分配哪些人干什么活这两类)

还有就是对一些别人的库接口很熟悉的,封装好给自己人用的(忘了叫神马= =b) , 反正是强调技术与沟通能力的。

然后貌似又强调了创造力和快速获得知识的能力。

有个比较囧的point是知识都在图书馆里,有什么必要把脑袋装得满满的呢,只要用得时候能快速的从库里获取就好了。

(= =b   想起  CF  unknown  language 被屠一脸    btw shi哥真是太可怕了)

恩,当然比较基础的东西还是必须学好。

接下来介绍了场、势、图像的一个三角形,然后表示这些能够互相推导什么的- -。5555,完全没听懂。

然后就说了周昆老师和鲍虎军老师和他有合作做那个动画的(- -||| 然后就想起u博和飞博)。

接着展示了一些他们那个算法对比传统的有什么优越性- -。

映像比较深的是那个把太阳放到另外一幅图像上的过程。

一开始是直接无技术裁剪粘贴。。。看起来极度不和谐。

然后他表示利用新图中对应位置外围一圈的轮廓,加上原图像中太阳部分的势,利用拉普拉斯方程(http://zh.wikipedia.org/wiki/%E6%8B%89%E6%99%AE%E6%8B%89%E6%96%AF%E6%96%B9%E7%A8%8B)就能算下来每个点的颜色,于是乎看着就非常和谐了。

– -,接下来还展示了将某PPMM和北极熊放在同一水池和谐相处的过程。

利用这个以拉普拉斯方程为基础的算法,还能做出利用2维的线控制三维对象的效果,然后就能轻松搞出比如怪兽跳芭蕾舞什么的东西。动画的制作就比较方便了。

好多东西不记得了,记一下,不然以后忘光了就等于白听了。

btw

最后结束以后一位疑似MSTC的学长喊住我,对我说:你也来听这个吗?然后我发现我貌似认不得这位学长,于是恩了一下。然后他说进去听吧,我就没反应过来,结束了还听什么…不确认有没有听错就没回话。感觉非常囧= =|||.

5555,不怎么擅长和不熟的人搭话=.=,于是学长见怪莫怪。

Regional 2011后记

很难过吧。两个银牌。特别是第二场,银牌第三什么的…

回顾这两场regional比较怨念的东西。

第一场是被for (int i=n-s1;i<=n;i++)      被n=INT_MAX卡了半场。然后题也没看清就开始敲F。

第二场是E一直TLE到死。然后戴神赛后告诉我,答案是对的,时间也在比较靠谱的范围内,不是超得很多,顿时就泪流满面了。

实际上造成悲剧的因素还有很多很多…

还是怪自己不够扎实吧。之前斯坦纳树的题一直都过得比较勉强,跑得挺慢的。自己也没太在意,过了就OK。没想到这次,就被这常数屠了。实际上那个写法确实就是比较挫。

两场都最后都是手握两题比较靠谱的代码,都是1个没过。

弱死了弱死了。

于是,

接下来CF尽量保持Colonel吧。General太遥远了。。。TC也用力练红

然后,=.=希望省赛能把杯夺回来。

恩,其实也不该把结果看得太重。

来两场Regional,在学长们身上学到了好多东西(特别是vout),也见到了很多神牛和传说中的师父,还是比较愉快的。

Anyway, enjoy it~