Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-settings.php on line 472

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-settings.php on line 487

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-settings.php on line 494

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-settings.php on line 530

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-includes/cache.php on line 103

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-includes/query.php on line 21

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-includes/theme.php on line 623

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-content/plugins/coolcode/PEAR/Text/Highlighter.php on line 210

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-content/plugins/coolcode/PEAR/Text/Highlighter.php on line 364

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-content/plugins/coolcode/PEAR/PEAR.php on line 569

Deprecated: Assigning the return value of new by reference is deprecated in /data/multiserv/users/221134/projects/260609/www/blog/wp-content/plugins/coolcode/PEAR/PEAR.php on line 572
最初的梦想 亦纷菲

ACM路上不算总结的总结…

2009年9月13日

1. java.. java.. java…最近老听到java,也不知道什么时候开始Java变成了万能的语言. 一旦程序错了,瞬间就怀疑是不

是精度问题导致自己算法错了,从不怀疑自己那脆弱的算法有没有问题,能不能改进。 ACM都快2年了,就没见过一道题目非Java不行的。 当没勇气承认自己无力的算法的时候,请大家不要埋怨一直陪伴着你的语言. 人就是这样一走进误区,就会茫然不知,乱闯乱撞,就快死在那里了也不知道。 人还很奇怪,相同的场景,相同的陷阱,还是会一次次往里跳, 还跳的还很开心…..

2. 贼牛叉的算法老挂在嘴边, 碰到有点想法的题目就埋怨算法不会。更讽刺的是当大批新手队秒掉了之后,还在那里恍惚奇怪他们什么时候也学那XX算法了…… 人额~总是贪婪的想在最短的时间学会所有的算法,然后静静的死在那些“自以为学会的算法”面前,还很安详的那种….

3. 最近老碰到代码技巧很高的统计题,很难敲出,而且敲出了也很难AC。如果自己都对自己没自信,敢问你上去敲个屁

啊….傻里傻气的敲个2到3小时。。然后很光彩的和队友说”那个题目数据真变态,一开始就知道会过不了得”….. 典型就一

个悲剧,为你的队友感到伤心。自知自明和自信是同等重要的。

4 ACM.. ACM… 为什么叫ACM呢?.. 因为是三个字母,所以一个队才有三个人, 为什么是ACM呢? 正因为三个人在一起才会

AC many 题目。 不能做到三人合作,就请解散吧….

5. 比赛5小时,有些队从开始到结束都忙碌,有些很茫然,还有那么一些则很搞笑。 搞笑到看见自己的提交WA了还会自

笑…..然后哼着歌乱搞一气等待比赛结束…

6。 队友不是神话,有些东西不讲明白是很痛苦的。

.
.
.
.
.
.

最近在ACM方面见到不光彩面比较多,有好多也是自己或队友的自嘲。可能是有点极端,但我希望带讽刺的手笔自我批评一番

。ACM时日不多。。 我希望不久以后写退役总结时不是这个语调….

生活瞬间

最后的暑假

2009年8月30日

伴随着浙大月赛的纠结,大学间最后的暑假也走到了尽头……

有很多想做的事情,但可惜大半都没能在这个夏天完成, 可能是少那么一点决心,也可能是缺那么一点机会~~最终还是把整

个暑假献给了ACM,虽然在那片熟悉的领域少了去年同个时候的那份激情,但自我感觉2个月以来的每一步,自己走的还是蛮踏实的

暑假刚开始那扑朔迷离的组队,最终走了陈晟,来了胡浩,虽然有点舍不得陈晟,1年来和我,和天涯的配合还是相当默契的

,但是不可否认胡浩的到来给我们队带来了冲劲,不知不觉中让我感觉,我们仿佛也有机会去冲击下那遥远的梦想。

26场积分赛中,17场内部第一,还有最后那一场联合训练赛戏剧性的捧杯算是对重组后我们的肯定。现在好好总结下整个暑假

,发现其实过的还蛮开心的,和那群熟悉的人,去了好几次川味馆,吃了好几回堡(好像还在该过程中见到了朱丹…..), 一起去吃

过海鲜,玩过台球,但没有陪他们去看电影~~因为…..那个~呵呵。 还有集训后半程的那个”多塔再起”,也会成为我2009年夏天

最美回忆中的一部分…..

最后一次全国赛,不知道能走多远,但我会好好珍惜,要对得起那段逝水无痕的光阴。还没想好参加全国赛的队名,另外两个

人也都没提起过,到时候可能是件蛮难以决定的事情。

接着剩下来的就只有那可怜的一年,这辈子学生时代的最后一年了,除了考虑下毕业后的事情,我还很想尝试一下很多新鲜的

东西,做一些未曾做过的事情。比如最近得知有位朋友很想得到一台时光机,回到过去,所以晚上睡觉的时候老在想做时光机要什

么材料……做时光机应该是一件蛮帅的事情,要尝试一下~~呵呵。

集训队一大半都提着行李开心回家休息去了,发现自己真的很懒,明知道有可能十一不能回去,但还是懒的乘火车回家,常常

找借口安慰自己“时间啊~~~那个很快的,过年一杂眼而已…..”

也不知道为什么,这2天都起的有点早,今天的下沙天气爽的出奇,过滤掉了浮躁的那一层,整个思维都灵动了很多,但仿佛

也提醒着我这个夏天时真的过去了…….

生活瞬间

SGU 185 网络流

2009年7月20日

SGU 185 Two shortest

最近一直在重温网络流方面的方面的知识,总感觉这方面比较散,昨天重新整理了下最小费流模板,今天又重新理了便Dinic,对分层的感念虽然还没有以前那么深刻了,但体会却有所不同。
SGU 185 蛮经典的题目,贴下代码,记录下学习的过程

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. #define maxn 500
  5. #define inf 1<<28
  6. struct edge{
  7.     int v, next;
  8.     int val;
  9. } net[ maxn * maxn ];
  10. int level[maxn], next[maxn], Qu[maxn], out[maxn];
  11.  
  12. class Dinic {
  13. public:
  14.     int end;
  15.     Dinic() {
  16.         end = 0;
  17.         memset( next, -1, sizeof(next) );
  18.     }
  19.     inline void insert( int x, int y, int c) {
  20.         net[end].v = y, net[end].val = c, net[end].next = next[x], next[x] = end ++;
  21.         net[end].v = x, net[end].val = 0, net[end].next = next[y], next[y] = end ++;
  22.     }
  23.     bool BFS( int S, int E ) {
  24.         memset( level, -1, sizeof(level) );
  25.         int low = 0, high = 1;
  26.         Qu[0] = S, level[S] = 0;
  27.         for( ; low < high; ) {
  28.             int x = Qu[low];
  29.             for( int i = next[x]; i != -1; i = net[i].next ) {
  30.                 if( net[i].val == 0 ) continue;
  31.                 int y = net[i].v;
  32.                 if( level[y] == -1 ) {
  33.                     level[y] = level[x] + 1;
  34.                     Qu[ high ++] = y;
  35.                 }
  36.             }
  37.             low ++;
  38.         }
  39.         return level[E] != -1;
  40.     } 
  41.  
  42.     int MaxFlow( int S, int E ){
  43.         int maxflow = 0;
  44.         for( ; BFS(S, E) ; ) {
  45.             memcpy( out, next, sizeof(out) );
  46.             int now = -1;
  47.             for( ;; ) {
  48.                 if( now < 0 ) {
  49.                     int cur = out[S];
  50.                     for(; cur != -1 ; cur = net[cur].next ) 
  51.                         if( net[cur].val && out[net[cur].v] != -1 && level[net[cur].v] == 1 )
  52.                             break;
  53.                     if( cur >= 0 ) Qu[ ++now ] = cur, out[S] = net[cur].next;
  54.                     else break;
  55.                 }
  56.                 int u = net[ Qu[now] ].v;
  57.                 if( u == E ) {
  58.                     int flow = inf;
  59.                     int index = -1;
  60.                     for( int i = 0; i <= now; i ++ ) {
  61.                         if( flow > net[ Qu[i] ].val )
  62.                             flow = net[ Qu[i] ].val, index = i;
  63.                     }
  64.                     maxflow += flow;
  65.                     for( int i = 0; i <= now; i ++ )
  66.                         net[Qu[i]].val -= flow, net[Qu[i]^1].val += flow;
  67.                     for( int i = 0; i <= now; i ++ ) {
  68.                         if( net[ Qu[i] ].val == 0 ) {
  69.                             now = index - 1;
  70.                             break;
  71.                         }
  72.                     }
  73.                 }
  74.                 else{
  75.                     int cur = out[u];
  76.                     for(; cur != -1; cur = net[cur].next ) 
  77.                         if (net[cur].val && out[net[cur].v] != -1 && level[u] + 1 == level[net[cur].v])
  78.                             break;
  79.                     if( cur != -1 )
  80.                         Qu[++ now] = cur, out[u] = net[cur].next;
  81.                     else out[u] = -1, now --;
  82.                 }
  83.             }
  84.         }
  85.         return maxflow;
  86.     }
  87. };
  88.  
  89.  
  90.  
  91. int cost[maxn][maxn], d[maxn], hash[maxn];
  92. int n, m;
  93.  
  94. void Dijkstra() {
  95.     for( int i = 1; i <= n; i ++ ) d[i] = inf;
  96.     memset( hash, 0, sizeof(hash));
  97.     d[1] = 0, hash[1] = 1;
  98.     int x = 1;
  99.     int now = 0;
  100.     while( 1 ) {
  101.         for( int i = 1; i <= n; i ++ ) 
  102.             if( !hash[i] && now + cost[x][i] < d[i])
  103.                 d[i] = now + cost[x][i];
  104.         now = inf;
  105.         for( int i = 1; i <= n; i ++ )
  106.             if( !hash[i] && d[i] < now )
  107.                 now = d[i], x = i;
  108.         if( now == inf ) break;
  109.         hash[x] = 1;
  110.     }
  111. }
  112.  
  113. int DFS( int x ) {
  114.     if( x == n ) {
  115.         printf("%d\n", n);
  116.         return 1;
  117.     }
  118.     printf("%d ", x);
  119.     for( int i = next[x]; i != -1; i = net[i].next ) {
  120.         if( !(i&1)  && net[i].val == 0 ) {
  121.             net[i].val = -1;
  122.             if( DFS( net[i].v ) )
  123.                 return 1;
  124.         }
  125.     }
  126.     return 0;
  127. }
  128. int main() {
  129.     while( scanf("%d %d",&n,&m) != EOF ) {
  130.         for( int i = 1; i <= n; i ++ ) for( int j = 1; j <= n; j ++ )
  131.             cost[i][j] = inf;
  132.         while( m -- ){
  133.             int x, y, val;
  134.             scanf("%d %d %d",&x,&y,&val);
  135.             cost[x][y] = cost[y][x] = val;
  136.         }
  137.         Dijkstra();
  138.         Dinic my;
  139.         for( int i = 1; i <= n; i ++ ) {
  140.             for( int j = 1; j <= n; j ++ ) {
  141.                 if( i == j ) continue;
  142.                 if( d[i] + cost[i][j] == d[j] )
  143.                     my.insert( i, j, 1);
  144.             }
  145.         }
  146.         int ans = my.MaxFlow(1, n);
  147.         if( ans < 2 ) {
  148.             printf("No solution\n");
  149.             continue;
  150.         }
  151.         DFS( 1 );
  152.         DFS( 1 );
  153.     }
  154.     return 0;
  155. }

