Newest Posts

Shader Notes

之前看了些GLSL的资料,做一点笔记。

两个免费的教程:

http://www.arcsynthesis.org/gltut/

http://en.wikibooks.org/wiki/GLSL_Programming

首先,由于Shader这个词被翻译成了着色器,让我误解了很久,其实Shader的工作远不止着色这么简单。

显卡将绘制图形将要使用的数据存放在显存中,Shader读取这些数据,并进行相应的运算,以得到最终要显示在屏幕上的图像。GPU运算之所以高效的原因在于,这些Shader虽然运算速度不如CPU,不过数量庞大,且精于浮点运算,而图像处理的重要特点就是非常容易并行化,经常是每个像素的结果可以独立的计算得到,于是通过并行的方法,就可以有效的提升运算效率。

OpenGL渲染的时候主要经过两个阶段:

1.顶点处理:此时主要使用Vertex Shader(顶点着色器),虽然叫顶点着色器,实际上其最主要的工作是计算顶点的位置:将3维平面中的点映射到2维的显示屏幕上。传统上,我们可以使用将该点的坐标乘以Model矩阵以得到其在世界坐标系中的位置,再乘以投影矩阵(比如做平行投影或透视投影),以将其映射成二维平面上的(x, y, depth)信息。 另外顶点着色器还可以计算顶点的其他属性(比如颜色,但逻辑上一个点的颜色并没有什么意义)输出给后面的阶段使用。

2.片段处理:此时使用Fragment Shader,由于顶点的位置确定,整个面的位置也都确定了,接下来要做的事情就是将整个面中每个点的颜色确定,这样就可以完成图像的绘制了。因此此时的输入就是面上每一个点的坐标,输出就是该点的颜色。此时可以利用各种别的输出,比如说之前顶点着色器给出的各种属性进行混色,比如处理光照啊什么的。总之混合的各种效果都是这样出来的。

以前的API中,这些Shader的模式都是固定的,使用者可以做的事情就是改改参数,比如设定下世界矩阵投影矩阵,设定下光源的位置和属性。中间的计算逻辑就是死的。而发展到后来,这些功能得到了开放,用户可以自己去编写Shader了,于是处理效果的灵活性得到了巨大的提升,因为你可以做任何你想要做的事情。甚至到后来连GPGPU技术都发展开了.......

GLSL的Shader加载过程很有意思,和C语言的编译+链接模式相同,先把各个源文件分别进行编译,之后再进行链接。C语言用户应该会非常的亲切 :)

继续没有什么内容的文字

在一番思索之后,我觉得保持每周写1篇的速度应该挺惬意的。

只是目前还是没有写些什么的好思路。

先扯下计划

目前对前端稍微有点兴趣,想学下html/css/javascript,不过一点基础都没,各种艰辛

另外想看看CG方面的东西,诸如raytrace什么的,虽然以前写过一点,不过很久没碰了

剩下一个比较有兴趣的是想去看一下luajit的源码

当然我只写了看起来比较正直的计划,别的就略了......

另外是随意扯下以前扫过几眼的几个开源的编译器

1.lua,看过5.1.4的src code,只看了主体,lib的实现什么的就直接pass了。纯C的代码意味着这玩意其实挺朴实的,tricky的地方非常少,本来就实现的很简单,很多地方都是用朴素的办法解决了~

2.V8,只看了一点点,不过收获很多,各种神一般的用法。各种模板,连用个宏都是fp式的,给了不少的启发。

3.LLVM,架构挺不错的,完全的面向对象,和lua形成鲜明的对比。本来想把优化器的代码都看一遍的,不过看到那一堆文件,加上我是个懒人,于是就作罢了。在做编译原理课设的时候把架构偷学了......

久违的写点东西

好吧我也不知道该写什么

关于这个blog,上一篇看上去是09年写的东西,一晃就11年了,C++新标准都出台了......

期间yo2经历各种被东篱把酒黄昏后墙到被 blogcn收购,历时良久,渐渐的就失去了些文章的习惯了.

另外现在对算法相关的事也不那么勤快了,astar决赛都推掉了。

主要活动以打游戏为主:东方/麻将

在东方卡在地灵殿Luna,麻将各种摸不进牌的情况下,于是想起来还有这么个地方,遂回来写点东西。

最后交代下近况:

最后一年要毕业了,在公司甲实习,期间每天糟8h在emacs上,晚上回来打麻将。碰上有想看的新番就顺便看一看。

这篇文章貌似什么都没写,就算是找点感觉热热身

训诫2则

人之患在好为人师

持而盈之,不如其己

以上两则,谨记之。

今年的各种的比赛的情况整理 / 部分小结

冬天来了之后,一直没有什么伸展躯体的欲望,于是宅在寝室的时间愈发的增加。 加上个人平时不干什么正事,于是倍感无聊。 想来最后决定把今年的比赛情况总结一下。

总体来看 有喜有悲,总的来说算是悲剧的,因为去年定下的出线的目标没有达成。喜的方面就是意外的在腾讯拿到了奖金。

接下来就是就我所能回忆起来的部分写一下

1.TCO TopCoder Open应该是上半年最早参加的一系列的比赛,比赛时间非常的囧(通通在凌晨12:00 ~ 1:00左右比),最开始是和epic每次跑到网吧去比,后来寝室有网了,就靠着笔记本的电(晚上不供电)在寝室奋斗,最后是在300进120那一场的时候(第几轮忘了),先是一个失误,导致500分题只拿到很少的一部分分,接着cha阶段开始不久发现一个错误代码正打算cha的时候,笔记本没电了(忘记调节成节电模式了),第二天起来就悲剧的发现只有150+名,于是TCO比赛就到此结束了。 这段时间Rating倒是一路涨到了1900+,然后就再也没有这么好看过了= =

2.武大邀请赛 这个是我,epic,和所长第一次组队出去比赛,我们队伍第一次比赛的成绩非常的悲剧。配合和发挥都很糟糕,现场只做出来了4道题,还有一道水题甚至我们从头到尾讨论了半天都没理解题意。当时的实际情况是做4题:

A. 给定水杯中水的体积求高度。 二分高度,求积分
E. NamePK  模拟题,比赛时连乘初值设成了0,wa了若干次
D. 求节点数为N的堆有多少个  组合,结果可递推,计算出左子树和右子树各有多少结点
C. 给定一些AI之间的对战的经验及收益关系,求最佳对战方案使收益最大 简单的状态压缩DP
而实际上余下的题目也不怎么难

自这次比赛之后,我一直在考虑组队策略方面的问题,可以说我们队伍现在的情况虽然不能说好了很多,但还是比当时更令人满意的多了。

接下来大概有Baidu组织的A*Star网易Youdao组织的有道难题,和腾讯组织的TIC,这几项比赛的时间基本上都差不多。

A*Star的初赛公有两场,其中一场是正好我上课,于是就不能参加,另外一场记得是周末的晚上,当时我们队正好参加完DHU的邀请赛,我个人感觉非常的累,于是今年的A*Star就非常遗憾的错过了。

3.DHU邀请 说到DHU的邀请赛,算是我们队第一次表现稍微好一点,但是其实过程非常诡异的一次比赛。简单回顾一下比赛过程,大概就是大家先分题看,然后我看了A, B, C都有少量想法,一刷board,发现有人3min出了B,于是B果然按照我的想法应该是对的,于是我也果断跟上在6min过掉,然后epic看到了G是一道简单的模拟,于是我写了过了,这时候发现我们是全场唯一一个过了G的。而大家过A和D比较普遍,而在我写G的时候,所长和Epic就D的题意一直在争论,于是我就浏览了一下D,发现可以直接DP,于是写了2Y,这时非常神奇的事情发生了:我们队凭借题数领先了,而且罚时也很乐观。然后在这段欢乐的时光中,我决定把一开始A的想法实现,就是按层搜索再有乘法原理,写出来交上去,结果直接1Y,继续保持领先,这回我们可是非常的激动了。接着我搞I,epic写J,所长构思H。但是非常悲剧的是虽然我努力的把I5Y了,其中经历了各种错误,当时对于大数字的处理还不怎么熟悉。然后我们一起帮Epic找J中的错误,到最后都没发现就是时间处理的时候h应该除12而不是除60。结果只悲剧的拿了5题,不过当时还是顺利的凭借前期出题快,一直领先的罚时优势拿到了金牌。

这次比赛应该算是一个转折点,我们队的风格慢慢向我写代码的方向靠。然后这次比赛也算是激励了我们,因为我们队之前一直在各种悲剧之中挣扎,而这之后比赛就明显有底气很多。至少其让我们相信了我们是有能力的。

4.有道难题 有道难题是网易旗下的Youdao和TopCoder合作组织的比赛,所以比赛的模式就是选用的TopCoder,也算是我最不擅长的一类比赛。究其原因就是TopCoder结合了两个特点:1.acm选用的提交时间作为评定参数,这使得你不得不加快你读题/思考/Coding的速度
2.OI采用的赛后System Test这样的方法,使得你一旦出现错误,只有在Failed Test的时候才能懊悔。

由于我平时也参加一些TopCoder的比赛,所以代码的速度上看还是不错的。但是准确性这方面还有待加强,于是结果上就变成了在初赛和复赛中非常顺利的出线然后到了现场赛,两场都比的非常的失常,第一场250分是简单的统计,500分是状态压缩DP,1000分是博弈题,SG+DP,结果我果断全挂,第二场250是简单的组合,500分是二分答案,1000分是2-SAT,1000分时间不足自然写不出了,500分写错一个特殊情况又挂,于是悲剧。自从这个比赛的失利之后开始慢慢注意起1Y率这样的东西了。

5.腾讯Tic 腾讯这个比赛其实在比赛方面组织的不怎么样,直接使用的POJ作为比赛系统,还出现了在网上复赛最后一小时Server挂掉的悲惨情况(虽然那时我已经4题然后去做别的事情去了)。现场赛在深圳大学的机房内比的,现场人数大约为70左右。题目5道,ACM赛制,4小时,题目还不怎么容易。

现场赛第一的很诡异的地方就在于没有安排座位,于是就大家随便做,最后就发展成为我的对面是一群THU男……,然后比赛开始后,我决定敌不动、我不动,先慢慢看题。题目是中文题,还比较好看,A题是一个分数搜索+网络流,B题是一个树形DP+决策凸完全单调性,C是个很囧的模拟题,D是一个不好归类的图论题,E是一个Imba的DP,但是数据量巨大,估计要用数据结构来加速。我题目看完后决定写D,写了大概30min发现完全想错了。于是下定决心去写A,因为这时候board上只有A D有人出。A写得非常的悲剧,写完后交上去Wa了,因为好久没有写过最大流了(模板的悲剧),总以为是自己写错了,结果调了好久好久发现居然是有一个memset的函数的参数填错了= =,当我过A的时候已经过了2h30m了,这个时候我大概在20+名。由于在反复纠结A的时候,G突然茅塞顿开,于是在20m后,G又AC了,这个时候到了11名,还剩下1h。稍微考虑了一下,我决定努力的实现B。在大约剩15min的时候,B的第一个版本好了。交上去之后等待,一刷新又说20s内不得刷,然后就直接根据board判断没过,于是写个一个程序对拍,发现没拍出错误,于是看state,发现居然是TLE,于是赶快修改了一下程序,交上去,又不得刷,于是看Board发现AC!,此时已是最后3m,瞬间进入5名。然后成功的混了一个三等奖的奖金。

话说腾讯这个比赛虽然不是特别有气势的感觉,不过1周的参观倒是非常的爽,尤其是在海边的宾馆住的一晚以及在海边玩,真是非常Happy。

过了暑假之后的比赛应该就是Google Code Jam,然后因为我们军训故没有参加。再之后就是各Regional的网络赛和现场赛了。

我们现场是去了上海和武汉,和邀请赛情况一模一样:) 上海坐ghy对面,武汉做dd对面。然后赛况是这样的:

上海Regional 所长和Epic分别读题,我先准备环境再抽题目读。发现B题数论可以上,于是我就上了,写B题的过程中,发现A题过的人比较多,于是Epic准备了A题。我写完B,交上去Wa了,打印后换Epic写A,A也做得不是很顺大概在2h后我们在把A B 双双过掉。而且BWa是因为我开始算法本身就有问题,所以查了很久都没发现代码上的错误。然后再莫名奇妙的状态下我们把J弄出来,到调AC已经4h30+m,然后我努力的想实现I,已然不行了。

上海最后只有银牌还是给了我们比较大的打击的,因为我们当时还是做了很多的准备,状态也比较好,带着非常高的期望参加的,然而结果却比较令人不满意。之后的一周我们又针对这次暴露的问题,做了一些准备后,就去参加了武汉赛区的比赛。

武汉Regional 武汉的思路就是全程我来写程序,然后所长和Epic来提供算法。事实上一开局我就出现了一个重大的失误,导致了D这道水题卡了我们一直到2h之后才过,当时名次已然非常悲剧了,不过好在之后就比较顺风顺水,一路AC,最后顺利6题拿下金奖。就是可惜开始拖了太久的时间,导致罚时异常的悲剧,无望出线。

于是今年就这样以1金1银的战绩结束了。结果不能算作满意。在做过考虑之后决定明年还是继续这个至少对我来说非常理想的活动,特别是还有专程打电话劝我继续的好友。不过既然我决定再继续,那么明年水平还这么菜的话想必会很伤脑筋的,所以现在开始好好学习,好好准备,并且努力试着在年底前先把Rating弄到2200以上吧。

 

2009-11-29 凌晨 @ Tongji Uni.

冬天真是一个神奇的季节。

惰性

比完赛也没过多久,但感觉明显松懈了很多。真的只有在集训的期间才能够使得我稍微认真一点吗?

今年的成绩还是有点失望的,但这毕竟是差距。不过没有关系,我不但会消灭这些差距,而且要树立新的优势。

将风格向沉稳的方向发展,

继续在闲散和努力中挣扎。

武汉站纪念

虽然开局各种悲剧,总算有惊无险的完成了6道题目。虽然是6题的最后一名,好歹还是拿下了这次的金奖。

遂作文纪念一下

SGU VOL1 Simple Solutions(Part II)

上一篇文章

sgu126. 每次都从大盒子移向小盒子即可,可以证明移动次数是logn级别的。

sgu127. 简单题,直接做即可。

sgu128. 经典的线段树题。根据,其实蛇的形状一开始就是固定的,宽搜可以确定是否全部连通,再通过离散扫描的方法可以判断其是否有相交的情况。

sgu129. 计算几何

sgu130. k条线切成k+1块明显是最优解。只要求方案数f[k]即可。考虑用和点1相连的另一个点编号来划分,可以得到f[k] = sigma(f[j]*f[k-1-j], 0<=j<=k-1)。用long long存放结果即可。

sgu131. 状态压缩DP, Topcoder最喜欢的风格之一。可以Topcoder上找到各种写得非常巧妙的类似程序。

sgu132. 状态压缩DP, 和上题思路差不多

sgu133. 按左端点排序,再维护右端点升序,看有多少不满足条件的点即可。复杂度为排序O(nlogn) + 扫描O(n)

sgu134. 建树,然后计算出每个子树t的结点数size[t],则删去点t的结果就是max(n – size[t], size[child{t}]), 找出其中最小的, 将对应的点输出即可。

sgu135. 推导, 找规律, 归纳法都行, 答案为n*(n+1)/2 + 1, int64 留意

sgu136. x y可以分开算。现只考虑x怎么算

假如知道x0, 则容易得到x1,同理易得x2…… 这样就可以计算出xn,x0==xn即有解。

n为偶数的时候可以任意指定x0, n为奇数的时候因为全部中点x的总和正好就等于全部顶点x的总和。用这个和减去适当的项(全部中点坐标偶数项的2倍)也就可以计算出x0了。

sgu137. 非常nb的构造题, 一般问题很容易转化为构造k < n,由0, 1构成的序列。 需要经过一些推导,最后枚举公式中的参数,这样来得到可行的解。鉴于这是较早所做,所以详细的记录没有找到,有点可惜。 强烈推荐

sgu138. 因为总场数是一定的,我们只确定每一场赢的是谁即可,一路贪心下来,最后再把输的那些地方填满即可。超可爱的构造方法。

sgu139. 如果该状态可达,当且仅当该局面的逆序数+0的位置和起点奇偶[lrj]。

sgu140. 宽搜即可。初始状态为0, 每次转移为s –> s+a[i] % p。注意状态只有0~p-1这p种

sgu141. 又是一道线性同余方程。

sgu142.  长度为19的串就>=50万种了,所以答案不超过19,而且可以二分。 然后扫描统计即可。我统计时使用了1<<k大小的hash表。

sgu143.  朴素的树形DP。

sgu144.  概率题 令 t = (y - x) * 60, u = (t - z) / t , ans = 1-u*u

sgu145.  求第K优的方案的问题。可以用经典的Dijkstra变种来解决。

sgu146.  简单题,细节问题郁闷了好久。

sgu147.  数学题, 尚不会。

sgu148.  枚举 + 堆栈维护决策。 细节待补充,忘了当时怎么过的来着了。

sgu149.  找树中最长链,简单的分治。 先选根建树,求出每个点的深度。经过根的最长链就是两个最深的子树深度和+1。不经过根的在格子树中同样求即可。

sgu150. 未读遗留。

SGU VOL1 Simple Solutions(Part I)

题目大多是1年前做的了,此文作为总结回忆性质的题解。

简单题较短,某些题目可能略长。

sgu101 . 无向图的欧拉路径问题。我是先把路求出来,再硬搞的方案。

sgu102.  求n的欧拉函数phi(n), 将n分解用公式即可。

sgu103.  最短路,带有一定的动态性,但还是满足最优化子问题。

sgu104.  及其简单的DP,IOI以前的原题来着

sgu105.  div3, 因为10%3==1,故易推知答案为( n / 3 * 2 + (n % 3 > 1? 1 : 0))。

sgu106.  解线性方程, 用扩展欧几里得或者用求逆元的方法得到一组代表解,然后求通解中参数的范围即可。 特殊情况即a b中有一个或两个0, 注意答案可能会超过int32范围。

可以参考这个

sgu107.  9位数满足条件的有8个,否则嘛,只要最后9位是这8个情况中的一种就行,其余任意,故答案为7200000...,根据n控制0的个数即可。

sgu108.  自我数,直接求出所有<=n的自我数。 先将询问排序,求到对应询问的时候,记录下结果。 由于限制了空间,需要循环使用队列来计算。 因为如果当前数是k, 其产生的数将<=k+6*9= k+54,故使用长度200的循环数组存放绝对是ok的了~

sgu109.  构造题。 先将棋盘黑白染色,假设左上角是黑色的。即当前人物站在黑色的格子中。

这里先介绍n为奇数时的构造方法,n为奇数时,先让此人走奇数步,则他一定在白格子中,我们便可以将最外面一圈黑格子删掉而使得游戏可以继续。接着再让其走奇数步,则他又将出现在黑格子中(并不在最外面的一圈),于是我们可以删掉最外面这一整圈了。这是问题便 转化为n-2大小的棋盘,由于n-2还是奇数,n=1为边界条件,该问题即得到解决。

n为偶数的时候,只要先想办法走2步转化为n-1即可。

sgu110.  计算几何题, 尚未写

sgu111. & sgu112. 裸的高精度题来着,Java写起来超简单啊

sgu113. Nearly prime numbers.  和分解质因数的方法差不多

sgu114. 如果你把所有的人都放在坐标轴上,中位数就是答案。 对于城市来说,就是个加权中位数的问题而已。

sgu115. 简单的算一下就行

sgu116. 背包问题, 只是"物品"需要根据题目求一下而已。

sgu117. 模K M次剩余来着。这个题目只需要求出最小的t,满足K | t^M, 这样其余所有满足条件的解都必为t的倍数。

sgu118. 直接做即可。

sgu119.  令g = gcd(a, b, n),则(i*(a/g)%n, i*(b/g)%n)这样的数对就是所有的答案。

sgu120.  就是个几何题

sgu121.  已知解法存在DFS树构造和Eular路构造, 尚未实现。

sgu122.  特殊图的哈密尔顿回路,每次贪心选择当前剩下度最小的点即可。 也有构造方法。

sgu123.  直接照着做即可,答案long long 可存

sgu124. 计算几何,直接射线法可。

sgu125. 搜索,朴素的剪枝即可。

上海完

结果还算悲剧

B是我做的,数论题,开始弄错一个结论,写了一个程序上去wa,print出来检查一遍,竟然没有发现任何错误。对拍倒是找到错误的数据,然而调试不出来?结果epic发现我算法错了,遂改之过了。

A,J为epic做的。

最后3题rank17银牌。

神队8题第一,贵队7题被反超了可惜I啊,贵队加油,我绝对支持~

继续努力,Wuhan发力预备了。