Codeforces Round #424 (Div. 2) D 思维 E set应用,树状数组

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

D. Office Keys

题意:一条直线上,有个办公室坐标 p,有 n个人在a[i],有 k把钥匙在b[i],每个人必须拿到一把钥匙,然后到办公室。问怎么安排花的时间最短。

tags:还是不懂套路啊。。其实多画两下图就能够感觉出来,2333

关键是要看出来,n个人拿的 n把钥匙应该是连续的。

然后,就是瞎暴力。。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,b,a) for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 2005;

int n, k;
ll  p, a[N], b[N];
int main()
{
    scanf("%d %d %lld", &n, &k, &p);
    rep(i,1,n) scanf("%lld", &a[i]);
    rep(i,1,k) scanf("%lld", &b[i]);
    sort(a+1, a+1+n);
    sort(b+1, b+1+k);
    ll  ans=1e18;
    for(int cb=1; cb+n-1<=k; ++cb)
    {
        ll ans1=0;
        rep(i,1,n)
        {
            ans1 = max(ans1, abs(a[i]-b[cb+i-1])+abs(b[cb+i-1]-p));
        }
        ans=min(ans, ans1);
    }
    printf("%lld\n", ans);

    return 0;
}

E. Cards Sorting

题意:n 个数,操作:每次取出头一个数,如果是这些数中最小的就删除,如果不是就放到底部。 问要多少次操作才能全部删除这 n个数。

tags:利用set和树状数组,快速模拟操作。一开始思路错了,想的是for一遍,每个数的会对前面比它大的数产生贡献,最后发现不行,白折腾半小时,心累

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,b,a) for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 100005;

struct Bit
{
    int bi[N];
    void add(int x, int y) { for(; x<N; x+=x&-x) bi[x]+=y; }
    ll  sum(int x) { ll ans=0; for(; x>0; x-=x&-x) ans+=bi[x]; return ans; }
}bit;
int n, a[N];
set<int > se[N];
int main()
{
    scanf("%d", &n);
    rep(i,1,n)
    {
        scanf("%d", &a[i]);
        se[a[i]].insert(i);
        bit.add(i, 1);
    }
    ll  ans=0;
    int now=1, mi=1;
    rep(ci,1,n)
    {
        while(se[mi].empty()) ++mi;
        if(se[mi].lower_bound(now)!=se[mi].end())
        {
            int pos=now;
            now = *se[mi].lower_bound(now);
            ans += bit.sum(now)-bit.sum(pos-1);
        }
        else
        {
            int pos=now;
            now = *se[mi].lower_bound(1);
            ans += bit.sum(n)-bit.sum(pos-1)+bit.sum(now);
        }
        se[mi].erase(now);
        bit.add(now, -1);
    }
    printf("%lld\n", ans);

    return 0;
}
时间: 2024-10-12 12:40:14

Codeforces Round #424 (Div. 2) D 思维 E set应用,树状数组的相关文章

Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+树状数组

C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/problem/C Description Iahub likes trees very much. Recently he discovered an interesting tree named propagating tree. The tree consists of n nodes numb

Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 树状数组

D. Mishka and Interesting sum 链接: http://codeforces.com/problemset/problem/703/D 题意: 给一个序列 每次询问一个区间 求区间中出现次数为偶数次的数的异或和 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<map> 5 using namespace std; 6 7 str

Codeforces Round #227 (Div. 2)---E. George and Cards(贪心, 树状数组+set维护, 好题!)

George is a cat, so he loves playing very much. Vitaly put n cards in a row in front of George. Each card has one integer written on it. All cards had distinct numbers written on them. Let's number the cards from the left to the right with integers f

Codeforces Round #365 (Div. 2) D.Mishka and Interesting sum 树状数组+离线

D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes input standard input output standard output Little Mishka enjoys programming. Since her birthday has just passed, her friends decided to present her wit

Codeforces Round #609 (Div. 2)E--K Integers(贪心+二分+树状数组+逆序对)

K Integers 参考博客:https://blog.csdn.net/Q755100802/article/details/103664555 [题意] 给定一个1到n的排列,可以交换相邻的两个元素. 现在定义一个函数f(x),表示在原排列中,通过交换操作,形成一个1,2,3....x的排列的子串,需要的最小操作步骤. 子串意味着这个排列必须是相邻的.现在你需要求出f(1),f(2),f(3)......f(n). [分析] 在1~x这几个元素相邻的情况下,因为最后排列不存在逆序对,根据贪

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

Codeforces Round #424 (Div. 2) E. Cards Sorting(线段树)

题目链接:Codeforces Round #424 (Div. 2) E. Cards Sorting 题意: 将n个数放进一个队列,每次检查队首,看看是不是队列中最小的数,如果是就扔掉,如果不是就放到队尾. 这样直到队列为空,为需要操作多少次. 题解: 考虑用两个指针模拟,最开始now指针指向第一个数,然后nxt指针指向下一个将要被删除的数. 然后我们要算出这里需要移动多少步,然后删掉这个数,一直重复操作,直到将全部的数删完. nxt指针可以用set来维护,now指针可以用并查集来维护. 计

Codeforces Round #423 (Div. 2) C 思维,并查集 或 线段树 D 树构造,水

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction   思维,并查集 或 线段树 题意:一个字符串被删除了,但给出 n条信息,要还原出可能的字典序最小的字符串.信息有:字符串ti,ki个位置xi,表明原本的字符串在xi位置是以字符串ti开头的. tags:惨遭 fst,一开始把所有字符串都存下来,排序做的,结果爆内存了.. 方法1: 考虑并查集,对于字符串 ti,在位置xi,