。第一题。
现在有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<
}
第二题嗯
你可能已经听说了金发姑娘和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<
}