2017.07.11【NOIP提高组】模拟赛B组小结

来源:互联网 发布:蓝月传奇淘宝礼包 编辑:程序博客网 时间:2024/06/08 04:44

T1jzoj1279. 解题

Description

  过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目.精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场并且象普通人一样找到了工作. 他们的月薪是M (1 <= M <= 1000) 元.
  他们的题目是一流的难题,所以他们得找帮手.帮手们不是免费的,但是他们能保证在一个月内作出任何题目.每做一道题需要两比付款, 第一笔A_i(1 <= A_i <= M)元在做题的那一个月初支付, 第二笔B_i元(1 <= B_i <= M)在做完后的下一个月初支付. 每一个月牛们用上一个月挣的钱来付款. 牛没有任何存款意识, 所以每个月的节余都回拿用去买糖吃掉了.
  因为题目是相互关连的,它们必须按大概顺序解出. 比如,题目3必须在解题目4之前或同一个月解出.   找出牛们做完所有题目并支付完所有款项的最短月数.

Input

  第一行: M 和 P
  第2…P+1行: 第i行包含A_i和B_i, 分别是做第i道题的欲先付款和完成付款.

Output

  第一行: 牛们做完题目和付完帐目的最少月数

Sample Input

100 5
40 20
60 20
30 50
30 50
40 40

Sample Output

6

Data Constraint

Hint

【样例说明】
牛们的月薪是100元. 他们有5道题目要做, 预期付款分别为 40, 60, 30, 30,
40, 完成付款分别为 20,本20, 50, 50, 40.
这里写图片描述
想法:
设f[k,i]为到了第k月,完成了i个任务后的最小欠费,f[k,i]=min(sum(b[j+1~i]))
(sum(a[j+1~i])+f[k-1,j]<=m),直到f[k,n]=0
伪标:
k:=1;
f[1,0]:=0;
for i:=1 to n do f[1,i]:=maxlongint div 2;
repeat
inc(k);
for i:=0 to n do
begin
f[k,i]:=maxlongint div 2;
for j:=i downto 0 do
begin
if sum[i]-sum[j]+f[k-1,j]<=m then
begin
f[k,i]:=sum1[i]-sum1[j];
break;
end;
end;
end;
until f[k,n]=0;

T2jzoj 3523. 【NOIP2013模拟11.7A组】JIH的玩偶(tree)

 Description

JIH的玩具厂设立以来,发展了一张销售关系网。这张网以玩具厂为总代理(根),构成一颗树。每个节点都代表一个客户,且每个节点都有重要度ai。JIH想将这些客户划成若干类别,当然同一类的客户重要度相差太大总是不妥。所以JIH决定先进行市场调研。JIH会选择两个客户X,从X向根走一共k个节点进行调查。调查的结果是这条路径上重要程度相差最大的两个客户的差值是多少。因为特殊需要,要求重要度大的客户必须在重要度小的客户后面(顺序为X到根,若序列为递减,则输出0,详情见样例)。

Input

第一行一个整数N 表示N个客户

第二行N个整数Ai 表示N个客户的重要程度(工厂是1)

第三行开始 共N-1行 每行2个整数 x,y 表示x的父亲是y

接着一行一个正整数Q,表示Q次调研

接着Q行,每行两个整数X,K。含义见题目表述。

Output

Q行,每行一个正整数,含义见题目描述。

Sample Input

6

5 6 1 7 5 2

2 1

3 1

4 2

5 2

6 3

3

4 3

6 2

6 3

Sample Output

0

0

4

Data Constraint

30% 的数据中N,Q<=1000

100%的数据中N,Q<=200000 Ai<=1000000
想法:
设father[i,j]表示第i个点的第2^j个父亲
p[i,j]为第i个点至它的第2^j-1个父亲的路径中的最大值
g[i,j]同p,最小值
f[i,j]为第i个点至它的第2^j-1个父亲的路径中(max-min)(max是min的祖先)的最大值
father[i,j]是从它的第2^(j-1)个父亲在跳2^(j-1)个父亲
p,g则是把路径拆成2半,求出最大值
f同p,然后再将上半部分的最大值-下半部分的最小值进行比较
father[j,i]:=father[father[j,i-1],i-1];
p[j,i]:=max(p[j,i-1],p[father[j,i-1],i-1]);
g[j,i]:=min(g[j,i-1],g[father[j,i-1],i-1]);
f[j,i]:=max(f[j,i-1],f[father[j,i-1],i-1]);
f[j,i]:=max(f[j,i],p[father[j,i-1],i-1]-g[j,i-1]);
求答案
k=logy
ans与f[x,k]进行比较
ans与p[x,k]-last比较
last与g[x,k]比较
x跳至它的第2^(k-1)个父亲
减y
更新k
k:=trunc(ln(y)/ln(2));
last1:=maxlongint div 2;
while y>0 do
begin
ans:=max(ans,f[x,k]);
ans:=max(ans,p[x,k]-last1);
last1:=min(last1,g[x,k]);
x:=father[x,k];
y:=y-1 shl k;
if y=0 then break;
k:=trunc(ln(y)/ln(2));
end;

T3jzoj3518. 【NOIP2013模拟11.6A组】进化序列(evolve)

Description

Abathur采集了一系列Primal Zerg 的基因样本,这些基因构成了一个完整的进化链。为了方便,我们用A0,A1…An-1 这n 个正整数描述它们。

一个基因Ax 可以进化为序列中在它之后的基因Ay。这个进化的复杂度,等于Ax | Ax+1…| Ay的值,其中| 是二进制或运算。

Abathur 认为复杂度小于M 的进化的被认为是温和的。它希望计算出温和的进化的对数。

Input

第一行包含两个整数n,m。

接下来一行包含A0,A1…An-1 这n 个正整数,描述这n 个基因。

Output

第一行包含一个整数,表示温和的进化的对数。

Sample Input

4 6

1 3 5 1

Sample Output

2

Data Constraint

对于30% 的数据,1 <= n <=1000。

对于100% 的数据,1 <= n<= 100000,0 <= m <= 2^30,1<= Ai<= 2^30。
想法:
一开始从1开始找到最大的点j使得(sum[1~j]<=m),sum为or运算的值
因为你每or一个数,值会越来越大,所以这是线性的
枚举起点i,然后求出sum[i~j],然后如果j合法的话不断加
如何快速求出sum[i~j]?
线段树维护