XJOI NOIP模拟题1

第一题

分析:

开始想的是贪心,取每列均值最大一段。

应该是01分数规划,具体看代码

代码:

program gold;
var
  a:array[0..100000]of int64;
  n,i,m,j,x:longint;
function max(x,y:real):real;
begin
  if x>y then max:=x else max:=y;
end;
function cheak(x:real):boolean;
var i,j:longint; s,ans:real;
begin
  ans:=0;
  for i:=1 to n do
   begin
    s:=-1000000000;
     for j:=1 to m do
      begin
       s:=max(a[(i-1)*m+j]-j*x,s);
      end;
    ans:=ans+s;
   end;
   if ans>=0 then exit(true)
    else exit(false);
end;

procedure work;
var l,r,mid:real;
begin
  l:=0; r:=1000000000;
  while l+0.00001<=r do
   begin
     mid:=(l+r)/2;
     if cheak(mid) then l:=mid
      else r:=mid;
   end;
  writeln(l:0:4);
end;
begin
  readln(n,m);
  for i:=1 to n do
   begin
    for j:=1 to m do
     begin
      read(x);
      if j=1 then a[(i-1)*m+j]:=x
       else a[(i-1)*m+j]:=a[(i-1)*m+j-1]+x;
     end;
   end;
  work;
end.

第二题

n最大10^5

分析:

第一反应是用图做,对相交城市连边再求最大团,这样显然是不够的。

稍经思考可以发现,这题跟火柴排队似乎有某种联系。

显然如果在上边一组中x在y左边,在下面一组城市x在y右边,两者必然相交。

如果底下一组是1 2 3 4 5有序的话,对于上面一组,如果x<y 而 x在y后面,则必有交点,实际上这就转化为了最长下降子序列问题,不过之前先要对上面一组对底下一组的排列进行映射。

代码:

program road;
var
  d,a,b,w:array[0..100000]of longint;
  n,i,m,len,j,k:longint;
function find(x:longint):longint;
var l,r,mid,ans:longint;
begin
  l:=1; r:=len; ans:=0;
  while l<=r do
   begin
     mid:=(l+r) div 2;
     if d[mid]<=x then begin ans:=mid; l:=mid+1; end
      else r:=mid-1;
   end;
  exit(ans);
end;
begin
  readln(n);
  for i:=1 to n do read(a[i]);
  for i:=1 to n do begin read(b[i]); w[b[i]]:=i; end;
  for i:=1 to n do a[i]:=w[a[i]];
  d[1]:=a[n]; len:=1;
  for i:=n-1 downto 1 do
   begin
     if a[i]>d[len] then begin inc(len); d[len]:=a[i]; end
      else
       begin
         j:=find(a[i]); k:=j+1;
         d[k]:=a[i];
       end;
   end;
  writeln(len);
end.

第三题:

n,t最大10^5

分析:

先按编号顺序后根遍历树,得到一个序列,这个序列就是向里面逐个进人依次占用的结点。

对于op=1操作用堆维护

对于op=2操作,用倍增找祖先,找到最远的被占用的祖先,将该点的人带走(实际上是带走x点人的等效),并加入堆。

为什么时间效率可以过呢

不考虑op=2只会加n个人故为nlog2(n),增加op=2操作,因为每次只走1个人,最多走t人,则最多重新来t个人,这时op=1情况时间效率增加t*log2(n)

op=2本身还要有t*log2(n)的时间,故总时间效率为O(n*log2(n))。

代码:

program queue;
type
  point=^node;
   node=record
      x:longint; next:point;
   end;

var
  f:array[0..25,0..100000]of longint;
  q,d,a,b,g:array[0..100000]of longint;
  r:array[0..200000]of longint;
  w:array[0..100000]of point;
  n,i,m,t,e,k:longint;
procedure use(x:longint);
var t,s,v:longint;
begin
  k:=k+1;  r[k]:=x; s:=k;
  while (s<>1)and(r[s div 2]>r[s]) do
   begin
     v:=r[s div 2]; r[s div 2]:=r[s]; r[s]:=v;
     s:=s div 2;
   end;
end;
function get:longint;
var t,s,v:longint;
begin
  get:=r[1]; r[1]:=r[k]; k:=k-1; t:=1;
  while (t*2<=k)or(t*2+1<=k) do
   begin
     if (t*2+1>k)or(r[t*2]<r[t*2+1])
     then s:=t*2 else  s:=t*2+1;
     if r[t]>r[s] then
      begin
        v:=r[t]; r[t]:=r[s]; r[s]:=v; t:=s;
      end
  else break;
   end;
end;
procedure make;
var i,j:longint;
begin
  for i:=0 to 24 do
   for j:=1 to n do
    f[i+1,j]:=f[i,f[i,j]];
end;
procedure dfs(x,fa:longint);
var p:point;y:longint;
begin
  new(p); p:=w[x]; f[0,x]:=fa;
  while p<>nil do
   begin
     y:=p^.x;
     if y<>fa then dfs(y,x);
     p:=p^.next;
   end;
  inc(m); q[m]:=x;
end;
procedure add(x,y:longint);
var p:point;
begin
  new(p); p^.x:=y; p^.next:=w[x]; w[x]:=p;
end;
procedure insert(x:longint);
var i,y:longint;
begin
  for i:=1 to x do
   begin
     y:=get; d[y]:=1;
   end;
  writeln(q[y]);
end;
procedure put(x:longint);
var i,s:longint;
begin
  s:=0;
  for i:=25 downto 0 do
   if (d[g[f[i,x]]]=1)and(f[i,x]>0)
    then begin x:=f[i,x]; s:=s+1 shl i; end;
  d[g[x]]:=0; use(g[x]); writeln(s);
