[NOIP集训]10月22日

今天的文件夹:10月22日.zip

并查集、哈希表是很有意思的算法,不过更好的是,今天的题我以前都A掉了~

T1:这题最省事的是用STL库的map,然后并查集水过。当然用自己写的Hash函数通过也没有压力。

T2:注意这题不要想复杂了,题中的判断规则只有一层,没必要考虑“敌人的敌人的朋友的敌人的朋友的敌人的敌人”这类情况,直接大暴力。数据结构采用并查集,先合并朋友,然后将敌人关系存为一张图,对图中的每个点,把它的所有敌人两两合并。最后输出集合个数。

T3:按顺序打击不好处理,我们倒过来看,相当于逆序依次加入团伙。这就可以并查集模拟了,每加入一个团伙,把和它有关系的团伙合并,然后判断最大集合的大小是否超过一半。最后输出的是(总团伙数-能满足此条件的最多加入的团伙数)。

代码:


 1 #include <iostream>
 2 #include <string>
 3 #include <map>
 4 using namespace std;
 5 #define FOR(i,n) for (int i=0;i<n;i++)
 6 map<string,int> hash;
 7 int father[1000001]={0};
 8 int get_father(int x)
 9 {
10     if (father[x]==x) return x;
11                  else return get_father(father[x]);
12 }
13 void set_union(int x,int y)
14 {
15     int ls1=get_father(x),ls2=get_father(y);
16     father[ls1]=ls2;
17     return;
18 }
19 bool set_same(int x,int y)
20 {
21     return (get_father(x)==get_father(y));
22 }
23 int main()
24 {
25     freopen("cc.in","r",stdin);
26     freopen("cc.out","w",stdout);
27     int n,m,p,cnt=0;
28     cin>>n>>m>>p;
29     FOR(i,n)
30     {
31         string ls;
32         cin>>ls;
33         father[cnt]=cnt;
34         hash[ls]=cnt++;
35     }
36     FOR(i,m)
37     {
38         string ls1,ls2;
39         cin>>ls1>>ls2;
40         set_union(hash[ls1],hash[ls2]);
41     }
42     FOR(i,p)
43     {
44         string ls1,ls2;
45         cin>>ls1>>ls2;
46         if (set_same(hash[ls1],hash[ls2]))
47            cout<<"safe"<<endl;
48         else
49             cout<<"cc cry"<<endl;
50     }
51     return 0;
52 }

cc.cpp


 1 program group;
 2 type
 3     node=record
 4         data:longint;
 5         father:longint;
 6     end;
 7 var
 8     a:array[1..1000] of node;
 9     b:array[1..1000] of longint;
10     p:array[1..1000,1..1000] of integer;
11     i,j,k,l,m,n,x,y:longint;
12 procedure init();
13 var
14     i:longint;
15 begin
16     fillchar(p,sizeof(p),0);
17     for i:=1 to n do
18     begin
19         a[i].father:=i;
20         a[i].data:=i;
21     end;
22 end;
23 function find(x:longint):longint;
24 var
25     i,j,k:longint;
26 begin
27     i:=x;
28     while (a[i].father<>i) do
29         i:=a[i].father;
30     k:=i;
31     i:=x;
32     while (i<>k) do
33     begin
34         j:=a[i].father;
35         a[i].father:=k;
36         i:=j;
37     end;
38     exit(k);
39 end;
40 procedure union(x,y:longint);
41 var
42     i,j,p,q,k:longint;
43 begin
44     p:=find(x);
45     q:=find(y);
46     a[q].father:=p;
47 end;
48 begin
49     assign(input,‘group.in‘);
50     reset(input);
51     assign(output,‘group.out‘);
52     rewrite(output);
53     readln(n,m);
54     init();
55     for i:=1 to m do
56     begin
57         readln(k,x,y);
58         if k=1 then
59         begin
60             p[x,y]:=1;
61             p[y,x]:=1;
62         end else
63             union(x,y);
64     end;
65     for i:=1 to n do
66         for j:=1 to n do
67             if p[i,j]=1 then
68                 for k:=1 to n do
69                     if (p[j,k]=1)and(k<>i)and(find(i)<>find(k)) then
70                         union(i,k);
71     fillchar(b,sizeof(b),0);
72     for i:=1 to n do
73         inc(b[find(i)]);
74     l:=0;
75     for i:=1 to n do
76         if b[i]>0 then
77             inc(l);
78     writeln(l);
79     close(input);
80     close(output);
81 end.

