USACO2014OPEN牧场装饰(bronzeT3)

1. 牧场装饰{bronze3}

【问题描述】

农民约翰有N(1<= N<=50,000)牧场,分别编号为1... N。牧场由M(1<= M<=100,000)条双向道路连接。道路i连接两个不同的牧场牧场A_i(1<= A_I<= N)和牧场B_i(1<= B_i<= N)。同一对牧场之间可能有多条道路连接。

现对每个牧场摆放一块标有大写字母”F”或者”J”的广告牌进行装饰。两个有道路相连的牧场,必须摆放不同字母的广告牌。

“F”字母广告牌的价格要高于”J”字母的广告牌,所以约翰想最大化地使用”J”字母广告牌,请输出这个最大的数目,如果没有可行的摆放方案,则输出”-1”。

【文件输入】

第一行为两个整数N和M。

接下来2..M行,每行两个整数,描述M条双向道路。

【文件输出】

输出共一行,一个整数,表示”J”字母广告牌的最大数目,无解则输出”-1”。

【输入样例1】

4 4

1 2

2 3

3 4

4 1

【输出样例1】

2

【样例1说明】

牧场1和3,或者牧场2和4使用”J”字母广告牌。

刚看到题目就觉得和某年NOIP的关押罪犯非常的相似。

果然思路是差不多的……

就是用并查集把一条边的两个端点放到不同的两个集合中,即放到另一端点的“敌对集合”中去。

最后的统计需要特殊处理一下,因为不一定只剩下两个互相敌对的集合。有些集合之间可能是毫无关系的。

所以在两个互相敌对的集合中,应该取人数多的那个集合的人数加入答案中去。

如果有的点和其他端点没有任何关系,那么也需要把它加入答案中去。

var hate,father,final:array[0..50000] of longint;
 a,b,tot:array[0..100000] of longint;
 use:array[0..50000] of boolean;
  kk,ans1,ans2,i,t1,t2,x,j,n,m,k1,k2:longint;

function getfather(k:longint):longint;
var tip:longint;
begin
 if father[k]=k then exit(k);
 tip:=father[k];
 father[k]:=getfather(tip);
 getfather:=father[k];
end;

procedure qsort(aa,bb:longint);
var i,j,x,temp:longint;
begin
i:=aa;
j:=bb;
x:=final[(i+j) div 2];
repeat
 while final[i]<x do inc(i);
 while final[j]>x do dec(j);
 if i<=j then
  begin
  temp:=final[i];
  final[i]:=final[j];
  final[j]:=temp;
  inc(i);
  dec(j);
  end;
until i>j;
if i<bb then qsort(i,bb);
if aa<j then qsort(aa,j);
end;

begin
//assign(input,‘bronze.in‘);
//assign(output,‘bronze.out‘);
//reset(input);
//rewrite(output);
readln(n,m);
for i:=1 to n do father[i]:=i;
for i:=1 to m do
  readln(a[i],b[i]);
for i:=1 to m do
 begin
  t1:=getfather(a[i]);
  t2:=getfather(b[i]);
  if t1=t2 then
   begin
    writeln(‘-1‘);
    //close(input);
    //close(output);
    halt;
   end
  else
   begin
    if hate[t1]=0 then hate[t1]:=t2;
    if hate[t2]=0 then hate[t2]:=t1;
    x:=getfather(hate[t1]);
    father[x]:=t2;
    x:=getfather(hate[t2]);
    father[x]:=t1;
   end;
 end;
for i:=1 to n do final[i]:=getfather(i);
qsort(1,n);
for i:=1 to n do inc(tot[final[i]]);
for i:=1 to n do
 begin
  t1:=final[i];
  if tot[t1]<>0 then begin

if (hate[t1]<>0) and (not use[t1]) then
   begin
    if tot[t1]>tot[getfather(hate[t1])] then ans1:=ans1+tot[t1]
    else ans1:=ans1+tot[getfather(hate[t1])];
    use[t1]:=true;
    use[getfather(hate[t1])]:=true;
   end;
  if hate[t1]=0 then ans1:=ans1+tot[t1];

end;
 end;
writeln(ans1);
//close(input);
//close(output);
end.

(靠数据两次AC我也是伪了……)

(最近写题目的得分率真不是很高啊……NO 一次AC在复赛可是不行的啊……)

(早点改变这个状态吧!)

10.30

时间: 2025-01-07 02:05:39

USACO2014OPEN牧场装饰(bronzeT3)的相关文章

USACO翻译:USACO 2014 US Open 三题

USACO 2014 US Open 一.题目概览 中文题目名称 牧场装饰 里程表 牛像展览 英文题目名称 decorate odometer fairphoto 可执行文件名 decorate odometer fairphoto 输入文件名 decorate.in odometer.in fairphoto.in 输出文件名 decorate.out odometer.out fairphoto.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 1

Day4 - 迭代器&amp;生成器、装饰器、Json &amp; pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

python3 装饰器

看廖雪峰官网的python3装饰器有感 装饰器即将一个函数作为变量在新的函数中调用此函数. 作业: 能否写出一个@log的decorator,使它既支持: @logdef f():     pass 又支持: @log('execute')def f():     pass      例1: import functools import time def log(*args,**kwargs):     # *args 是个元组     if args and isinstance(args,

[BZOJ1602][Usaco2008 Oct]牧场行走

1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 2065  Solved: 1084[Submit][Status][Discuss] Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<

day14 带函数的装饰器、多个装饰器装饰一个函数

一.带参数的装饰器:------开关 __author__ = 'Administrator' F=True def outer(F): def wap(fun):#gg def inner(*args,**kwargs): if F: print("inner before") ret=fun(*args,**kwargs)#gg() print("inner after") else: ret=fun(*args,**kwargs) return ret ret

Python 装饰器

一.定义 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器本身可以是任意可调用对象,被装饰的对象本身也可以是任意可调用对象 实现装饰器: 装饰器=高阶函数+函数嵌套+闭包 二.原则: 1 .开放封闭原则:对扩展是开放的,对修改是封闭 2.1 装饰器的遵循的原则:1 不修改被装饰对象的源代码 2 不修改被调用对象的调用方式 三.目的 装饰器的目的是:在遵循1和2原则的前提,为其他新功能函数添加 四.定义位置 @装饰器名,必须写在被装饰对象的正上方,并且是单独一行 import time de

装饰器、生成器、迭代器

装饰器的前奏 装饰器:本质是函数 功能:就是装饰成其他函数  就是为其他函数添加附加功能的 高阶函数+嵌套函数=装饰器 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 总结一句话:装饰器对被装饰的函数是完全透明的 实现装饰器的只是储备: 1.函数名即"变量"   将函数体赋值给变量   和内存回收机制一样 2.高阶函数 2.1.把函数名作为实参传递给形参(可返回被修饰函数的地址)(不修改源代码的情况可添加新的功能) 2.2返回值中包含函数地址(不修改函数的调

python 装饰器的用法

为什么要使用装饰器? 在不改变原函数功能的情况,为了添加新的功能 我们可以在函数运行前后给函数添加新的功能 1 def outer(func): 2 #fun()等于原f1函数 3 def inner(): 4 print('ccccc') 5 r=func() 6 print('dddd') 7 return r 8 return inner 9 @outer 10 #@outer代表运行了2个步骤:1.将f1作为参数运行outer函数,2.新函数f1=inner() 11 def f1():

文本装饰

文本装饰--text-decoration属性 1.none             标准文本 2.underline        文本下划线 3.overline         文本下划线 4.line-though      文本删除线