codeforces 733E (数学)
2016-11-03 21:24
232 查看
题目链接:点击这里
题意: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_back using namespace std; #define maxn 1000005 char 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; }
相关文章推荐
- Codeforces 75C (二分+数学)
- Codeforces 711E ZS and The Birthday Paradox(数学)
- CodeForces 173A - Rock-Paper-Scissors 数学
- CodeForces 396A 数论 组合数学
- codeforces B. Dreamoon and WiFi 组合数学求概率
- Codeforces 677C Vanya and Label(数学)
- CodeForces - 701D As Fast As Possible (数学推导)
- codeforces-755D-PolandBall and Polygon(数学题)
- codeforces 616E Sum of Remainders 数学公式转化
- CodeForces - 735D Taxes(数学)
- CodeForces 682A Alyona and Numbers (水题,数学)
- CodeForces 593B Anton and Lines【数学+排序】
- CodeForces - 27E Number With The Given Amount Of Divisors (DFS+数学)
- Codeforces-199C:About Bacteria(数学)
- CodeForces 340 C.Tourist Problem(组合数学)
- codeforces 225E E. Unsolvable(梅森素数+数学)
- CodeForces 630P: Area of a Star【数学】
- 【CodeForces】708 B. Recover the String 数学构造
- Codeforces 899D Shovel Sale (数学)
- Codeforces 891A Pride (dp & 数学 & 贪心 & 暴力)