TopCoder SRM 496

本次Rating降至空心黄

500搞了半天j打成i看不出来。。。交的时候都只剩200+分了。

最后500还是挂掉了,后来发现if里有个东西又打错了。。。一改Y了。

5555555555555555,现在神马都不行了。

在TC里那个字体太疼了= =。下次在外面打算了。

250

题目给定一个矩阵,每一笔你可以横向涂一笔连续的红的,或者竖向涂一笔连续的蓝的。如果一个格子被涂了红和蓝的,那么会变绿的。最后给出矩阵每个格子的颜色,问最少涂多少笔涂成这个样。

矩阵最大是50*50的。

……就是枚举。

class ColoredStrokes {
    vector    int m,n,ans;
    int v[55][55];
public:
    void solvex(){
      memset(v,0,sizeof(v));
      for (int i=0;i        for (int j=0;j          if ( (S[i][j]==’G’ || S[i][j]==’R’) && (!v[i][j]) ){
            for (int k=j;k              v[i][k]=1;
            ans++;
          }       
        }
    }
    
    void solvey(){
      memset(v,0,sizeof(v));
      for (int i=0;i        for (int j=0;j          if ( (S[i][j]==’B’ || S[i][j]==’G’) && (!v[i][j]) ){
            for (int k=i;k              v[k][j]=1;
            ans++;
          }
        }
    }
    
    int getLeast(vector       S=picture.begin();
      m=picture.size();
      n=picture[0].size();
      ans=0;
      solvex();
      solvey();
      return ans;
    }
};

 

500

有一些球在数轴上跑,然后他们都有一个相同的正的速度。(并且球不会发生碰撞)

然后他给出的第一个数组给定了一开始每个球的位置。

他又给了第二个数组,表示的是之后某个时刻每个球的位置。(但是有一些无关的球会被加进去)

假设way[i]表示第一个数组中第i个球是第二个数组中第way[i]个球,那么问way这个数组有多少种可能的不同的取值。

两个数组中的元素个数都<=50,题目保证了两个数组中,都不会有重复的数值。

样例:


具体做法就是先枚举他们的速度,设为dis。(显然速度只能是 abs(a[i]-b[j]) )

接下来我们来建边:

a[i] ->  (a[i]-dis) in b[j]

a[i] ->  (a[i]+dis) in b[j]

对于a[i],如果不存在其它的a[j]和它争b数组中的结点,那么显然他连出去多少条边,就有多少种方案,然后利用乘法原理乘起来就行。

然后我们关注发生冲突的。因为a,b数组中都不包含重复元素,那么发生冲突只能是这样情况:

a[i]+dis=a[j]-dis

然后继续发生冲突:a[j]+dis=a[k]-dis…

如此下去就会变成一条链。

然后……就判一个每个结点-dis和+dis的是否在b数组中存在。然后匹配时对于这条链,要么全-dis,要么全+dis,要么从中间部分开始,前一半-dis,后一半+dis……于是就这样每条链分开讨论,乘法原理将方案数乘起来。

然后再根据加法原理把不同速度的方案加起来。得到解。

class OneDimensionalBalls {
public:
    int up[55];
    int down[55];
    int m,n;
    int a[55];
    int b[55];
    int v[55];
    int tail;
    int dis;
    int List[55*55];
    
    void make_up_down(){
      int i,j;
      memset(up,0,sizeof(up));
      memset(down,0,sizeof(down));
      for (i=0;i        for (j=0;j          if (a[i]-dis==b[j]) up[i]=1;
          if (a[i]+dis==b[j]) down[i]=1;
        }
    }
    
    int Q[55];
    int Qt;
    int Link(int st){
      int i;
      Qt=1; Q[1]=st;
      v[st]=1;
      for (i=st+1;i        if (a[i]-a[Q[Qt]]==2*dis && down[Q[Qt]]){
          v[i]=1;
          Q[++Qt]=i;
        }
      int ed=Q[Qt];
      if (!up[st] && !down[ed]) return 0;
      if (!up[st]) return 1;
      if (!down[ed]) return 1;
      return Qt+1;
    }
    
    long long countValidGuesses(vector       m=firstPicture.size();
      n=secondPicture.size();
      for (int i=0;i      for (int i=0;i      sort(a,a+m);
      sort(b,b+n);
      tail=0;
      for (int i=0;i        for (int j=0;j          if (a[i]!=b[j])
            List[++tail]=abs(a[i]-b[j]);
      long long ans=0;
      long long now;
      sort(List+1,List+tail+1);
      for (int i=1;i<=tail;i++)
        if (i==1 || List[i]!=List[i-1]){
          dis=List[i];
          make_up_down();
          memset(v,0,sizeof(v));
          now=1;
          for (int j=0;j            if (!v[j])
              now*=Link(j);
          ans+=now;
        }
      return ans;
    }
};

 

950

推荐hhanger大神的解题报告

【AC_LCC_CWJ 第四场】Algorithmic Engagements 2009 & 【第一把SRM】

【AC_LCC_CWJ】

 本场纯打酱油……

就切了J题这个线段树。

http://acm.hust.edu.cn:8080/judge/contest/viewProblem.action?pid=22200

【题目大意】

给一个A[1..n],问是否存在1~n的一个排列,满足所有p[i]<=A[i]。然后后面还有m次修改,每次修改某个位置的A[i]的值。

n,m<=200000     1<=A[i]<=n

【算法分析】

……令Sum[k]表示数组A[i]里包含多少个<=k的数字。然后这个判定性问题转化为是否所有Sum[k]<=k。

然后就用线段树维护所有Sum[k]里,Max(Sum[k]-k)是不是小于等于0,如果是就满足,否则不满足。

【其它】

还想了好一会儿,真是太弱了。

【CODE】

http://xiudaima.appspot.com/code/detail/4489019

哎,弱得一塌糊涂……神马都弱

========================================================================================================

然后是昨天晚上的第一把SRM。

Orz,一进去就见到WJMZBMR和zbwmqlw!!!

WJMZBMR还被人用中文膜拜……

然后看到很多熟悉的ID,像swgr,RoBa之类的…

膜拜完以后开始比赛,显然第一把必须DIV2。

250神马二叉算法都能秒,直接暴力枚举。然后编译了半天不成功,都不知道干神马……

弄了好久,发现语言选了JAVA

接着打开500,据说就是DIV1的275。

觉得就是左边扫一遍右边扫一遍,得到每个位置的上限和下限,于是直接枚举。复杂度就是O(N√N + M)。

Orz表示1000^2 * 50毫无压力的神犇们!!!原来TC的精髓就是暴力……

搞完以后看到最后一题瞬间被秒。。。最后没有交1000。

其实当时的想法很接近正解,也是求连通块,就是没想出每个连通块有n!/2种方案。

好像DIV2里面也没有多少个交1000的……居然搞了DIV2里面第6,Rating一下变到1700+,然后名字就变成黄色了。。。

今天听说别人TC都用插件,下了个KawigiEdit,导入了以后再里面点Run Test Case显示神马g++不行之类的,鸭梨山大。改天再搞一搞。

刚在调这个KawigiEdit的时候被zbwmqlw神牛喊了一声没有听到Orz~罪过罪过

【AC_LCC_CWJ 第三场】NWERC 2008

今天拔完牙的Lcc大爆发!!!

一个人秒了4题Orz

师父有点事,又跑了一会儿,然后一回来就说:D题数论,然后就Y了。。。

然后我就切了2个题,虽是每个队都秒的水题,但是对于我来说都不算水。。。

于是总共7题……在当时的Board里面第一9,第二6

关于D题,师父写的O( PlogP),后来发现别人都是O(P^2)水过的,更后来听说一个O(P^3)的都水过了

顿时崩溃……

【地址】http://acm.hust.edu.cn:8080/judge/contest/viewContest.action?cid=940

(还可以继续交的)

然后我说说我做的题目:

首先是I题:

http://acm.hust.edu.cn:8080/judge/contest/viewProblem.action?pid=22107

【题目大意】

有一个音乐播放器,它采用随机播放形式。它工作流程是:先随机产生一个1~n的排列,然后就按这个排列播放接下来的歌曲。然后播完了n首以后呢,它会再次随机产生一个1~n的排列,然后按新的排列播放。

现在给你一段从某个时刻开始的播放音乐的历史记录,以及播放器里一共有多少首歌。

问历史记录中第一首歌可能是某个完整排列里的第几首歌?输出可能的位置的个数。(其实每首歌可能在排列的位置的个数都是一样的,往后推而已)

【做法】

显然相同的不能出现在同一组,除此之外根本没有其它限制。

那么枚举每一个记录,很容易利用hash得出前面一个和a[i]相等的a[j]在何方。然后就得出一个区间的限制,限制形式为第i个字符不能是序列中的第L~第R个字符。这个限制跑去mod一下歌曲的总数,在剩余系上就可以用线段树Cover一下,最后标记下传就可以知道还有哪些是没有被覆盖了,就都可以用了= =

【CODE】

 http://xiudaima.appspot.com/code/detail/4456022

 

接下来是C题

【题目链接】http://acm.hust.edu.cn:8080/judge/contest/viewProblem.action?pid=22101

【题目大意】

给定一个二分图,然后给出N条有向边,然后让你决定二分图里每个点取还是不取,一条边能够计算进结果当且仅当它的起始点被选,终点不被选,结果最多能有多少条边?

【算法分析】

用最小割求解:
(i只表示左边的点,j只表示右边的点)

map[i][j]表示从i到j之间有多少条边
1、S->i  c=Sum(map[i][j])
2、j->T  c=Sum(map[j][i])
3、i->j  c=map[i][j]+map[j][i]
最后Ans=总边数-Flow

一个割把图中的点分在两个集合S集和T集。如果在二分图左边的点被分到S集,那么当做取,否则不取,在二分图右边的点被分到T集,那么当做取,否则不取。

先假设所有的边都选上,然后按照上面的意义YY出每条边的流量就可以了。

【疑问】

一开始第三类边我加了双向的= =,就是WA,改成单向的立马AC。按照这个割的意义应当是符合的啊?问了叉姐,还是似懂非懂的样子。我还得想一想……路过神牛求指点。

【CODE】

 http://xiudaima.appspot.com/code/detail/4502017

 

后来赛后我和lcc都切掉了恶心的F题

【题目链接】http://acm.hust.edu.cn:8080/judge/contest/viewProblem.action?pid=22104

【题目大意】

给出n(n<=50)个立方体,立方体所有边平行于坐标轴,然后问这个立方体浸在水中的,与水接触的表面积以及,排除水的体积分别是多少?

【算法分析】

3维离散化,暴力染色,然后从最外围再弄多一圈边界,然后在最外围弄一个点,以这个点为起点BFS……然后碰到的面都算。

最后没有被BFS到的格子,就是可以算体积的格子,最后加起来就行。

【CODE】

http://xiudaima.appspot.com/code/detail/4521017

TopCoder 【Practice Room】 之处女交

觉得也是时候玩玩TopCoder了。。。然后之前注册edward_mj的号怎么登都登不了= =,即使用邮箱改了密码,还是显示我账号密码不对。于是就换了一个号。接下来按照这篇东西介绍的进到去以后,选了SRM494 DIV 2 250分那题。。。

然后进去一看。我晕,怎么要用vector

然后看到首当其冲的:vector未定义。。。我倒,vector未定义,那你还传给我干嘛= =。然后加了一堆头文件以后,终于过了。

看来头文件都要先搞好,怪不得以前听别人说TC的模板什么的一大串,原来就是这种东西。。。

中间切出去各种看百度神马的,又看到右上角“CODING 00:00:00”还以为他不算时间

然后DIV2 250的Trash题就变成这样了。。。

System> cwj has submitted the 250-point problem for 146.60 points