BZOJ 4004 [JLOI 2015] 装备购买 解题报告
哎这个题 WA 了无数遍。。。果然人太弱。。。
首先我们把这些装备按照花费从小到大排序,然后依次考虑是否能买这个装备。
至于这样为什么是对的,好像有一个叫拟阵的东西可以证明,然而我不会。TATQAQ
至于怎么考虑是否能买这个装备呢,我们可以动态更新线性基,具体操作:
- 对当前向量进行高斯消元,注意要从从高位往低位消。
- 如果消元完毕后当前向量变成了 $0$ 向量,那么我们就可以用之前的装备凑出当前装备,否则就不能凑出来。
每次更新线性基需要 $O(m^2)$ 的时间,要更新 $O(n)$ 次。
时间复杂度 $O(nm^2)$,稍微优化一下应该可以过吧。。。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
#define N 500 + 5
#define Mod 998244353 int n, m, tot, ans;
int Ord[N], W[N]; struct Node
{
int num[N];
Node () {memset(num, , sizeof(num));}
inline void init()
{
for (int i = ; i <= m; i ++)
scanf("%d", num + i);
}
inline bool operator < (const Node a) const
{
for (int i = ; i <= m; i ++)
{
if (num[i] != && !a.num[i]) return ;
else if (!num[i] && a.num[i] != ) return ;
}
return ;
}
}A[N], P[N]; inline int power(int u, int v)
{
int res = ;
for (; v; v >>= )
{
if (v & ) res = (LL) res * u % Mod;
u = (LL) u * u % Mod;
}
return res;
} inline bool cmp(int u, int v)
{
return W[u] < W[v];
} inline bool All_zero(int id)
{
for (int i = ; i <= m; i ++)
if (A[id].num[i] != ) return ;
return ;
} inline int Inc(int a, int b)
{
return a + b - (a + b >= Mod ? Mod : );
} inline bool Modify(int id)
{
if (tot == m) return ;
if (!tot)
{
tot ++;
for (int i = ; i <= m; i ++)
P[tot].num[i] = A[id].num[i];
return ;
}
for (int d = ; d <= tot; d ++)
{
int i = ;
for (; i <= m; i ++)
if (P[d].num[i] != ) break ;
if (!A[id].num[i]) continue ;
int mul = (LL) A[id].num[i] * power(P[d].num[i], Mod - ) % Mod;
for (i = ; i <= m; i ++)
A[id].num[i] = Inc(A[id].num[i], Mod - ((LL) P[d].num[i] * mul % Mod));
}
bool ok = ;
for (int i = ; !ok && i <= m; i ++)
if (A[id].num[i] != ) ok = ;
if (!ok) return ;
tot ++;
for (int i = ; i <= m; i ++)
P[tot].num[i] = A[id].num[i];
for (int d = tot; d > ; d --)
{
if (P[d - ] < P[d])
{
for (int i = ; i <= m; i ++)
swap(P[d - ].num[i], P[d].num[i]);
}
else break ;
}
return ;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("4004.in", "r", stdin);
freopen("4004.out", "w", stdout);
#endif scanf("%d%d", &n, &m);
for (int i = ; i <= n; i ++)
A[i].init();
for (int i = ; i <= n; Ord[i] = i ++)
scanf("%d", W + i);
sort(Ord + , Ord + n + , cmp);
for (int i = ; i <= n; i ++)
{
int _i = Ord[i];
if (All_zero(_i)) continue ;
if (Modify(_i)) ans += W[_i];
}
if (!tot) ans = W[Ord[]], tot = ;
printf("%d %d\n", tot, ans); #ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return ;
}
4004_Gromah
BZOJ 4004 [JLOI 2015] 装备购买 解题报告的更多相关文章
- [JLOI 2015]装备购买
Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 < ...
- BZOJ 3992 [SDOI 2015] 序列统计 解题报告
这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...
- BZOJ 3993 [SDOI 2015] 星际战争 解题报告
首先我们可以二分答案. 假设当前二分出来的答案是 $Ans$ ,那么我们考虑用网络流检验: 设武器为 $X$,第 $i$ 个武器的攻击力为 $B_i$: 设机器人为 $Y$,第 $i$ 个机器人的装甲 ...
- NOI 2015 滞后赛解题报告
报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...
- 洛谷 P1108 低价购买 解题报告
P1108 低价购买 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买&quo ...
- BZOJ 4005 [JLOI 2015] 骗我呢
首先,我们可以得到:每一行的数都是互不相同的,所以每一行都会有且仅有一个在 $[0, m]$ 的数没有出现. 我们可以考虑设 $Dp[i][j]$ 为处理完倒数 $i$ 行,倒数第 $i$ 行缺的数字 ...
- BZOJ 4316: 小C的独立集 解题报告
4316: 小C的独立集 Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点, ...
- bzoj 2588 Count on a tree 解题报告
Count on a tree 题目描述 给定一棵\(N\)个节点的树,每个点有一个权值,对于\(M\)个询问\((u,v,k)\),你需要回答\(u\) \(xor\) \(lastans\)和\( ...
- BZOJ 3545 / 洛谷 P4197 Peaks 解题报告
P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...
随机推荐
- 关于SWT/JFace的API文档
在CSDN上下了几个CHM格式的文档,下载的时候要付的分数还挺高,但是下载下来三个都不能用,左边罗列了所有的类和方法.双击按回车右边都没有内容. 真坑爹. >>>>>&g ...
- 在 Ubuntu 16.04 中安装谷歌 Chrome 浏览器
进入 Ubuntu 16.04 桌面,按下 Ctrl + Alt + t 键盘组合键,启动终端. 也可以按下 Win 键(或叫 Super 键),在 Dash 的搜索框中输入 terminal 或&q ...
- latch和DFF的区别和联系
1.latch的缺点 ①没有时钟端,不受系统同步时钟的控制,无法实现同步操作:和当前我们尽可能采用时序电路的设计思路不符. ②对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生: ③latc ...
- Spark技术内幕:Stage划分及提交源码分析
http://blog.csdn.net/anzhsoft/article/details/39859463 当触发一个RDD的action后,以count为例,调用关系如下: org.apache. ...
- leetcode之Rectangle Area
Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...
- 【nodemailer】 之邮件附件
nodemailer 续 之前对nodemailer做了一个简单的了解,这篇文章主要研究一下如何添加附加文件 测试代码 //Created by yyrdl on 2015/10/2. var nod ...
- 采用thinkphp框架实现添加管理员功能
最近由于忙于期中和期末考试没有写新的随笔了,另外内心也在纠结要不要考研,直到昨天终于痛下决心,才突然间觉得豁然开朗. 由于做老师留的课程设计作业采用thinkPHP框架频繁,最近的几篇随笔将都从thi ...
- windows 8.1 pro X64安装中断
用PE安装windows 8.1 pro X64 ISO镜像,快完成的时候卡在蓝色背景那不动了,等待了大概30min强制重启了. 奇怪的是,居然进去了,不过很慢.配置了一段时间终于看到桌面了,关机,失 ...
- ICBC中的路由设置
才去的中国工商银行,用身份证叫了A0076的号,前边还有26个人,闲来无聊果断拿出手机收取wifi.有两个ssid为ICBC的路由,信道分别是1号和6号,还好不需要密码,不过一会就连接上了. 那我先上 ...
- Windows Server R2服务器 IIS7 部署MVC3网站
报错:调用 GetProcAddress 失败,在 ISAPI 筛选器 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi ...