codeforces 733E
来源:互联网 发布:软件项目测试报告 编辑:程序博客网 时间:2024/05/16 07:48
题目大意
有
假如你在第
假如你在某个时刻离开了第
问你从每一级台阶开始走,直到离开楼梯(可以下端或上端),需要多少时间?
解题思路
首先假如有
证明:
假如在从上往下数第
你会发现一个事实,假如我最后要从上方走出,那么我这个位置上方(包括自己)的D的数量小于等于自己下方U的数量。
即
得证。
然后呢?
假如某个位置上方有个D,但是他要从上方离开,会出现什么情况。
假如序列是这样的:
UUDDUDUDU
我要从第5格出发。
8个时刻过后
UDDDUUUDU
而且回到了第5格。
看看交换了什么,从上往下第4格以及从上往下第4个U。
8个时刻意味着什么?
从上往下第4格以及从上往下第4个U位置差*2。
因为每个位置都经过了两边,所以,只有两个位置交换符号,其他不变。
接着就一直交换,直到这个位置往上都是U。
答案就是,交换的代价+最后全U往上的代价。
D同理。
参考代码
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define maxn 1000005#define ll long longusing namespace std;int n;char s[maxn];int a[maxn];ll ans[maxn];int main(){ scanf("%d",&n); fo(i,1,n) { char c=getchar(); while (c!='U' && c!='D') c=getchar(); s[i]=c; } a[0]=0; fo(i,1,n) if (s[i]=='D') a[++a[0]]=i; ll tot=0; fo(i,1,a[0]) { tot+=(a[i]-i) * 2; ans[i]=i+tot; } a[0]=0; fd(i,n,1) if (s[i]=='U') a[++a[0]]=i; tot=0; fo(i,1,a[0]) { int w=n-i+1; tot+=(w-a[i]) * 2; ans[w]=i+tot; } fo(i,1,n) printf("%lld ",ans[i]); return 0;}
2 0
- codeforces 733E
- Codeforces 733e
- codeforces 733E (数学)
- CodeForces 733E Sleep in Class
- CODEFORCES 733E Sleep in Class
- 【Codeforces 733E】 Sleep in Class 【模拟】
- Codeforces 733E Sleep in Class【思维】
- 【codeforces 733E】Sleep in Class 题解
- codeforces 163E e-Government
- 【Codeforces 163E】E-Government
- Codeforces 78E Evacuation
- 【dp】codeforces 83E
- Codeforces 124 E
- Codeforces 231E
- Codeforces 231E - Cactus
- Codeforces #163 Div2 E
- codeForces 35E
- Codeforces 35E
- Android 5.1源码编译环境搭建
- 使用ProxyFactoryBean创建AOP代理
- JavaScript游戏——五子棋
- 算法设计与分析——第四篇,分治法
- Lua使用luasocket http请求例子
- codeforces 733E
- Java Iterator的remove方法
- Codeforces Round #378 (Div. 2) 733CEpidemic in Monstropolis
- 软工文档总结篇(二)
- linux下gcc库的使用
- 大规模分布式存储系统: 问题, 概念, 及领域语言
- HDU:1280 前m大的数
- ionic android打包,签名
- Java 标识符及基本数据类型