topcoder srm 712 div1 -23

1、给定两个长度为$n$的数组$A,B$。有两种操作可以作用于数组$A$。第一种,将每个元素左侧的相邻数字加到其上;第二种,将每个元素右侧的相邻数字加到其上。0的左侧是$n-1$,$n-1$的右侧是0。比如1,2,3,4执行第一种操作后是5,3,5,7。给出一个不超过100的操作序列使得$A$变成$B$。$n \leq 50$.

思路:将$a_{0},a_{1},...,a_{n-1}$看做$a_{0}x^{0}+a_{1}x^{1}+...+a_{n-1}x^{n-1}$。那么第一种操作相当于乘以$1+x$模$x^{n}-1$,第二种操作相当于乘以$1+x^{n-1}$模$x^{n}-1$。所以操作的顺序无关。所以只需要枚举两种操作各用了多少次即可。

#include <string.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <set>
using namespace std;

void print(vector<long long> a) {
    for(int i=0;i<a.size();++i) printf("%lld ",a[i]);
    puts("");
}

vector<long long> cal(vector<long long> s,int x,int y) {
    int n=(int)s.size();
    while(x--) {
        vector<long long> tmp=s;
        for(int i=1;i<n;++i) tmp[i]+=s[i-1];
        tmp[0]+=s[n-1];
        s=tmp;
    }
    while(y--) {
        vector<long long> tmp=s;
        for(int i=n-2;i>=0;--i) tmp[i]+=s[i+1];
        tmp[n-1]+=s[0];
        s=tmp;
    }
    return s;
}

class LR
{
public:
    string construct(vector<long long> s,vector<long long> t) {
        if(s==t) return "";
        long long x0=0,x1=0;
        int n=(int)s.size();
        for(int i=0;i<n;++i) {
            x0+=s[i];
            x1+=t[i];
        }
        if(x0==0) return "No solution";
        int k=0;
        while(x0<x1) ++k,x0<<=1;
        if(x0!=x1) return "No solution";
        for(int i=0;i<=k;++i) {
            if(cal(s,i,k-i)==t) {
                string ans="";
                for(int j=0;j<i;++j) ans+="L";
                for(int j=0;j<k-i;++j) ans+="R";
                return ans;
            }
        }
        return "No solution";
    }
};

  

时间: 2024-12-08 15:11:37

topcoder srm 712 div1 -23的相关文章

topcoder srm 702 div1 -23

1.给定一个$n*m$的矩阵,里面的数字是1到$n*m$的一个排列.一个$n*m$矩阵$A$对应一个$n*m$ 的01字符串,字符串的位置$i*m+j$为1当且仅当$A_{i,j}=i*m+j+1$.现在可以交换矩阵的两列或者两行.在任意多次操作后使得矩阵对应的字符串最大? 思路:从1到$n*m$,依次枚举.每次将当前数字填回正确位置.比较该次操作前后是否变大.不变大则不做本次操作. #include <stdio.h> #include <vector> #include <

topcoder srm 663 div1 -23

1.给定两个只包含AB的字符串$S,T$.问是否存在一种操作序列将$S$变成$T$.操作有两种:(1)在$S$后加一个‘A’;(2)在$S$后加一个'B'并反转整个串. 思路:每次枚举$S$的两种变化,并判断新的串是否是$T$的子串.不是的话停止搜索. #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stac

Topcoder SRM 643 Div1 250&lt;peter_pan&gt;

Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*......*pn,我们假设p0,p1,...,pn是单调不降的,那么v里存储的是下标为偶数 的N的质因数p0,p2,p4,...,p(2k).现在要求写一个程序,返回一个vector<long long>ans; ans里存储的是p0,p1,p2,...,pn. Limits Time Limit(m

Topcoder SRM 648 Div1 250

Problem 给一个长度为N的"AB"字符串S,S只含有两种字符'A' 或 'B',设pair(i,j)(0=<i<j<N)表示一对 i,j 使得S[i]='A',S[j]='B'.现给定一个K,求字符串S,使得pair(i,j)的个数恰好为K.若不存在,则返回空串. Limits Time Limit(ms): 2000 Memory Limit(MB): 256 N: [2, 50] K: [0 , N*(N-1)/2 ] Solution 若K>(N/2

Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

Problem Statement      The Happy Letter game is played as follows: At the beginning, several players enter the field. Each player has a lowercase English letter on their back. The game is played in turns. In each turn, you select two players with dif

Topcoder SRM 603 div1题解

昨天刚打了一场codeforces...困死了...不过赶在睡前终于做完了- 话说这好像是我第一次做250-500-1000的标配耶--- Easy(250pts): 题目大意:有一棵树,一共n个节点,每个节点都有一个权值,两人A和B分别进行操作,由A先手,每人可以选择一条边,将它删掉得到两个联通块.游戏不断进行下去,最后只剩下一个节点.A希望最后的节点权值尽可能大,B希望尽可能小,求这个最后的值.数据保证n<=50. 这道题真的是博弈好题啊-(感觉放到ACM很合适啊) 我们考虑第一次A会如何选

Topcoder SRM 652 DIV1 250

题意:大概是求前n个数的最大公倍数. 解题思路:筛法+质因子分解,敲玩就去睡觉了,没想到没优化被cha了... 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "ThePermutationGame.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #include <cstring> 10 #include <cs

Topcoder SRM 608 div1 题解

Easy(300pts): 题目大意:有n个盒子,一共有S个苹果,每个盒子有多少个苹果不知道,但是知道每个盒子的苹果下限和上限.现在要至少选择X个苹果,问如果要保证无论如何都能获得至少X个苹果,至少需要选择多少个盒子.数据满足n<=50. 首先第一个方面,如果我们选择的盒子的下限大于等于X,那么显然我们一定可以获得那么多的苹果, 所以我们将盒子的下限排序,然后从大到小累加即可. 另一方面,如果我们没有选择的盒子的上限小于等于S-X,那么显然我们也一定可以获得那么多的苹果, 于是我们再按照上限排序

Topcoder SRM 607 div1题解

好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数据满足字符最多2500个. 我们考虑每一个子串,它对答案的贡献度就是它是回文串的概率,那么我们扫一遍就可以了, 这样做时间复杂度O(n^3),显然过不去. 我们考虑一下对于一个子串,在判断其是回文串的时候,我们一定是从中间往两边扫的,那么其实中间这些子串我们已经统计过答案了, 也就是说,我们通过枚举