生活瞬间

一道树型DP

2009年7月10日

采花

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4.  
  5. #define maxn 220
  6. #define maxm 440
  7. vector< int > map[maxn];
  8.  
  9. int dp[2][maxn][maxm], n, m;
  10. bool hash[maxn];
  11.  
  12. void DFS( int x ) {
  13.     hash[x] = 1;
  14.     for( int i = map[x].size() - 1; i >= 0; i -- ) {
  15.         int y = map[x][i];
  16.         if( hash[y] ) continue;
  17.         DFS( y );
  18.         for( int j = m; j >= 0; j -- ) { 
  19.             for( int k = j - 2; k >= 0; k -- ) // 0 + 1
  20.                 dp[0][x][j] = max( dp[0][x][j], dp[0][x][k] + dp[1][y][ j - k - 2 ] );
  21.             for( int k = j - 1; k >= 0; k -- ) // 1 + 0;
  22.                 dp[0][x][j] = max( dp[0][x][j], dp[1][x][k] + dp[0][y][ j - k - 1 ] );
  23.         }
  24.         for( int j = m; j >= 0; j -- ) for( int k = j - 2; k >= 0; k -- )
  25.             dp[1][x][j] = max( dp[1][x][j], dp[1][x][k] + dp[1][y][ j - k - 2 ]);
  26.     }
  27. }
  28.  
  29. int main() {
  30.     while( scanf("%d %d",&n,&m) != EOF ) {
  31.         memset( dp, 0, sizeof(dp) );
  32.         for( int i = 1; i <= n; i ++ ) {
  33.             map[i].clear();
  34.             scanf("%d",&dp[1][i][0]);
  35.             dp[0][i][0] = dp[1][i][0];
  36.         }
  37.         for( int i = 1; i < n; i ++ ) {
  38.             int x, y;
  39.             scanf("%d %d",&x,&y);
  40.             map[x].push_back( y );
  41.             map[y].push_back( x );
  42.         }
  43.         memset( hash, 0, sizeof(hash) );
  44.         DFS(1);
  45.         int ans = 0;
  46.         for( int i = 1; i <= m; i ++ )
  47.             ans = max( ans, max( dp[0][1][i], dp[1][1][i]) );
  48.         printf("%d\n", ans );
  49.     }
  50.     return 0;
  51. }

