您的位置:首页 > 其它

Codeforces Round #258 (Div. 2)题解(ALL)

2014-07-25 01:47 393 查看


<a target=_blank href="http://codeforces.com/contest/451/problem/A" target="_blank">A. Game With Sticks</a>
<span style="font-family: Arial, Helvetica, sans-serif;">n个水平棍子,m个竖直棍,组成网格,每次删除交点所在的行和列,两个人轮流删除,直到最后没有交点为止,最后不能再删除的人将输掉</span>
</pre><pre name="code" class="cpp">取哪个点没有区别
脑残加了个n=m=1的特判还是错的卡到46minWA2发。。。


scanf("%d%d",&n,&m);

    if( min(m,n)%2==1 )
        cout<<"Akshat";
    else
        cout<<"Malvika";


B. Sort the Array

按a[i]的值排序然后

(感谢易)

bool can(){
	bool need = false;
	for (int j = 1; j <=n; j ++){
		if (a[j].id!=j){
			need =true;
			break;
		}
	}
	if (!need){
		cout<<"yes"<<endl;
		cout<<"1 1"<<endl;
		return true;
	}

	int i;
	for (i = n; i >0; i --)
	   if (a[i].id!=i) break;
	int l,r;
	r = i; l = a[i].id;
	for (int j =l;j <=r; j ++){
		if (j-l!=r-a[j].id){
		return false;
		}

	}
	for (int j = 1; j <l; j ++)
	  if (a[j].id!=j) return false;

	cout<<"yes"<<endl;
	cout<<l<<" "<<r<<endl;
	return true;
}


C. Predict Outcome of the Game

n场球,已经踢了K场,知道三个队a,b,c,的胜场差是|a-b|=d1,|b-c|=d2

求是否有希望踢完三队胜场相同

根据a,b,c大小关系分四种情况考虑

if(n%3!=0)
        {
            printf("no\n");continue;
        }

        if(k+d2+2*d1>=0  && (k+(d2+2*d1))%3==0 )
        {
            a=(k+d2+2*d1)/3;
            b=a-d1;
            c=b-d2;
            if(a<=n/3 &&b<=n/3 &&c<=n/3  &&a>=0 &&b>=0 &&c>=0)
                ans=true;
        }

        if(k+d2-2*d1>=0  && (k+(d2-2*d1))%3==0 )
        {
            a=(k+d2-2*d1)/3;
            b=a+d1;
            c=b-d2;
            if(a<=n/3 &&b<=n/3 &&c<=n/3  &&a>=0 &&b>=0 &&c>=0)
                ans=true;
        }

        if(k-d2+2*d1>=0  && (k-d2+2*d1)%3==0 )
        {
            a=(k-d2+2*d1)/3;
            b=a-d1;
            c=b+d2;
            if(a<=n/3 &&b<=n/3 &&c<=n/3  &&a>=0 &&b>=0 &&c>=0)
                ans=true;
        }

        if(k-d2-2*d1>=0  && (k-d2-2*d1)%3==0 )
        {
            a=(k-d2-2*d1)/3;
            b=a+d1;
            c=b+d2;
            if(a<=n/3 &&b<=n/3 &&c<=n/3  &&a>=0 &&b>=0 &&c>=0)
                ans=true;
        }
        if(ans) printf("yes\n");
        else    printf("no\n");
    }


D. Count Good Substrings

给出一个字符串,该字符串的子串中,长度为奇数的good string有多少个,长度为偶数的good string(字符串中连续相同的字符合并为一个字符,形成回文串的字符串)有多少个。

看官方题解是这样:

扫一遍S,统计S中到当前位置之前 奇数位和偶数位a,b分别出现次数

第一问:在偶数位时 当前位置字母出现在奇数位次数 + 在奇数位时 当前位置字母出现在偶数位次数

第二问:在偶数位时 当前位置字母出现在偶数位次数 + 在奇数位时 当前位置字母出现在奇数位次数

(奇偶从0开始算)

代码直接去standing找吧(因为我也没看懂为嘛题解这个是对的。。。)

E. Devu and Flowers

有n个花坛,每个花坛有f[i]支花。同一个花坛的花颜色相同,不同花坛的花颜色不同,问取s朵花一共有多少种取法

如果每一个每一种花都有无限个(即>=s),很明显,有C(s+n-1,n-1)种取法。

如果某种花不够,那么就有C(s+n-1-x-1,n-1)种取法要减去。

代码是男的另一种直接加,类似官方题解的方法(我还是不会这个)

Calc为乘法逆元求组合数模 模版

LL ret = 0;
    for ( int i = 0; i < (1 << n); i ++ ) {
        LL sum = 0, num = 0;
        for ( int j = 0; j < n; j ++ )
            if ( (1 << j) & i ) {
                sum += x[j];
                num ++;
            }
        sum += num;
        if ( sum <= s ) {
            ret += (( num & 1LL ) ? -1LL : 1LL ) * Calc( s - sum + n - 1, n - 1 );
            ret %= mod;
        }
    }

    ret = ( ret + mod ) % mod;
    cout <<ret<<endl;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: