codeforces 733E (数学)

来源:互联网 发布:澳洲人工智能专业排名 编辑:程序博客网 时间:2024/06/04 23:51

题目链接:点击这里

题意:n个台阶,每个台阶上有上或者下,每经过一次都会改变方向。求从每个台阶出发,从最下方或者最上方走出去的步数

对于每一个开始的台阶,只有他下方的U和他上方的D会影响最后的步数。如果要从下方出去就需要把下面都变成D,同样的,要从上面出去就要把上面都变成U。观察一下发现交换初始台阶上下方的D和U的步数花费就是两者距离的一半,最后加上开始台阶从下方或者上方走出的步数。
trick:结果会爆int

#include <bits/stdc++.h>#define Clear(x,y) memset (x,y,sizeof(x))#define FOR(a,b,c) for (int a = b; a <= c; a++)#define REP(a,b,c) for (int a = b; a >= c; a--)#define first fi#define second se#define pii pair<int, int>#define pli pair<long long, int>#define mp make_pair#define pb push_backusing namespace std;#define maxn 1000005char s[maxn];long long n, sum1, sum2;long long l[maxn], r[maxn];vector <long long> ans1, ans2, u, d;int main () {    //freopen ("more.in", "r", stdin);    cin >> n >> s+1;    l[0] = r[n+1] = 0;    u.clear (); d.clear ();    FOR (i, 1, n) {        l[i] = l[i-1]+(s[i] == 'U');        if (s[i] == 'U') u.pb (i);        else d.pb (i);    }    REP (i, n, 1) {        r[i] = r[i+1]+(s[i] == 'D');    }    int cut = n+1;    FOR (i, 1, n) {        if (l[i-1] < r[i+1] || (l[i-1] == r[i+1] && s[i] == 'D')) continue;        else {            cut = i;            break;        }    }    sum1 = sum2 = 0;    ans1.clear (); ans2.clear ();    int i = u.size()-1, j = 0;    FOR (pos, 1, cut-1) {        if (s[pos] == 'U') sum1 += pos*2;        else sum2 -= pos*2;        sum2 += d[j++]*2;         ans1.pb (sum2-sum1+pos);    }    sum1 = sum2 = 0;    REP (pos, n, cut) {        if (s[pos] == 'D') sum2 += pos*2;        else if (s[pos] == 'U') sum1 -= pos*2;        sum1 += u[i--]*2;         ans2.pb (sum2-sum1+n-pos+1);    }    for (int i = 0; i < ans1.size (); i++) cout << ans1[i] << " ";    REP (i, ans2.size()-1, 0) {        cout << ans2[i] << " ";    } cout << endl;    return 0;}
0 0
原创粉丝点击