SDU暑期集训排位(6)题解

L - Olympiad Training

$FWT$。首先,观察到$n$很小,我们可以想办法求出每个子集的答案,但是$m$很大,直接枚举子集的方法肯定行不通。不妨考虑对每个$topic$单独考虑贡献,设当前考虑的是第$j$个$topic$,然后枚举最大值,设$a_{ij}$为最大值,其他的人我们只能选比它小的,设我们能选出的最大的集合为$mask$,显然,对于$mask$子集$s$,如果$s$包含第$i$个人,答案就需要加上$a_{ij}$,如果不包含,它的最大值就为其他值,我们不妨分两步完成这个操作,首先,对于$mask$的所有子集加上答案$a_{ij}$,然后,设$mask‘$为$mask$去掉$i$之后的集合,我们对$mask‘$的所有子集减去$a_{ij}$,到此为止,如果我们能快速完成给子集同时加上一个数这个操作,这个题就做完了,$and$运算的$FWT$支持此操作。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<algorithm>
 5 const int N=22;
 6 int n,q,m;
 7 typedef long long ll;
 8 ll f[1<<20],ans[22];
 9 typedef std::pair<int,int> P;
10 std::vector<P> g[10004];
11 void FWT(ll *a,int n) {
12     for(int i=1;i<n;i<<=1)
13         for(int p=i<<1,j=0;j<n;j+=p)
14             for(int k=0;k<i;k++)
15                 a[j+k]+=a[i+j+k];
16 }
17 int main() {
18     int T;
19     scanf("%d",&T);
20     while(T--) {
21         scanf("%d%d%d",&n,&m,&q);
22         for(int i=0;i<1<<n;i++) f[i]=0;
23         for(int i=0;i<m;i++) g[i].clear();
24         for(int i=0;i<n;i++) {
25             for(int j=0,x;j<m;j++) {
26                 scanf("%d",&x);
27                 g[j].push_back(P(x,i));
28             }
29         }
30         for(int i=0;i<m;i++) {
31             std::sort(g[i].begin(),g[i].end());
32             int mask=0;
33             for(P c:g[i]) {
34                 mask|=1<<c.second;
35                 f[mask]+=c.first;
36                 f[mask^(1<<c.second)]-=c.first;
37             }
38         }
39         FWT(f,1<<n);
40         for(int i=1;i<=n;i++) ans[i]=1e18;
41         for(int i=1;i<1<<n;i++) {
42             int k=0;
43             for(int j=0;j<n;j++) if(i>>j&1) ++k;
44             ans[k]=std::min(ans[k],f[i]);
45         }
46         for(int k;q--;) {
47             scanf("%d",&k);
48             printf("%lld\n",ans[k]);
49         }
50     }
51     return 0;
52 }

原文地址:https://www.cnblogs.com/Onlymyheart/p/11366406.html

时间: 2024-07-30 16:15:49

SDU暑期集训排位(6)题解的相关文章

SDU暑期集训排位(2)