end;
procedure solve;
var i,op,x:longint;
begin
  for i:=1 to t do
   begin
     readln(op,x);
     if op=1 then begin insert(x); end
      else begin put(x); end;
   end;
end;
procedure qsort(l,h:longint);
var i,j,t,m,m1:longint;
begin i:=l; j:=h;
 m:=a[(i+j) div 2]; m1:=b[(i+j) div 2];
 repeat
while (a[i]<m)or((a[i]=m)and(b[i]>m1)) do inc(i);
while (m<a[j])or((a[j]=m)and(m1>b[j])) do dec(j);
if i<=j then
  begin   t:=a[i]; a[i]:=a[j]; a[j]:=t;
    t:=b[i]; b[i]:=b[j]; b[j]:=t;
inc(i); dec(j);  end;  until i>j;
 if i<h then qsort(i,h); if j>l then qsort(l,j);  end;
begin
  readln(n,t);
  for i:=1 to n-1 do
    readln(a[i],b[i]);
  qsort(1,n-1);  m:=0;
  for i:=1 to n-1 do
    add(a[i],b[i]);
  for i:=1 to n-1 do begin e:=a[i]; a[i]:=b[i];b[i]:=e; end;
  qsort(1,n-1);
  for i:=1 to n-1 do
    add(a[i],b[i]);
  dfs(1,0);
  k:=0;
  for i:=1 to n do g[q[i]]:=i;
  for i:=1 to n do begin use(i); d[i]:=0; end;
  make;
  solve;
end.

时间: 2025-01-12 04:26:08

XJOI NOIP模拟题1的相关文章

[BZOJ入门OJ2092][Noip模拟题]舞会

2092: [Noip模拟题]舞会 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 9  Solved: 5 [Submit][Status][Web Board] Description 学校举行舞会啦,一共有N个人参加,所有人站成一排,从左开始编号,最左边的人编号为1 ,最右边的为N.每个人跳舞的熟练度我们用一个整数表示,第i个人的熟练度为Ai,每次熟 练度最接近的一对相邻男女会出列跳舞,如果有多对那么最左边的那一对会先出列,请你给 出出列跳

8.22 NOIP 模拟题

  8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc 4.9.2 fpc 2.6.2 评测环境 64 位 Linux, 3.3GHZ CPU 评测软件 Lemon 评测方式 忽略行末空格和回车 特别注意:c/c++ 选手使用 printf 输出 64 位整数请使用%lld 1 注意事项 A 债务 文件名                            输入文件             输出文件  

noip模拟题题解集

最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数 输入:输入文件只一行,两个正整数N,M( 1<N<50,2≤M≤5) 输出:输出文件只有一个正整数S,表示方案总数. 运用升格思想.设N个坑不会发生爆炸的方案数是f[N],那么我们假设N以前的坑的方案 都已知了,那么我们只需要考虑第N个坑如何放即可(顺

9.22 NOIP模拟题

吉林省信息学奥赛 2017 冬令营                                                                                                                                                                                                      day2 嗯 今天题目好水 嗯 今天爆零了好伤心...... 值得纪念

6.19 noip模拟题(题目及解析转自 hzwer 2014-3-15 NOIP模拟赛)

Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式] 第1行:一个整数n,表

【noip模拟题】天神下凡(贪心)

vijos某次模拟赛原题... 处理出每个圆的一级祖先就行了... 其实没有那么麻烦,贪心即可出解. 我们将每个圆转换成线段后按左端点小右端点大的方法排序 然后维护一个栈: 对于每一个圆i 如果栈顶右端点比圆i的右端点小,则出栈,直到栈空 否则i的一级祖先就是栈顶,并且加入i到栈. 证明: 因为左端点排序,所以问题转换为找一个最小的右端点能够包含此线段 假如栈顶的右端点比当前右端点小,显然对于所有将来的线段,不可能包含将来的线段(或者说,尽管能,也不是最优解,因为最优解就是当前i) 然后如果有n

【noip模拟题】挖掘机(模拟题+精度)

这题直接模拟. 可是我挂在了最后两个点上QAQ.唯一注意的是注意精度啊...用来double后边转成整数就忘记用longlong...sad #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> #include <

【noip模拟题】迎接仪式(dp+特殊的技巧)

好神的一题... 这是一道DP题,本题的难点在于状态的确定,由于调整是任意的,很难划分状态,我们略微修改一下调整的形式:把一次’j’和’z’交换看做两次变换:’j’->’z’;’z’->’j’ (zz交换和jj交换是没有意义的,不作考虑);于是最多’j’->'z' 'z'->'j'各K次. F[i,j,k]:=F[i-2,j-x,k-y]+1;If A[i-1]=j then x=0 else x=1If A[i]=z then y=0 else y=1 然后最后要看是否有那么多个

[2016.6.11] NOIP模拟题

T1:贪吃蛇snake [题目描述] 哲哲迷上了一个非常有意思的游戏,这个游戏的内容就是通过上下左右来操作一条蛇的前进,比方说,你现在正在向上走,而你按了一下右,那么这条蛇就会转向右走,很有趣吧!这个游戏的名字叫做贪吃蛇.但是,这个看起来简单的游戏也挺需要操作的,如果你不小心撞到了墙,或是撞到自己的身体的话,你就输了. 可是,哲哲由于手指灵活度不够,经常撞墙而死,所以,他自己设计了一个没有墙的贪吃蛇地图,地图可以表示成若干个点,而你可以操作蛇头从某一个一个点到它相邻的点上.这样,游戏的难度降低了