2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/
表示很难看。。。。orz
1003题 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355
Cake
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1138 Accepted Submission(s):
152
Special Judge
and today is their birthday. The 1-st
soda has prepared n cakes
with size 1,2,…,n.
Now 1-st
soda wants to divide the cakes into m parts
so that the total size of each part is equal.
Note that you
cannot divide a whole cake into small pieces that is each cake must be complete
in the m parts.
Each cake must belong to exact one of m parts.
contains an integer T,
indicating the number of test cases. For each test case:
The first
contains two integers n and m (1≤n≤105,2≤m≤10),
the number of cakes and the number of soda.
It is guaranteed that the total
number of soda in the input doesn’t exceed 1000000. The number of test cases in
the input doesn’t exceed 1000.
if it is possible, otherwise output "NO" in the first line.
If it is
possible, then output m lines
denoting the m parts.
The first number si of i-th
line is the number of cakes in i-th
part. Then si numbers
follow denoting the size of cakes in i-th
part. If there are multiple solutions, print any of them.
1 2
5 3
5 2
9 3
YES
1 5
2 1 4
2 2 3
NO
YES
3 1 5 9
3 2 6 7
3 3 4 8
题意:n块蛋糕(大小1--n)分给m个人,要求每个人得到蛋糕大小总和相等
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = + ;
int ret[][MAXN];
int vis[], a[];
int tot, tar; bool dfs(int dep, int now, int u, int c)
{
if (now == )
{
int k = ;
while (vis[k] != -) ++ k;
vis[k] = c;
if (dfs(dep + , a[k], k + , c)) return true;
vis[k] = -;
return false;
}
if (now == tar)
{
if (dep == tot) return true;
else return dfs(dep, , , c + );
}
for (int i = u; i < tot; ++ i)
{
if (vis[i] == - && now + a[i] <= tar)
{
vis[i] = c;
if (dfs(dep + , now + a[i], i + , c)) return true;
vis[i] = -;
}
}
return false;
} int main()
{
int T;
scanf("%d", &T);
for (int cas = ; cas <= T; ++ cas)
{
int n, k;
scanf("%d%d", &n, &k);
//fprintf(stderr, "%d %d\n", n, k);
LL sum = (LL)n * (n + ) / ;
if (sum % k == && n >= k * - )
{
while (n >= )
{
for (int i = ; i < k; ++ i) ret[i][++ ret[i][]] = n - i;
for (int i = ; i < k; ++ i) ret[i][++ ret[i][]] = n - k * + i + ;
n -= k * ;
}
tot = n;
tar = n * (n + ) / / k;
for (int i = ; i < tot; ++ i) a[i] = tot - i;
for (int i = ; i < tot; ++ i) vis[i] = -;
dfs(, , , );
for (int i = ; i < tot; ++ i)
{
ret[vis[i]][++ ret[vis[i]][]] = a[i];
}
for (int i = ; i < k; ++ i)
{
printf("%d ", ret[i][]);
for (int j = ; j <= ret[i][]; ++ j) printf(" %d", ret[i][j]);
puts("");
}
}
else puts("NO");
}
return ;
}
1006题 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5358
First One
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072
K (Java/Others)
Total Submission(s): 757 Accepted Submission(s):
230
Let S(i,j) be
the sum of ai,ai+1,…,aj.
Now soda wants to know the value below:
Note:
In this problem, you can consider log20 as
0.
contains an integer T,
indicating the number of test cases. For each test case:
The first line
contains an integer n (1≤n≤105),
the number of integers in the array.
The next line
contains n integers a1,a2,…,an (0≤ai≤105).
题意:求
思路:利用S(i,j)单调性, log2(S(i,j))+1= k
=2^(k-1)<= S(i,j)<2^k
考虑枚举log(sum(i,j)+1的值,记为k,然后统计(i+j)的和即可。
对于每一个k,找到所有满足2^(k-1)<=sum(i,j)<=2^k-1的(i+j),
k<=2*log2(10^5)<34
转载请注明出处:寻找&星空の孩子
#include<stdio.h>
#include<math.h>
#include<algorithm>
#define LL long long
using namespace std;
LL num[];
LL sum[];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
LL n;
scanf("%lld",&n);
num[]=sum[]=;
for(int i=; i<=n; i++)
{
scanf("%lld",&num[i]);
sum[i]=sum[i-]+num[i];
}
LL ans=;
for(LL k=; k<=; k++)
{
LL l=,r=;//注意r的初始值在l的左边;因为存在1个值的情况!
LL KL=1LL<<(k-);
if(k==) KL--;
LL KR=1LL<<(k);
for(LL i=; i<=n; i++)
{
l=max(i,l);//区间左边界
while(l<=n&&sum[l]-sum[i-]<KL) l++;//确定左边界
r=max(l-,r);//区间右边界,注意r在l前的时候从l-1开始
while(r+<=n&&sum[r+]-sum[i-]>=KL&&sum[r+]-sum[i-]<KR) r++;//确定区间右边界
if(r<l) continue;
ans+=k*((i+l)+(i+r))*(r-l+)/;
}
}
printf("%lld\n",ans);
}
return ;
}
1008题 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360
Hiking
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 544 Accepted Submission(s):
290
Special Judge
conveniently labeled by 1,2,…,n.
beta, their best friends, wants to invite some soda to go hiking.
The i-th
soda will go hiking if the total number of soda that go hiking except him is no
less than li and
no larger than ri.
beta will follow the rules below to invite soda one by one:
1. he selects a
soda not invited before;
2. he tells soda the number of soda who agree to go
hiking by now;
3. soda will agree or disagree according to the number he
hears.
Note: beta will always tell the truth and soda will agree if and
only if the number he hears is no less than li and
no larger than ri,
otherwise he will disagree. Once soda agrees to go hiking he will not regret
even if the final total number fails to meet some soda's will.
Help beta
design an invitation order that the number of soda who agree to go hiking is
maximum.
contains an integer T,
indicating the number of test cases. For each test case:
The first
contains an integer n (1≤n≤105),
the number of soda. The second line constains n integers l1,l2,…,ln.
The third line constains n integers r1,r2,…,rn. (0≤li≤ri≤n)
It
is guaranteed that the total number of soda in the input doesn't exceed 1000000.
The number of test cases in the input doesn't exceed 600.
Then in the second line output a permutation of 1,2,…,n denoting
the invitation order. If there are multiple solutions, print any of
them.
8
4 1 3 2 2 1 0 3
5 3 6 4 2 1 7 6
8
3 3 2 0 5 0 3 6
4 5 2 7 7 6 7 6
8
2 2 3 3 3 0 0 2
7 4 3 6 3 2 2 5
8
5 6 5 3 3 1 2 4
6 7 7 6 5 4 3 5
1 7 6 5 2 4 3 8
8
4 6 3 1 2 5 8 7
7
3 6 7 1 5 2 8 4
0
1 2 3 4 5 6 7 8
题意:问邀请的顺序,使得最终去的人最多,每个人有一个区间[l,r]的人数要求
分析:用优先队列维护,按照r从小到大;不是很难注意细节。
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<string.h>
using namespace std;
const int N = ;
struct nnn
{
int l,r,id;
}node[N];
struct NNNN
{
int r,id;
friend bool operator<(NNNN aa,NNNN bb)
{
return aa.r>bb.r;
}
}; priority_queue<NNNN>q;
bool cmp1(nnn aa, nnn bb)
{
return aa.l<bb.l;
}
int id[N];
bool vist[N];
int main()
{
int T,n,ans;
NNNN now;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=; /*for(int i=1; i<=n; i++)
printf("%d ",i);
printf("=id\n\n");*/
for(int i=; i<n; i++)
{
scanf("%d",&node[i].l);
node[i].id=i+;
}
for(int i=; i<n; i++)
scanf("%d",&node[i].r);
sort(node,node+n,cmp1);
memset(vist,,sizeof(vist));
int i=;
while(i<n)
{
bool ff=;
while(i<n&&ans>=node[i].l&&ans<=node[i].r)
{
now.r=node[i].r;
now.id=node[i].id;
q.push(now);
//printf("in = %d\n",now.id);
i++;
ff=;
}
if(ff)i--;
while(!q.empty())
{
now=q.top(); q.pop();
if(now.r<ans)continue;
//printf("out = %d\n",now.id);
ans++;
id[ans]=now.id;
vist[now.id]=;
if(node[i+].l<=ans)
break;
}
i++;
}
while(!q.empty())
{
now=q.top(); q.pop();
if(now.r<ans)continue;
//printf("out = %d\n",now.id);
ans++;
id[ans]=now.id;
vist[now.id]=;
} bool fff=;
printf("%d\n",ans);
for( i=; i<=ans; i++)
if(i>)
printf(" %d",id[i]);
else if(i==)
printf("%d",id[i]);
if(ans)fff=;
for( i=; i<=n; i++)
if(vist[i]==&&fff)
printf(" %d",i);
else if(vist[i]==)
printf("%d",i),fff=;
printf("\n");
}
}
1011题 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5363
Key Set
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 420 Accepted Submission(s):
275
A set is called key set if the sum of integers in the set is an even number. He
wants to know how many nonempty subsets of S are
key set.
contains an integer T (1≤T≤105),
indicating the number of test cases. For each test case:
The first line
contains an integer n (1≤n≤109),
the number of integers in the set.
modulo 1000000007.
1
2
3
4
1
3
7
#include<stdio.h>
#define LL long long
#define mod 1000000007
LL ppow(LL a,LL b)
{
LL c=;
while(b)
{
if(b&) c=c*a%mod;
b>>=;
a=a*a%mod;
}
return c;
}
int main()
{
int T;
LL n;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
printf("%lld\n",ppow(,n-)-);
}
return ;
}
2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)的更多相关文章
- 2016 Multi-University Training Contest 10 solutions BY BUPT
1001. 一个数组上的两个区间求中位数,可以通过分类讨论直接找到中位数,复杂度O(1).不过本题数据较小,优美的log(n)也可过. 1002. 直接求得阴影面积表达式即可. 1003. 二分完成时 ...
- 2016 Multi-University Training Contest 9 solutions BY 金策工业综合大学
A Poor King Tag: Reversed BFS Preprocessing is needed to calculate answers for all positions (states ...
- 2016 Multi-University Training Contest 8 solutions BY 学军中学
1001: 假设有4个红球,初始时从左到右标为1,2,3,4.那么肯定存在一种方案,使得最后结束时红球的顺序没有改变,也是1,2,3,4. 那么就可以把同色球都写成若干个不同色球了.所以现在共有n个颜 ...
- 2016 Multi-University Training Contest 7 solutions BY SYSU
Ants 首先求出每个点的最近点. 可以直接对所有点构造kd树,然后在kd树上查询除本身以外的最近点,因为对所有点都求一次,所以不用担心退化. 也可以用分治做,同样是O(NlogN)的复杂度. 方法是 ...
- 2016 Multi-University Training Contest 6 solutions BY UESTC
A Boring Question \[\sum_{0\leq k_{1},k_{2},\cdots k_{m}\leq n}\prod_{1\leq j< m}\binom{k_{j+1}}{ ...
- 2016 Multi-University Training Contest 5 solutions BY ZSTU
ATM Mechine E(i,j):存款的范围是[0,i],还可以被警告j次的期望值. E(i,j) = \(max_{k=1}^{i}{\frac{i-k+1}{i+1} * E(i-k,j)+\ ...
- 2016 Multi-University Training Contest 4 solutions BY FZU
1001 Another Meaning 对于这个问题,显然可以进行DP: 令dp[i]表示到i结尾的字符串可以表示的不同含义数,那么考虑两种转移: 末尾不替换含义:dp[i - 1] 末尾替换含义: ...
- 2016 Multi-University Training Contest 3 solutions BY 绍兴一中
1001 Sqrt Bo 由于有\(5\)次的这个限制,所以尝试寻找分界点. 很容易发现是\(2^{32}\),所以我们先比较输入的数字是否比这个大,然后再暴力开根. 复杂度是\(O(\log\log ...
- 2016 Multi-University Training Contest 2 solutions BY zimpha
Acperience 展开式子, \(\left\| W-\alpha B \right\|^2=\displaystyle\alpha^2\sum_{i=1}^{n}b_i^2-2\alpha\su ...
随机推荐
- Linux下Oracle数据库的安装
记录详细过程以备使用 一.准备安装 为了确保Oracle数据库11g能够成功安装,您需要做好准备工作,例如检查网络配置.更改Linux内核参数.创建用户Oracle.创建安装目录.设置用户Oracle ...
- Vipe框架构思记
准备着手写一个JAVA框架,基于公司目前的框架提取出来.当然公司现在的框架也是我搭建的.在这整理一下思路. 框架名称:Vipe AOP,IOC容器:Spring MVC:Spring MVC ORM: ...
- 省钱版----查找 IoT 设备TTL线序__未完待续
作者:仙果 原文来自:省钱版—-查找 IoT 设备TTL线序 省钱版----查找 IoT 设备TTL线序__未完待续 缘由 在IoT固件调试分析的过程中,建议首先在IoT设备的板子上焊接调试线,这是能 ...
- HTML+CSS技术实现网页滑动门效果
一.什么是滑动门 大家在网页中经常会见到这样一种导航效果,因为使用频率广泛,所以广大的程序员给它起了一个名字,叫做滑动门.在学习滑动门之前,首先你要了解什么是滑动门. 小米官网,网页滑动门效果 二.实 ...
- Java学习笔记四:三目运算符与字符串连接符等
一 .三目运算符与自增自减 GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/OperPrac02.java 条件运算符由 ...
- CentOS7设置固定IP
在安装完CentOS7后,当我每次启动CentOS并使用SecureCRT链接时,都发现CentOS的IP总是在变,这就很苦恼了,总不能每次链接的时候都先查一下虚拟机的IP吧,所以打算把它设置成固定I ...
- soul开源网关项目搭建学习
1. soul开源网关项目搭建学习 1.1. 地址 https://gitee.com/shuaiqiyu/soul 1.2. 介绍 官方介绍:这是一个异步的,高性能的,跨语言的,响应式的API网关. ...
- vue属性监听
1.watch:用来监听每一个属性的变化 2.watch这个对象里面都是函数,函数的名称是data中的属性名称,watch中的函数不需要调用 3.当属性发生改变那么就会触发watch函数,每个函数都会 ...
- C++版 - 剑指offer 面试题7:用两个栈实现队列 题解
用两个栈实现队列 提交网址: http://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=1 ...
- 项目ITP(五) spring4.0 整合 Quartz 实现任务调度
前言 系列文章:[传送门] 项目需求: 二维码推送到一体机上,给学生签到扫描用.然后需要的是 上课前20分钟 ,幸好在帮带我的学长做 p2p 的时候,接触过.自然 quartz 是首选.所以我就配置了 ...