A. Art solved by sdcgvhgj 3min 签到 B. Biology solved by sdcgvhgj 85min 暴力 C - Computer Science solved by rdc 16min 题意 数轴上有一些点,求极短长度 x,使得存在 \(n\) 个区间,第 \(i\) 个区间包含 \(a_i\),包含的点数至少 \(k\) 个. 做法 每个区间相互独立. 对点排序. 用 \(x_{i+k-1} - x_i + 1\) 区间更新 \([x_i,x_{i+k

题解报告(CDUT暑期集训——第三场)

题解报告(CDUT暑期集训--第三场) A - Problem A. Ascending Rating HDU - 6319 思路:单调队列板子题?(但是弱的一批的我还是不会用(有空补上 用的滑动窗口算法 按着题解的从后往前做(ps:菜是原罪 AC代码 #include<stdio.h> #include<iostream> #include<math.h> #include<algorithm> #include<string.h> #incl

2016暑期集训集中贴

暑假期间网上练习的题解将在此博客公布,具体内容见后文. 题目链接:  点我 以下是暑期集训各队员题量统计(包括赛后补的题) 2016暑期集训AcBoard(截至07-23) 总题量 5 5 7 5   10 10 10 11    63 队员名称 cf-1 cf-2 cf-3 cf-4 cf-5 模拟训练1 模拟训练2 模拟训练3 模拟训练4 模拟训练5 题量小计 cb 2 2 3 3   6 6 6 4   32 fdf 4 3 3 2   5 7 2 4   30  ctr 3 3 3 3

2014年CCNU-ACM暑期集训总结

2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训竟然就这样的,溜走了.让自己有点措手不及,更多的是对自己的疑问,自己能否在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结吧. 第一周来的时候,状态还没有融入进去,学长们也不在,就直接布置了一套题目,考察的是贪心策略.学习的时候很有激情,毕竟是期待了那么久的场景,所以大家都很认真,希望自己能够有所进步. 第二周,搜索专题.主要学习宽度优先搜索(BFS)与深度优先搜索(DFS),刚开始学比较吃力,因为自己对这方面的领悟有点迟

第二第三周暑期集训总结

##第二第三周暑期集训总结在第二第三周中,我主要看了状压DP,数位DP,树状DP的主要内容.同时,在做训练赛的过程中,发现一些知识点掌握的不好,于是又回头复习了一下,包括图的一些基本概念,最短路算法,并查集,最小生成树,图的存储方法(矩阵,邻接表(数组)).还有很关键的一件事就是参加了今年的CCPC网络选拔赛.####状压DP刚开始看的时候,我觉得状压DP很难.在恶补了位运算的知识后,我又自己敲了一遍代码,突然有一种茅塞顿开的感觉.这是我对状压DP的理解:状压DP其实也没什么深奥的,就是利用位运

2015年CCNU-ACM暑期集训总结

2015年CCNU-ACM暑期集训总结 本来很早就该做个总结的,可是一直拖到今天,也就是回学校的前一天晚上才下笔,拖延症越来越严重了.为了写这篇总结,我还特意去看了下去年的,映入眼帘的是一道流水账.=_= 往事不堪回首,还是简要说说2015年暑期集训的感想吧. 又是一年暑期集训,大三狗了,还有不到两年学生生涯,想想还蛮伤感的.额,扯远了扯远了.对今年暑期集训呢,其实说实话也没什么感想,唯一的感想就是越来越发现自己弱得一逼.首先说一下多校.多校就是一个让自己受虐的地方,不是那谁说的,要在受虐中成长

xjtu暑期集训2016-7-9 题解

A 郭铮鹏与国际象棋 B 郭铮鹏与食堂买饭 C 郭铮鹏与烧情侣 D 郭铮鹏与线性代数 E 郭铮鹏与老司机 F GZP and Public Display of Affection G GZP Bureaucracy and Girlfriend H GZP and Dating A. 郭铮鹏与国际象棋 Description 郭铮鹏正在学习国际象棋.他已经学会了王.车和象的移动方式.国际象棋规则如下:棋盘由8行8列共64个格子组成,一个格子的位置通过数对(r,c)来表示,其中r表示行数c表示列

【暑期集训第一场】欧拉回路 | 思维 | 数论构造 | 容斥原理 | 线段树 | 归并排序

集训1(HDU2018 Multi-University Training Contest 2) ID A B C D E F G H I J AC O O 补题 ? O ? O 代码 & 简易题解 [A]:期望? 神仙题,留坑.. [B]:?? 同\(\text{A}\) [C]:求欧拉通路条数,以及每条的路径 小学数竞里有讲过,无向图一笔画的充要条件是有零个或两个"奇点"(偶点个数不限),"奇点"在这里就是指度为奇数的点... 其实上面两种情况就分别对应

2019暑期集训感悟

为什么要参加集训? 为了心中的梦想,为了自我的突破,为了知识的学习 当我以上没睡醒,是因为我想知道我和同龄的学生差距有多大. 说下暑假多校联赛集训的感受: 1.自己太菜,为什么别人十分钟A出签到题,而我要两个小时或者整场做不出来? 2.继续学习,为什么写的时候有思路,而我表达不出来?3.自我认知,为什么别人水平很高,而自己不行? 说下暑假多校联赛集训的收获:扩展kmp,数论的一些,spfa最短路 下来我不知道该写什么,说说与集训不相关的一些 在集训一半的时候,忘了是什么个契机,我问自己一个问题,