2025/4/16 心得

。第一题。

例题2.2.1 糖块

现在有n(1 <= N <= 1,000,000, N 是奇数)个盒子,编号是1..n。

数学老师决定让他做一个难题,他让小x对这些盒子做k(1 <=k <= 25,000)次放糖块的操作(这得多少糖块呀)。

数学老师每次会给小x一个区间[a,b],这时小x就会从编号是a的盒子到编号是b的盒子每个盒子都放一个糖块。

做完k次操作后,数学老师会问小x,在所有盒子的糖块个数中,这些糖块个数的中位数是多少。(最中间的值)。

因为n是奇数,所以这个答案肯定是唯一的。

输入格式

第一行:两个整数 n k。

接下来k行,每行一个区间 ai bi ,表示要放糖块的区间。

输出格式

一个整数,表示中位数的值。

样例数据

input


7 4

5 5

2 4

4 6

3 5



Copy

output


1

Copy

【样例解释】一共有7个盒子,4个操作,第一次在5号盒子里放1个,第二次在2 3 4号盒子里放。etc

放完糖块之后,盒子里的糖块依次是0,1,2,3,3,1,0.排过序后,数字1是中位数。

数据规模与约定

usaco 2011 stacking

时间限制:1 \text {s}1s

空间限制:256 \text {MB}256MB

这道题其实就是用差分。

先把每个区间内的都加一,然后最后再统计排序就可以了。

代码如下,

#include
using namespace std;
int n,m,a,b,sum[1000010],sum1[1000010];
int main()
{
    freopen("candy.in","r",stdin);
    freopen("candy.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b;
        sum[a]++;
        sum[b+1]--; 
    }
    sum1[0]=0;
    for(int i=1;i<=n;i++)
    sum1[i]=sum1[i-1]+sum[i];
    sort(sum1+1,sum1+1+n); 
    cout<     return 0;
}

第二题嗯

例题2.2.2 产奶的温度

你可能已经听说了金发姑娘和3只熊的经典故事。

鲜为人知的是,金发姑娘最终经营了一个农场。在她的农场,她有一个谷仓含N头奶牛(1<=N <= 20000)。不幸的是,她的奶牛对温度相当敏感。

第i头奶牛必须在指定的温度范围内A(i)..B(i)才感觉舒适;(0<=A(i)<=B(i)<= 1,000,000,000)。如果金发姑娘在谷仓放置一个温控器;如果温度T< A(i),牛会太冷,并将产生x单位牛奶。如果她把恒温器调到(A(i)<=T<=B(i))这个范围内,那么牛会感到舒适,并将产生Y单位牛奶。如果她把恒温器调到温度T>B(i),牛会感觉很热,并将产生的Z单位牛奶。正如预期的那样,Y的值总是大于X和Z。

给定的X,Y,和Z,以及每个牛的温度的最佳范围,如果金发姑娘设置谷仓的温控器最佳,请计算金发姑娘得到牛奶的最大数量,已知X,Y和Z都是整数,范围0..1000。温控器可以设置为任意整数的值。

输入格式

第1行:四个用空格隔开的整数:N X Y Z。

第2行..1 + N:行1+i包含两个用空格隔开的整数:A(i)和B(i)。

输出格式

1行:金发姑娘最多可以获得的牛奶,当她在谷仓的最佳温度设定。

样例数据

input


4 7 9 6

5 8

3 4

13 20

7 10





Copy

output


31

Copy

数据规模与约定

在农场里有4头奶牛,温度范围5..8,3..4,13..20,7..10。一个寒冷的奶牛生产7单位的牛奶,一个舒适的奶牛生产9个单位的牛奶,一个热牛生产6单位牛奶。

50%的测试数据:n<=5

其余50%的测试数据:10000< n <=20000.

时间限制:1 \text {s}1s

空间限制:256 \text {MB}256MB

这道题的主要

就是我们可以把这个分成三个,一低于二,除于三高于

嗯所以说呢我们有三个数据系统计。我们需要对每头牛的舒适区的温度进行讨论,如果某个温度舒适区一头牛在舒适区左端点,那么就等下有一头牛的产奶量从x变成y,如果某一个温度大于某头牛的舒适区,右端点的温度那么就等于驾驭一头牛的产奶量从y变成z。所以说呢我们就需要把左右端点分开来记录,然后呢再相应处理。

代码如下

#include
using namespace std;
int n,x,y,z;
struct A
{
    int x,d;
}a[40010];
long long summ[40010]={},ans=0LL;
bool mp(A a,A b)
{
    return (a.x }
int main()
{
    freopen("temp.in","r",stdin);
    freopen("temp.out","w",stdout);
    cin>>n>>x>>y>>z;
    for(int i=1;i<=n;++i)
    {
        cin>>a[i].x; a[i].d=y-x;
        cin>>a[i+n].x; ++a[i+n].x; a[i+n].d=z-y;
    }
    sort(a+1,a+1+(2*n),mp);
    int tott=0;
    summ[0]=1LL*n*x;
    for(int i=1;i<=(2*n);i++)
    {
        summ[++tott]=summ[tott-1]+a[i].d;
        while(a[i].x==a[i+1].x)++i,summ[tott]+=a[i].d;
        ans=max(ans,summ[tott]);
    }
    cout<     return 0;
}

你可能感兴趣的:(数据结构,算法)