9.22考试 crf的军训 题解

  做这道题时由于第一道题太水了,第一反应是NOIP T2级别的题,需要拿上70~100的分,然后就开始分析,当然最后事实证明我错了……

  这道题当时首先联想到了 NOIP2016愤怒的小鸟 当然,数据范围不允许,但是我当时只是为了先拿到小数据的分数,所以先没考虑数据范围,在这里简单提一下:首先我先枚举了每一个状态,然后判断这个状态中的书是否能连在一起,然后就是一个2^(2*n)的转移,好吧,我承认,不是正宗的愤怒的小鸟打法,是当时集中生智编出来的,但是对于n<=10的复杂度还是够用的。

  然后对于小于80(我自己假定的一个数据范围)打了一个小爆搜,挂了。

  对于大于80的,也就是对应的正解部分,我首先想到的是贪心,然而被我自己rand出来的数据和状压一对比卡掉了,然后以为是动归,想了半天也没写出转移方程,于是也跪了,然后就开始往图论那里想,却一无所获。但是由于前一天刚刚看完《骗分导论》,想着万一有一些点仁义的不去卡我贪心呢?于是就把贪心交了上去,结果全WA了,拿到数据后输出了贪心答案-2得了60分,事后想一想也是,贪心一定比正确答案只多不少,减去一些数可能就是正解。但当时谁能想到呢?



                  蒟蒻与正解的分割线                      



  现在我来说正解,二分图最小路径(链)覆盖,由于造数据的标程有误,我就只说最正确的了(在此鸣谢撸串神的发现)。

  我们在二分图上跑最小链覆盖有一个巨大的前提:这个图一定是DAG,然而此题由于是要求“不超过”,所以会有两个规格一模一样的书之间有环,不过由于两本相同的书一定可以放在一起,所以我们只要把他们缩一下就行。

  然后由于最小链覆盖=n-最大匹配,所以我们只要向能放在他之后的点建边即可,然后就是最大匹配了。

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 #include<algorithm>
 7 #include<cmath>
 8 #include<map>
 9 #include<vector>
10 #define N 305
11 using namespace std;
12 int n;
13 struct no
14 {
15     int x,y;
16 }node[N],node2[N];
17 int px(no a,no b)
18 {
19     if(a.x==b.x)return a.y<b.y;
20     return a.x<b.x;
21 }
22 struct ro
23 {
24     int to,next;
25 }road[N*N*10];
26 int zz,a[N];
27 void build(int x,int y)
28 {
29     zz++;
30     road[zz].next=a[x];
31     road[zz].to=y;
32     a[x]=zz;
33 }
34 bool fw[N];
35 int b[3*N];
36 bool find(int x)
37 {
38     for(int i=a[x];i>0;i=road[i].next)
39     {
40         int y=road[i].to;
41         if(!fw[y])
42         {
43             fw[y]=1;
44             if(!b[y]||find(b[y]))
45             {
46                 b[y]=x;
47                 return 1;
48             }
49         }
50     }
51     return 0;
52 }
53 int main()
54 {
55     scanf("%d",&n);
56     for(int i=1;i<=n;i++)
57     {
58         scanf("%d%d",&node2[i].x,&node2[i].y);
59     }
60     sort(node2+1,node2+n+1,px);
61     int zzh=0;
62     for(int i=1;i<=n;i++)
63     {
64         if(node2[i].x!=node[zzh].y||node2[i].y!=node[zzh].y)
65         {
66             zzh++;
67             node[zzh]=node2[i];
68         }
69     }
70     n=zzh;
71     for(int i=1;i<=n;i++)
72     {
73         for(int j=1;j<=n;j++)
74         {
75             if(i==j)continue;
76             if(node[i].x<=node[j].x&&node[i].y<=node[j].y)
77                 build(i,j);
78         }
79     }
80     int ans=0;
81     for(int i=1;i<=n;i++)
82     {
83         memset(fw,0,sizeof(fw));
84         if(find(i))
85             ans++;
86
87     }
88     printf("%d\n",n-ans);
89     return 0;
90 }

时间: 2024-07-30 20:07:08

9.22考试 crf的军训 题解的相关文章

9.22考试 crf的视察 题解

这道题当时第一反应就是一道典型的NOIP第一题的难度,绝对要A掉,不然分数一定会被拉开. 然后就开始分析,暴力是一开始想的是用二维树状数组打加上暴力美剧长度,然而这道题满足二分性质,所以时间复杂度就是log n^3*n^2,还是会T然后就发现完全可以不用树状数组,直接n^2预处理统计起来然后log n* n^2二分答案并验证就可以了.大概从考试开始到打完不到17分钟吧,个人感觉还是可以的. 1 #include<iostream> 2 #include<cstdlib> 3 #in

9.22考试 crf的数数 题解

这道题当时第一反应是线段树,但没有继续想,因为当时打完第一题打算这道题和第二道题并列做,打完第二道题状压后时间还有两个小时多,先打完暴力再说,打完之后又接着去想,然后想了5分多钟吧,扑街. 然后就发现这题似曾相识,有点像指针恒给我讲的分块"数颜色",于是如获至宝的打了一个标准的分块.然后满心期待的以为至少能拿60分以上,结果被丝薄数据卡的一分没得,好无良的出题人啊. 考完试后发现好多人拿莫队打了70分,才反应过来这道题可以拿莫队打,然而之前只是听Q某犇讲过莫队的原理,具体实现也没打过,

9.22考试总结

9.22考试总结 购物 这是一道可以DP可以贪心的题目.由于我DP不是很好一点不懂所以改题就没有用DP 因为考试的时候还是对这道贪心的题目思考的比较复杂.虽然最开始以为是一道邮票面值问题,但是到后面还是发现了它要用一定数目的邮票凑齐想要的面额 思路大概是先用小面值的钱凑出金额.如果当前凑出来的金额有同样大小的面值可以替换就加一张 可以凑出的面值为1~s的钱,我们想要去凑出面值为s+1的情况,所以说我们需要寻找一张面值为s+1的,如果没有,我们的选择将会是最大面值的,再用它(这个面值大的),去和其

9.5 考试 第二题 通讯题解

问题 B: 通讯 时间限制: 1 Sec  内存限制: 256 MB 题目描述 "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯 网络,传达到所有分部. SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线 路有一个固定的通讯花费Ci. 为了保密,消息的传递只能按照固定的方式进行:从一个已知消

9.18考试 第一题count题解

这道题说起来挺可惜的,当时纠结是用常数大但有可能减少递归层数的模还是用常数小但递归多的回溯纠结了好半天,最终错误的选择了摸.导致T了20分,改成回溯就A了. 先分析一下性质,我在考试的时候打表发现在数据范围内因子最多有240个,因此有可能是通过枚举因子进行计算,然后如果说对于一个块他的确可以把一棵树分为几块方法只有一种(不要问我为什么,我也不知道怎么证,但的确如此)那么我们的最坏复杂度就是O(240*n),比理论最大复杂度还多了一倍,这也是为什么当时我自己预估60分的原因,然而这就很尴尬了,这的

9.18考试 第二题Dinner题解

当时初步感觉是一个类似动归或者贪心的神题,然而由于本题已经给出顺序,贪心貌似并没有什么道理,所以放弃贪心.然后又由于这是一个环的问题,我想到了"合并石子"那种环转链的思路,然后就是一个O(n^2*m)的近似背包的打法,虽然没有去打,但应该可行吧-- 然后我又发现这道题貌似可以二分答案来进行check,然后我们就需要去枚举每一次的起始点,并进行模拟,然后加了一个剪枝即如果当前点的前缀和大于当前check的值,说明我们已经在给第一个点第一份菜单时给了他第二份菜单,而这又是不可行的,否则我们

9.5 考试 第一题 礼物题解

问题 A: 礼物 时间限制: 1 Sec  内存限制: 256 MB 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种 礼物的喜悦值不能重复获得). 每次,店员会按照一定的概率Pi(或者不拿出礼物),将第i种礼物拿出来. 季堂每次都会将店员拿出来的礼物买下来.没有拿出来视为什么都没有买到,也 算一次购买. 众所周知,白毛切开都是黑的.所以季堂希望最后夏川的喜悦值尽可能地高. 求夏川最后最大

18.9.22 考试总结

这道题一看就是可持久化并查集 然后我就愉快的yy了一波 还是错掉了qwqwqwqwq 方法是对的 就是我每次在树上查询$fa$的时候我还压缩了路径 导致这玩意空间炸掉了 所以要保证时间复杂度 就启发式合并 也就是$size$小的往$size$大的搞 这样子就保证每次合并的时候连通块元素个数每次至少乘以$2$ 也就是保证了层数是$log$级的 代码 #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n

2019.7.22考试反思

心态逐渐平和... 一上来发现T2是原题,美滋滋开始打N3暴力,亲测可A没办法N2实在是太难调了 然后开了个大回来以后被告知T2要换掉 T1一开始看了有大概15分钟,死在了exgcd上不过估计我记得板子也推不出来嘤嘤嘤 然后卡了一会去看T2,30分什么的完全没有想,然后把它当作数学题来看,推了一会式子,组合数应该稳了. 码完以后去看T3,emmmm..打了大概1个多小时的大模拟. 又回去看T2,手%小样例过不去,重新推式子觉得好像跟卡特兰数有关系,结果发现有重复需要容斥,手动hack掉自己. 然