2016年提高组模拟试题(20161116) 《逍遥游》ssl 2581 奇葩

Description

北冥有YMW,其名为鲲。鲲之大,不知其几千里也;化而为鸟,其名为YMW。YMW之背,不知其几千里也;怒而飞,其翼若垂天之云。是鸟也,海运则将徙于南冥,南冥者,天池也。
《齐谐》者,志怪者也。《谐》之言曰:“今有N个数也,水击三千里,出现次数过N div 2者,是以吾想求众数者也。”此众数可佑NOIP场上平安,故请求。

Input

  第1行一个正整数n。
  第2行n个正整数用空格隔开。

Output

  一行一个正整数表示那个众数。

分析

放一个连接——摩尔投票法

代码

const
  maxe=40000;
  maxv=2000000;

type
  rec=record
    x,y,w,next:longint;
    flag:boolean;
end;

var
  n,m,nm:longint;
  a:array[1..maxv] of rec;
  f:array[1..maxv] of longint;
  ls:array[1..maxv] of longint;
  dfn:array[1..maxv] of longint;
  tot,num:longint;
  i,j,k:longint;
  ans:longint;
  zz,zz1,zz2,zz3:longint;
  s:string;

procedure dfs(r:longint);
var
  i,j,k:longint;
begin
  tot:=tot+1;
  dfn[r]:=tot;
  i:=ls[r];
  while i<>0 do
    with a[i] do
      begin
        if not flag
          then begin
            flag:=true;
            a[w].flag:=true;
            if dfn[y]=0 then dfs(y);
          end;
        i:=next;
      end;
end;

procedure add(x,y:longint);
begin
  m:=m+1;
  a[m].x:=x;
  a[m].y:=y;
  a[m].w:=m+1;
  a[m].next:=ls[x];
  ls[x]:=m;
  m:=m+1;
  a[m].x:=y;
  a[m].y:=x;
  a[m].w:=m-1;
  a[m].next:=ls[y];
  ls[y]:=m;
end;

begin
  readln(n,nm);
  m:=0; num:=0;
  for i:=1 to nm do
    begin
      readln(j,k);
      add(j,k);
    end;
  readln(zz2);
  zz3:=0;
  for i:=1 to zz2-1 do
    begin
      read(zz);
      zz1:=0;
      readln(s);
      if s[length(s)]<>' ' then s:=s+' ';
      delete(s,1,1);
      k:=pos(' ',s);
      while k<>0 do
        begin
          val(copy(s,1,k-1),j);
          delete(s,1,k);
          k:=pos(' ',s);
          zz1:=zz1+1;
        end;
      if (i=1) then continue;
      if zz1 xor zz=zz3
        then writeln('Disconnected')
        else begin
          zz3:=zz3+1;
          writeln('Connected');
        end;
    end;
  read(zz);
  zz1:=1;
  readln(s);
  if s[length(s)]<>' ' then s:=s+' ';
  delete(s,1,1);
  k:=pos(' ',s);
  while k<>0 do
    begin
      val(copy(s,1,k-1),f[zz1]);
      delete(s,1,k);
      k:=pos(' ',s);
      zz1:=zz1+1;
    end;
  zz1:=zz1-1;
  if zz1 xor zz=zz3
    then writeln('Disconnected')
    else begin
      zz3:=zz3+1;
      writeln('Connected');
    end;
  for j:=1 to zz1 do
    begin
      k:=f[j] xor zz3;
      a[k*2-1].flag:=true;
      a[k*2].flag:=true;
    end;
  dfs(1);
  ans:=0;
  for i:=1 to n do
    if dfn[i]<>0 then ans:=ans+1;
  if ans=n then writeln('Connected')
           else writeln('Disconnected');
  close(input);
  close(output);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值