Codeforces Round #707 --Div. 2
A. Alexey and Train
链接:https://codeforces.com/contest/1501/problem/A
题目大意
给你一个火车的时间表(包括预计到达时间,预计出发时间),再给你一个组数,表示每站到达的延迟时间。火车出发需要满足两个条件。
1.最少等待(预计出发时间-预计到达时间)/2的时间(向上取整)。
2.出发时间>=预计出发时间
解题思路
每次实际出发时间>预计出发时间才对后续到站出站有影响,存一下实际出发时间-预计出发时间的差值,加在下一站到站时间上。
代码
#include
#include
#define x first
#define y second
using namespace std;
const int N = 110;
typedef pair PII;
PII que[N];
int c[N],to[N];
int n,t,res;
void solve()
{
int last = 0;
for( int i = 1 ; i <= n ; i++ )
{
int l = que[i].x , r = que[i].y;
int d = (r-l+1)/2;//等待时间
l += c[i] + d + last;//等待时间+上一站延迟时间+预计到达时间 = 下一次出发时间
if( l >= r )
{
last = l - r;//实际出发时间和预计出发时间的差值
}
else last = 0;//不符合条件则下一站正常
if( i == n )
cout<>t;
while( t-- )
{
cin>>n;
for( int i = 1; i <= n ; i++ )
{
int a,b;
cin>>a>>b;
que[i].x = a, que[i].y = b;
to[i] = b - a;
}
for( int i = 1 ; i <= n ; i++ ) cin>>c[i];
solve();
}
return 0;
}
B. Napoleon Cake
链接:https://codeforces.com/contest/1501/problem/B
题目大意
层层垒面包,面包上有抹奶油和不抹奶油两种选择,如果抹奶油会给出该层奶油可以向下渗透多少层,问最后蛋糕奶油渗透情况,被渗透为1,不被渗透为0。
解题思路
直接模拟
倒推面包情况,在抹奶油的过程中遇到新的抹奶油情况时,二者渗透层数取最大值接着往下走。注意下标不要越界。
差分
求出左右边界,分别标记一下,再对差分数组求前缀和,对于差分数组里大于1的部分一律视作1打印。
模拟代码
#include
#include
#include
#include
#define x first
#define y second
using namespace std;
const int N = 2*(1e5+10);
int q[N];
int a[N];
int main(void)
{
int t;
cin>>t;
while( t-- )
{
int n;
cin>>n;
for( int i = 1 ; i <= n ; i++ )
{
scanf("%d",&a[i]);
}
for( int i = n , k = 1; i >= 1 ; )
{
if( a[i] == 0 )
{
q[k++] = 0;
i--;
}
else
{
int cnt = a[i]-1;
q[k++] = 1;
i--;
while( cnt--&&i>=1 )//一直RE,原来是数组下标一直减少越界了。
{
if( a[i]!=0 )
{
cnt = max(cnt,a[i]-1);
q[k++] = 1;
i--;
}
else
{
q[k++] = 1;
i--;
}
}
}
}
for( int i = n ; i >= 1 ; i-- ) cout<
利用差分+前缀和代码
#include
#include
#include
#include
#define x first
#define y second
using namespace std;
const int N = 2*(1e5+10);
int q[N];
int a[N];
void insert(int l,int r)
{
q[l] += 1;
q[r+1] -= 1;
}
int main(void)
{
int t;
cin>>t;
while( t-- )
{
int n;
cin>>n;
for( int i = 1; i <= n ;i++ ) scanf("%d",&a[i]);
for( int i = 1; i <= n ; i++ )
{
if( a[i]!=0 )
{
int cnt = a[i]-1;
int l = i - cnt;
if( l < 0 ) l = 1;
insert(l,i);
}
}
for( int i = 1 ; i <= n ; i++ ) q[i] += q[i-1];
for( int i = 1 ; i <= n ; i++ )
{
if( q[i] >= 1 ) cout<<1<<" ";
else cout<