group.pas


 1 program black;
 2 var
 3     father:array[1..1000] of longint;
 4     count:array[1..1000] of longint;
 5     connect:array[1..1000,1..1000] of boolean;
 6     sum:longint;
 7     n:longint;
 8     i,j,k:longint;
 9 function getfather(x:longint):longint;
10 begin
11     if father[x]=x then
12         exit(x);
13     father[x]:=getfather(father[x]);
14     exit(father[x]);
15 end;
16 procedure union(x,y:longint);
17 var
18     fx,fy:longint;
19 begin
20     fx:=getfather(x);
21     fy:=getfather(y);
22     if fx=fy then
23         exit();
24     father[fy]:=fx;
25     count[fx]:=count[fx]+count[fy];
26     count[fy]:=0;
27 end;
28 begin
29     assign(input,‘black.in‘);
30     reset(input);
31     assign(output,‘black.out‘);
32     rewrite(output);
33     readln(n);
34     for i:=1 to n do
35     begin
36         father[i]:=i;
37         count[i]:=1;
38     end;
39     fillchar(connect,sizeof(connect),0);
40     for i:=1 to n do
41     begin
42         read(sum);
43         for j:=1 to sum do
44         begin
45             read(k);
46             connect[i,k]:=true;
47             connect[k,i]:=true;
48         end;
49     end;
50     for i:=n downto 1 do
51     begin
52         for j:=i to n do
53         begin
54             if not(connect[i,j]) then
55                 continue;
56             union(i,j);
57         end;
58         for j:=1 to n do
59             if count[j]>n div 2 then
60             begin
61                 writeln(i);
62                 halt;
63             end;
64     end;
65     close(input);
66     close(output);
67 end.

black.pas

时间: 2024-10-27 03:17:05

[NOIP集训]10月22日的相关文章

[NOIP集训]10月16日

今天的文件夹:10月16日.zip 毕竟是第一天,题目比较简单,简单说下做法. T1:对区间按左端点为第一关键字,右端点为第二关键字进行排序,然后计算可合并的区间,即前面区间的右端点不小于后面区间的左端点,这样合并后,新区间的右端点为二者右端点中的较大值. T2:这题跪了一次.样例太有误导性,严重差评.题意是 询问在时间$[x,y]$内海浪高度第$K$小的单位时刻是那个时刻. 但由于样例太弱,错以为是 询问在时间$[x,y]$内海浪高度第$K$小的海浪高度值. 除了这个问题,别的都很简单了,抽出

[NOIP集训]10月19日

今天的文件夹:10月19日.zip 今天中午讲了一下昨天的题,还是有水平的. 下午复习搜索,居然有NOI难度的题,不过给了讲解,也有参考程序,就不多说了.主要说说第一题. T1:这是道BFS练手题,但都写不对.第一个难点是读入,虽然题目中给的读入顺序很吓人,但仔细想想,就类似于“字典序比较”了.在Pascal中可以直接这样读入: for i:=1 to l do for j:=1 to w do for k:=1 to h do read(a[i,j,k]); 读入之后,按照与读入相同的顺序进行

[NOIP集训]10月18日

今天的文件夹:10月18日.zip 今天脑子转不起来,想不出来动规了. Orz @张翰文学神 T1:快排,然后求连续数字的长度,简单判断即可. T2~T4:容我再想两天... T2原题: 题2. 养zsc(pig.pas/c/cpp) [题目描述] 你有一个zsc圈,有N头zsc,每天你最多可以杀一头zsc卖钱,获益就是zsc的体重.但是每过一天每头zsc的体重都会下降P[i](当然,如果zsc体重<=0了,自然获利就是0),问K天内你的最大获利. [输人文件] 第一行两个数N.K: 第二行N个

中级学员:2015年10月22日作业

中级学员:2015年10月22日作业一.采购管理1.采购管理的主要过程:2.工作说明书与范围说明书的区别:3.招投标程序是什么:4.采购审计的定义和内容.二.信息(文档)和配置管理1.文档从项目周期角度分为哪三类:2.图表编号规则,说明之:3.配置管理活动和流程:4.简述四种配置库及主要内容:5.简述配置项版本号标识的内容:6.功能配置审计包括哪些内容:7.物理配置审计包括哪些内容. 最晚提交时间:下次上课前. 提交方法:同学们按照要求完成作业,并发布在自己的51CTO博客,并将博文地址以评论的

10月22日全球域名商解析新增保有量TOP16:万网第二

IDC评述网(idcps.com)10月26日报道:根据DailyChanges公布的最新数据显示,在2015年10月22日,全球域名解析新增保有量十六强名单,与上期10月15日对比,发生明显变化.其中,易名中国夺冠,中国万网居亚,排名均上升1位,新增保有量依次为22,569个.14,162个.下面,请看IDC评述网整理的具体数据情况. (图1)全球域名解析商(国际域名)新增保有量TOP16分布图 如图1所示,可获悉在10月22日,全球域名解析新增保有量十六强分别是易名中国.中国万网.NAME-

APICloud IDE 10月22日更新补丁:

APICloud   IDE  10月22日更新补丁:IDE自动更新方法:1.重启IDE2.点击更新图标 本次更新:1.解AJAX请求201状态码问题.转义字符兼容问题2.解滚动到底部事件多次回调,并与弹动冲突问题3.解监听事件中手势无法识别问题4.scanner模块:重复open偶现崩溃5.circularMenu模块:半径问题适配6.slider模块:添加lock接口7.timeSelector模块:ios界面修改 文档 case8.periodSelector模块:ios界面修改 文档 c

10月22日全球六大国际域名解析量变化情况统计报告

IDC评述网(idcps.com)10月26日报道:根据DailyChanges公布的实时数据显示,截止至2015年10月22日,全球六大国际域名解析总量达到155,469,473个,环比上期10月15日净增335,386个,涨幅增大84%,增势明显.其中,需要注意的是,.BIZ与.US的域名总量持续下降,环比依次净减3,796个.2,622个. (图1)全球六大国际域名解析量变化统计分布图 由图1可知,10月22日全球六大国际域名解析量变化分布情况,环比上期10月15日,.COM与.NET明显

10月22日 正方形

题目 1177.正方形 时间限制:1000MS内存限制:64000KB 题目描述 又到暑假啦,Conan, Ayumi, Mitsuhiko, Genta一起到Hakase家愉快玩耍(然而你却不行……).Ayumi, Mitsuhiko, Genta依次开始画正方形(显然Ai是不会参加这个活动的),一人一笔,画完一个,以上一个正方形四边中点为顶点接着画啊画啊画啊……最后一共画了k个正方形.最终他们想知道自己各画了多长. [样例解释] 输入 输入一行包含两个整数N,K,分别表示第一个正方形的边长,

2015年10月22日CSS学习笔记

XHTML1.0对HTML4.0的改进 借鉴了XML的写法,语法更加严格. 把页面的内容和样式分离了,废弃了html4中的表示样式的标签和属性.推荐使用css来描述页面的样式. CSS样式的优先级 !important>内联样式>内部/外部样式>浏览器预定义样式 内部外部样式:#id>类选择器>元素选择器 内联样式要尽量少用:内部样式可以适量的使用,例如如果只有一个页面使用样式的情况下就没必要专门做一个外部样式:推荐使用外部样式,但是也不要太多,否则头重脚轻,显示页面的时候可