Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)

D题fst了,生无可恋。第二场rated的CF,打得精神恍惚

A. Unimodal Array

题意:判断数列是否是单峰的。

像题意那样分为三个阶段随便判一判就好了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,x[105],part=1;
bool f=1;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x[i]);
        if(part==1)
        {if(x[i]==x[i-1])part=2;else if(x[i]<x[i-1])part=3;}
        else if(part==2)
        {if(x[i]<x[i-1])part=3;else if(x[i]>x[i-1]){f=0;break;}}
        else if(part==3)
        {if(x[i]>x[i-1]){f=0;break;}else if(x[i]==x[i-1]){f=0;break;}}
    }
    if(f)printf("YES\n");
    else printf("NO\n");
    return 0;
}

B. Keyboard Layouts

题意:给出一个26个字母的对应方式, 将给定串由模式1转为模式2

模拟,判断一下大小写

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
char a[26],b[26],s[1001];
int map[26];
int main()
{
    scanf("%s%s%s",a,b,s);
    for(int i=0;i<26;i++)
    map[a[i]-‘a‘]=b[i]-‘a‘;
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]>=‘a‘&&s[i]<=‘z‘)cout<<(char)(map[(int)(s[i]-‘a‘)]+‘a‘);
        else if(s[i]>=‘A‘&&s[i]<=‘Z‘)cout<<(char)(map[(int)(s[i]-‘A‘)]+‘A‘);
        else cout<<s[i];
    }
    return 0;
} 

C. Jury Marks

D. Office Keys

题意:给出n个人,k把钥匙,和办公室所在位置,每个人都需拿到一把钥匙再去办公室,最小化他们之中的最大路程

没错…这题我fst了,二分边界开小了,并且某处忘记了j++,心痛

二分答案,然后贪心思路:直觉上可以知道人与钥匙一一对应是从左到右的,根据这点判断是否可行

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
typedef long long LL;
int n,k,p,a[1005],b[2005];
using namespace std;
LL dis(LL x,LL y){return abs(y-x)+abs(p-y);}
bool check(LL mid)
{
    int j=1;
    for(int i=1;i<=n;i++,j++)
    {
        while(j<=k&&dis(a[i],b[j])>mid)++j;
        if(j>k)return false;
    }
    return true;
}
int main()
{
    scanf("%d%d%d",&n,&k,&p);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=k;i++)scanf("%d",&b[i]);
    sort(a+1,a+1+n),sort(b+1,b+1+k);
    LL l=0,r=2000000000,ans;
    while(l<=r)
    {
        LL mid=(l+r)>>1;
        if(check(mid))ans=mid,r=mid-1;
        else l=mid+1;
    }
    printf("%I64d\n",ans);
    return 0;
}

E. Cards Sorting

F. Bamboo Partition

时间: 2024-10-12 20:38:33

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)的相关文章

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem F (Codeforces 831F) - 数论 - 暴力

Vladimir wants to modernize partitions in his office. To make the office more comfortable he decided to remove a partition and plant several bamboos in a row. He thinks it would be nice if there are n bamboos in a row, and the i-th from the left is a

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案

There are n people and k keys on a straight line. Every person wants to get to the office which is located on the line as well. To do that, he needs to reach some point with a key, take the key and then go to the office. Once a key is taken by somebo

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)E. Cards Sorting

题意:有n个数字,我遍历过去,如果他是当前最小值,就删除,否则放到最后面去,问得遍历多少个数字,(直到所有数字消失 思路:我们保存每个数字的位置,这个数字是否能删除,如果他在上一个数字的最后一个位置后面就可以删除了,那么标记下+树状数组(我这里的y表示的就是上一个数删除的最后一个位置) 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 6 int a[

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Cards Sorting(树状数组)

Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Vasily has a deck of cards consisting of n cards. There is an integer on each of the cards, this integer is between 1 and 100?0

【Splay】Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) B. Cards Sorting

Splay要支持找最左侧的最小值所在的位置.类似线段树一样处理一下,如果左子树最小值等于全局最小值,就查左子树:否则如果当前节点等于全局最小值,就查当前节点:否则查右子树. 为了统计答案,当然还得维护子树大小的函数. 找到位置以后,直接将左右子树交换即可.不需要打标记. 删除节点时,直接将其前驱(是指序列下标的前驱,就是将待删除节点Splay到根后,左子树的最右节点)Splay到根,将其后继(类似)Splay到根的儿子. 然后将后继的左儿子删除即可. 别忘了及时Maintain(); 这份代码的

【推导】Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) A. Office Keys

选择的钥匙一定是连续的,人和钥匙一定从左到右连续对应. 就枚举钥匙区间即可. #include<cstdio> #include<algorithm> using namespace std; int Abs(int x){ return x<0 ? (-x) : x; } int n,K,p,a[1010],ans=2147483647,b[2010]; int main(){ scanf("%d%d%d",&n,&K,&p);

A. Office Keys (from Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) )

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 using namespace std; 6 7 int a[150000]; 8 int b[150000]; 9 int dp[1005][1005]; 10 //dp[i][j] 前i个人从前j个药匙中到达终点的最小时间 11 12 int main() 13 { 14 in

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem A - B

Pronlem A In a small restaurant there are a tables for one person and b tables for two persons. It it known that n groups of people come today, each consisting of one or two people. If a group consist of one person, it is seated at a vacant one-seate

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals)D. High Load

题意:出n个点,其中k个叶子节点,问构造出的树最远的两个点最近是多少 思路:以一个点为中心,然后m个伸出,一层层扩散,(n-1)%m==k,如果k==0,即可以平分,长度就是2*(n-1)/m,如果取模为k==1,说明多出一个,+1,其他的话,就是最后一层补k个,但是最长的还是+2 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int n,m; 6 cin>>n>>m; 7 int