个人题解

ZOJ Monthly, June 2009 最后一题

2009年7月1日

zoj 3404
问巫妖的大招能不能弹死确定的怪物!
比赛的时候想成了拆点的最大流,写完发现弹射K次这个条件不能满足,没做出!
其实对于固定的一点,只能通过它一步可到的点反射过来的,所以最优的方式就是该点于其周围可达的点相互之间反弹。
分类构造最优方案,分如果巫妖第一步就能打到和第一步不能直接打到,如果不能直接弹到,则求个最短距离,使其最快弹到目标。

  1. #include<iostream>
  2. #include<queue>
  3. #include<vector>
  4. using namespace std;
  5.  
  6. #define maxn 1010
  7. vector< int > hd[maxn];
  8. int n,R,K,D;
  9. int val[maxn];
  10. int x[maxn], y[maxn];
  11. int hash[maxn];
  12.  
  13. int BFS() {
  14.     queue<int> yifenfei;
  15.     yifenfei.push( 1 );
  16.     memset( hash, -1, sizeof(hash) );
  17.     hash[1] = 0;
  18.     while( !yifenfei.empty() ) {
  19.         int a = yifenfei.front();
  20.         if( a == n ) return hash[n];
  21.         for( int i = 0; i < hd[a].size(); i ++ ) {
  22.             int b = hd[a][i];
  23.             if( hash[b] == -1 ) {
  24.                 hash[b] = hash[a] + 1;
  25.                 yifenfei.push( b );
  26.             }
  27.         }
  28.         yifenfei.pop();
  29.     }
  30.     return -1;
  31. }
  32.  
  33. int main () {
  34.     int T;
  35.     scanf("%d",&T);
  36.     while( T -- ) {
  37.         scanf("%d %d %d %d",&n,&R,&K,&D);
  38.         for( int i = 1; i <= n; i ++ ) {
  39.             scanf("%d %d %d",&x[i],&y[i],&val[i]);
  40.             if( val[i] % D == 0 ) val[i] /= D;
  41.             else val[i] = val[i] / D + 1;
  42.             hd[i].clear();
  43.         }
  44.         val[1] = 0;
  45.         R *= R;
  46.         for( int i = 1; i <= n; i ++ ) {
  47.             for( int j = 1; j <= n; j ++ ) {
  48.                 if( i != j && (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) *
  49.                         (y[i] - y[j]) <= R )
  50.                     hd[i].push_back(j);
  51.             }
  52.         }
  53.         int res = 0;
  54.         for( int i = 0; i < hd[n].size(); i ++ )
  55.             res += val[ hd[n][i] ];
  56.         int cost = BFS();
  57.         if( cost == -1 ) printf("NO\n\n");
  58.         else {
  59.             if( cost == 1 ) {
  60.                 int ans = min( (K + 1)/2, res + 1);
  61.                 if( ans >= val[n] ) printf("YES\n\n");
  62.                 else printf("NO\n\n");
  63.             }
  64.             else {
  65.                 K = K - cost + 2;
  66.                 int ans = min( K/2, res);
  67.                 if( ans >= val[n] ) printf("YES\n\n");
  68.                 else printf("NO\n\n");
  69.             }
  70.         }
  71.     }
  72.     return 0;
  73. }

个人题解