Codeforces Beta Round #79 (finished)

A

Cnt[26]表示每个字母出现次数,然后sort一下,贪心地从个数少的开始删,删剩下的就是必须有的。

B

离散化以后就各种好搞- -。写圡了,按ti排序以后发现ti相同的那些转移有点问题。于是直接开个

map

CF上第一个hack…成功了叉了一个n^2都敢交的…

C

=_=经lcc指点后顿时泪流满面。

旋转原来那个东东,就相当于把一路上加的C向量和原来的向量都跟着一起旋转再叠加。

于是乎把目标的B向量旋转到4个方向,分别看看能不能用C旋转4个方向的向量拼出B-A.

然后C旋转4个方向的向量由于是90 180 270度的,所以可以只取其中两个垂直的。然后就是看是否存在整数(x,y)满足

x*C + Rotate90(C)*y = B-A

这个化出来以后就和两直线求交一个样- -,套个模板或者推一推就好了。

D

这个题要是当时看了就好了…卡了C以后没去搞这个…好经典的0_0

dfs的时候,按照这个函数对当前结点的儿子排下序

bool cmp(int x,int y){
     return Size[y]*Sum[x]}

其中Size表示子树下结点的数目,Sum[x]表示子树以及x与父亲相连的所有边的权和*2的值。

然后这样模拟算一算延迟的值就好了.

          sort(Q.begin(),Q.end(),cmp);
          long long tmp=0;
          for(int i=1;i              tmp+=Sum[Q[i-1]];
              ret+=tmp*Size[Q[i]];
          }

ret初始为从当前结点直接跑各个子树时的时间和…

代码:http://ideone.com/UsOfC

E

还不会捉。

题意就是

F[0,0]=(a[0]+b[0])%p

F[i,j]=max(F[i-1,j],F[i,j-1])+(a[i]+b[j])%p

输出F[n-1,m-1]以及取的方案

n,m<=20000.

时限15S

空间限制 45MB

 

=_=rating涨了一点点…

 

—————————————————————————————————————

E

看了官方题解。问题相当于找一个从(0,0)走到(n-1,m-1)的路线。pick完路上的权,最后权最大。只能向上或右走。

路径长度必然是(n-1 – 0)+(m-1 – 0)。然后把路径分为均匀的前后两半,于是可以确定一个最优解的中介点。递归下去。就得到了答案。

令r=n+m-2,那么复杂度这么算:r*r + 2*(r*r)/4 + 4*(r*r)/16 ….  k*(r*r)/(k*k)  … <= r*r + r*r

代码:http://ideone.com/XgoR1

 

update@8.7

[codeforces 85D]【平衡树】

【题意】

n个操作

每个操作可以是

add x  把x加进set里

del x   把x从set中删除

sum  令A[1..m]按递增序表示set中的函数。求Sum{A[i] | i%5==3}

【算法】

直接弄棵平衡树。每个结点维护下面几个域。 long long Sum[5] ,offset ,delta,key。

然后标记上下传就可以了,不错的平衡树练手题目。

尝试了一下struct封装好各种操作的Splay。。。感觉还挺舒服,但是写得爆长。。。

我感觉离散化以后线段树也可以搞。

或者直接建5棵平衡树。index变的时候就裂开然后再合并就好了。

【其它】

看了一下watashi飘逸的treap。

然后再看了一下最短的那个人。。。

修改用一个vector二分了个位置(lower_bound),然后直接insert erase。

然后统计直接for (i=3;i

特么坑爹啊!!!!!yandex.algorithm的题这样被人水过啊。

又想起NOI2003文本编辑器pascal那个不能吐槽的move=_=…特么比正解什么的都跑得快…

[codeforces 69C]【字符串模拟】

【链接】http://www.codeforces.com/problemset/problem/69/C

【其它】

其实这题很水- -,但是我STL套得很泪流满面…

比如这样

        cin >> S;

        S.erase(S.size()-1);

        Name=S;

        getline(cin,S);

        Del_dot(S);

        stringstream sin(S);

        int Num;

        Tv.clear();

        while (sin >> S >> Num)

              Tv.push_back(make_pair(S,Num));

        pf.push_back(make_pair(Name,Tv));

再比如这样

     for (vector< pair < string, vector < pair

搞了80行,压力太大了。

ym watashi的ruby和叉姐的python- –

 

[TopCoder SRM420 Div1 500pt RedIsGood]【数学期望】【动态规划】

【题意】

给你R张红牌,B张黑牌。

全翻过去。你每次可以选择翻开一张牌或者结束游戏。

翻开一张红牌你可以的1块钱,黑牌掉1块钱。

问假设你绝顶聪明,你得到的钱数是数学期望是多少?

【算法】

本来觉得红牌多就继续取,黑牌多不取了就是最优策略。

然后有个样例  11 12,期望居然>1。这才猛然发现可以通过见好就收的策略使得期望>0,于是就囧了。

解法是F[i][j]表示剩下i张红牌,j张黑牌,你绝顶聪明时的期望。

那么你怎么才叫聪明呢- -,当然是翻了以后,你继续聪明,得分的数学期望>0,那么就跑去翻,这样才叫聪明啊…

于是F[0][0]=0

F[i][j]=F[i-1][j]+1   (j=0)

F[i][j]=0                (i=0)

F[i][j]= max(  (F[i-1][j]+1)*(i/(i+j))  +  (F[i][j-1])*(j/(i+j))   ,   0   )

最后F[R][B]就是期望…

要用滚动数组优化一下。

【CODE】

 http://ideone.com/tfZ9a

[SGU385 Highlander]【数学期望】【组合数学】【动态规划】

【题意】

输入n,求在所有错位排列中,在最长循环节上点的数目(如果有多个最长循环节,那么这些上面的点都要算)的期望值。

每个错排都是等概率的。

【算法】

论文上的题…写出来加深印象+方便回看。

因为是排列,而且是错排,所以可以看成无自环的多个独立环拼成的图。

F[i][j][k]表示选了i个数里面最长循环节是j,有k个最长循环节时的方案数。

令G[i][j]=Sum(F[i][0..j][k])

初始化F[0][0][0]=1。

F[i][j][k]=

{

G[i-j][j-1]*P(n-i+j,j)/j      k=1           就是在剩下的n-i+j个数里取j个,得到一个长度为j的排列,但是由于是环,可以循环一圈当同样的,所以/j

F[i-j][j][k-1]*P(n-i+j,j)/j/k   k>1      前面和上面一样.后面的/k是把这k个等长的环的顺序上的重复干掉。

}

最后答案就是Sum( F[n][j][k]*j*k ) / d 

d是错排数目。

【CODE】

https://ideone.com/lIAQX