szoj461【四校联考0430】挑战
传送门:(涉及版权忽略)
【题解】
我们发现n的范围很小,提示我们可以折半,然后我们就会了O(T2^(n/2)*n)的做法,然而会T。
考虑如何优化。直接排序会多一个log(2^(n/2))也就是n,那么改成每次加一个数,归并即可。这样复杂度是对的
T(n) = T(n-1) + 2^n ==> T(n) = O(2^n)
那么复杂度就是O(T2^(n/2))
# include <stdio.h>
# include <string.h>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = + , N = ;
const int mod = 1e9+; # define FO_OPEN
# define RG register
# define ST static int n, m, a[M];
int c[][N], cn[];
int t[N]; inline void merge(int pos, int l, int mid, int r) {
int i = l, j = mid+, k = l-;
while(i<=mid && j<=r) {
if(c[pos][i] < c[pos][j]) t[++k] = c[pos][i++];
else t[++k] = c[pos][j++];
}
while(i<=mid) t[++k] = c[pos][i++];
while(j<=r) t[++k] = c[pos][j++];
for (int o=l; o<=r; ++o) c[pos][o] = t[o];
} inline void sol() {
int sum = ;
scanf("%d%d", &n, &m);
for (int i=; i<=n; ++i) scanf("%d", &a[i]), sum = sum + a[i];
if(sum < m) {
puts("-1");
return ;
}
int res = n/;
c[][cn[] = ] = ;
for (int i=; i<=res; ++i) {
for (int j=; j<=cn[]; ++j) c[][j+cn[]] = c[][j] + a[i];
merge(, , cn[], cn[] << );
cn[] <<= ;
}
// printf("cn[0] = %d\n", cn[0]);
// for (int i=1; i<=cn[0]; ++i) printf("%d ", c[0][i]);
// puts("\n====================");
c[][cn[] = ] = ;
for (int i=res+; i<=n; ++i) {
for (int j=; j<=cn[]; ++j) c[][j+cn[]] = c[][j] + a[i];
merge(, , cn[], cn[] << );
cn[] <<= ;
}
// printf("cn[1] = %d\n", cn[1]);
// for (int i=1; i<=cn[1]; ++i) printf("%d ", c[1][i]);
// puts("");
int p0 = , p1 = cn[], ans = ;
for (; p0 <= cn[]; p0 ++) {
while(p1 && c[][p0] + c[][p1] >= m) --p1;
if(p1 != cn[])
ans = min(ans, c[][p0] + c[][p1 + ]);
}
printf("%d\n", ans);
} int main() {
FO_OPEN ? freopen("challenge.in", "r", stdin), freopen("challenge.out", "w", stdout) : ;
int T; scanf("%d", &T);
while(T--) sol();
return ;
}
szoj461【四校联考0430】挑战的更多相关文章
- [2017/5/28]FJ四校联考
来自FallDream的博客,未经允许,请勿转载,谢谢. 话说这一段时间算是过去了,好久好久之后终于又有联考了 没想到这次到我们学校出题,昨天才想起来,临时花一天赶了一套,我出了一个sbFFT,质量 ...
- [四校联考P3] 区间颜色众数 (主席树)
主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...
- 四校联考 tree3
我们考虑计算红色点与非红色点的对数. 我们用f[i][j]表示i的子树中有j个红色点的概率,将i所有子树合并. 接着我们对于每一个状态,枚举i是红色还是非红色算概率. 同时我们可以求出i和i子树内一个 ...
- [3.19FJ四校联考]
来自FallDream的博客.未经允许,请勿转载,谢谢. ---------------------------------------------------- A.积分,不会 以后补 B.给定一 ...
- 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7
此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...
- 三校联考 Day3
三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...
- 【赛时总结】NOIP2018-三校联考1024
◇NOIP三校联考-1024◇ 发现以前的博客写得似乎都很水……基本上都没什么阅读量QwQ 决定改过自新╰( ̄ω ̄o) 就从这篇博客开始吧~ 现场考得无地自容,看到题解才发现一些东西……(我第三题还没 ...
- [2019多校联考(Round 6 T3)]脱单计划 (费用流)
[2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...
- [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...
随机推荐
- Excel拼接字符串
有时候,需要把一些Excel表格中的内容进行拼接,比如A4行的值是前面三行值的加起来.在Excel中可以使用&来进行这种操作.如果数据非常多,就可以使用这个来进行批量操作.
- NSOperation那点事儿
1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...
- 对工具的反思 & deadlines与致歉
人和动物最大的区别就是使用工具的水平. 有些人只凭着对工具的熟练掌握便成了牛人. 工具,到底应该以何种态度去看待? 在我小的时候,工具仅仅是指树枝.线.粉笔,可以让自己有更多游戏可玩:上学之后,便又有 ...
- Appium如何获取appPackage和appActivity
基本概念: appPackage:简单来说是App开发者提供的名称. appActivity:简单来说是App提供的各种不同的功能.每个程序都有个MainActivity,就是打开程序时显示在屏幕的活 ...
- 2016弱校联盟十一专场10.3 We don't wanna work!
能把 not working now 写成 not working hard now 还查一晚上也是没谁了 我的做法是维护两个set 分别是前20% 和后80% #include<iostrea ...
- 剑指offer:从头到尾打印链表
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:从头到尾打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 首先题目实际给出的要求是返回ve ...
- Android调用Java WebSevice篇之一
一.服务端WebService 1.服务端环境配置 MyEclipse 10.0.Tomcat6.0.JDK6.0. 2.下载axis相关jar包. 3.创建webservice. ...
- PS制作圆角透明图片
方法一:利用“魔术棒橡皮工具”. 1. 点击“圆角矩形工具”,然后选中打开的背景图片,选中即可. 2.然后,按住“ctrl+enter”,所选边框变为虚线框,然后点击“ctrl+shift+i”反选( ...
- java线程(1)——三种创建线程的方式
前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...
- Chrome Extension & Dark Theme
Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhn ...