关押罪犯(noip2010)

解法:

(1)搜索(30分)

(2)二分(此题属于最大值最小问题)

(3)贪心+并查集

下面着重说一下“贪心+并查集”

因为有A、B两座监狱,每个犯人不是在A,就是在B监狱。

至于每个犯人在那个监狱,我们可以人为的指定,但在指定时要考虑和他有怨气的所有人,太复杂了!

反过来,我们可以从全局考虑:用x0表示x的反集合,y0表示y的反集合,也就是说如果不跟x同集合那就一定跟x0同集合,同理,如果不跟y同集合就一定跟y0同集合...

这样先排序,从大到小往不同的集合中添加边的两个端点,每次判断是否有冲突,若有冲突(说明该边的两个端点在前面比他大的边的分配中已经分配到同一个集合,那么该边就是符合要求的最大边),那么就输出,否则合并..

type
  node=record
       x,y,data:longint;
       end;

var
  n,m:longint;
  bo:boolean;
  a:array[0..100100]of node;
  f:array[0..40100] of longint;
  procedure init;
  var i:longint;
  begin
    bo:=false;
    readln(n,m);
    for i:=1 to m do readln(a[i].x,a[i].y,a[i].data);
  end;
  procedure qsort(l,r:longint);
  var mid,i,j:longint;t:node;
  begin
    mid:=a[(L+R)div 2].data;
    i:=l;j:=r;
    while i<j do
      begin
        while a[i].data<mid do inc(i);
        while a[j].data>mid do dec(j);
        if i<=j then begin  t:=a[i];a[i]:=a[j];a[j]:=t; inc(i);dec(j); end;
      end;
      if i<r then qsort(i,r);
      if j>l then qsort(l,j);
  end;
  function find(x:longint):longint;
  begin
    if f[x]=x then exit(x);
    if f[f[x]]=f[x] then exit(f[x]);
    find:=find(f[x]); f[x]:=find;
  end;
  procedure main;
  var i,x,y,x0,y0,nn:longint;
  begin
    nn:=n+n;
    for i:=1 to nn do f[i]:=i;
    qsort(1,m);
    for i:=m downto 1 do
      begin
        x:=a[i].x;y:=a[i].y;x0:=n+x;y0:=n+y;
        x:=find(x);y:=find(y);x0:=find(x0);y0:=find(y0);
        if (x=y){or(x0=y0)} then begin writeln(a[i].data);bo:=true;break;end;
        if x<>y0 then f[x]:=y0;
        if y<>x0 then f[y]:=x0;
      end;
  end;
begin
  assign(input,‘prison.in‘);reset(input);
  assign(output,‘prison.out‘);rewrite(output);
  init;
  main;
  if not bo then write(0);
  close(input);close(output);
end.

时间: 2024-10-31 14:03:24

关押罪犯(noip2010)的相关文章

noip2010(关押罪犯)

4844: Noip2010 关押罪犯 Time Limit: 4 Sec  Memory Limit: 128 MBSubmit: 18  Solved: 12[Submit][Status][Web Board] Description S城现有两座监狱,一共关押着 N名罪犯,编号分别为 1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至 积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值" (一个正整数值)来表示某两名罪犯之间 的仇恨程度,怨气值越大,则这两名罪犯之

NOIP2010提高组 关押罪犯 -SilverN

(洛谷P1525) 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件. 每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里.公务繁忙的

NOIP2010 提高组 洛谷P1525 关押罪犯

刚才做并查集想到了这道以前做的题,干脆一并放上来 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件. 每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到

tyvj P1403 关押罪犯 题解

P1403 [NOIP2010]关押罪犯 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时 可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯 被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件.    每年

贪心 + 并查集 之 CODE[VS] 1069 关押罪犯 2010年NOIP全国联赛提高组

/* 贪心 + 并查集 之 CODE[VS] 1069 关押罪犯  2010年NOIP全国联赛提高组 两座监狱,M组罪犯冲突,目标:第一个冲突事件的影响力最小. 依据冲突大小,将M组罪犯按从大到小排序,按照排序结果,依次把每组罪犯分开放入两个监狱, 直到当前这组罪犯已经在同一个监狱中了,此时即为答案. 实现: 1)通过不在同一个监狱的罪犯,推断出在同一个监狱的罪犯.(依据:一共就两个监狱)      ftr[b] = a+n   // a和b是在不同监狱 ftr[c] = a+n   // a和

Vijos P1776关押罪犯

题目来源:https://www.vijos.org/p/1776 P1776关押罪犯 Accepted 标签:NOIP提高组2010[显示标签] 描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c的冲

codevs 1069关押罪犯

传送门 1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamon 题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨 气值"(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之 间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他

1069 关押罪犯

codevs——1069 关押罪犯 洛谷——P1525 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨 气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之 间的积怨越多.如果两名怨

洛谷P1525 关押罪犯 并查集

无冲突 输出 0 洛谷P1525 关押罪犯 并查集 用拆点法 将一个点拆成两份 一个点和 x 的朋友相连 一个点和 x的敌人相连 若 x 与 y 是敌人 因为只有两个阵营 所以满足敌人的敌人就是朋友 然后 x 连向 y 的敌人 y 连向 x 的敌人 因为这是双向边 所以 y的朋友就是x的敌人就不用连了 如果某一时刻 getfather(e[ i ].from)==getfather(e[ i ].to) 这说明两个点已经是敌人关系的两个人 通过朋友关系连上了 那就结束了 1 #include <

洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]

P1525 关押罪犯 513通过 1.4K提交 题目提供者该用户不存在 标签图论并查集NOIp提高组2010 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 咳咳.竟MLE了. 囧.运行时错误,错误编号-… 点2是何方神圣? 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.