2018 Multi-University Training Contest 2(部分题解)
Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1770 Accepted Submission(s): 1089
Problem Description
Alice and Bob are playing a game.
The game is played on a set of positive integers from 1 to n.
In one step, the player can choose a positive integer from the set, and erase all of its divisors from the set. If a divisor doesn't exist it will be ignored.
Alice and Bob choose in turn, the one who cannot choose (current set is empty) loses.
Alice goes first, she wanna know whether she can win. Please judge by outputing 'Yes' or 'No'.
Input
There might be multiple test cases, no more than 10. You need to read till the end of input.
For each test case, a line containing an integer n. (1≤n≤500)
Output
A line for each test case, 'Yes' or 'No'.
Sample Input
1
Sample Output
Yes
题意:A和B在一串数字上操作,数字范围为1-n, 每次只能取一个数及其它的所有因子,那个先不能操作,那个先输;
题解:如果存在B胜的状态,那么A也能到达,所以本题对于A来说只有必胜态。
#include<bits/stdc++.h>
#define ios1 ios::sync_with_stdio(0)
#define ios2 cin.tie(0)
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
int main() {
int n;
while(scanf("%d", &n) == 1) {
printf("Yes\n");
}
return 0;
}
Naive Operations
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Others)
Total Submission(s): 1899 Accepted Submission(s): 258
Problem Description
In a galaxy far, far away, there are two integer sequence a and b of length n.
b is a static permutation of 1 to n. Initially a is filled with zeroes.
There are two kind of operations:
1. add l r: add one for al,al+1...ar
2. query l r: query ∑ri=l⌊ai/bi⌋
Input
There are multiple test cases, please read till the end of input file.
For each test case, in the first line, two integers n,q, representing the length of a,b and the number of queries.
In the second line, n integers separated by spaces, representing permutation b.
In the following q lines, each line is either in the form 'add l r' or 'query l r', representing an operation.
1≤n,q≤100000, 1≤l≤r≤n, there're no more than 5 test cases.
Output
Output the answer for each 'query', each one line.
Sample Input
5 12
1 5 2 4 3
add 1 4
query 1 4
add 2 5
query 2 5
add 3 5
query 1 5
add 2 4
query 1 4
add 2 5
query 2 5
add 2 2
query 1 5
Sample Output
1
1
2
4
4
6
题意:n个数,2种操作,2个数组,a数组初始都为0,然后给了b数组的值,
add 是给l到r都加1,query是查询l到r的
∑ri=⌊ai/bi⌋的和.
思路:我们只需维护b数组的区间最小值就可以了,由于这个是向下取整,因此只有当bi减为0的时候才会对所求的区间有贡献值,所以对a数组的加1的操作,相当于对b数组的减1的操作.
如果区间的最小值min>1,那么min--,否则向下查找; min>1的子区间继续之前的操作,min==1的让贡献值加1,所属的值变为本来的值
/**
add a b c:把区间[a,b]内的所有数都增加 c
sum a b:查询区间[a,b]的区间和
min a b:查询区间[a,b]的最小值
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const long long INF = 1LL << 62;
struct Segment_tree {
struct Node {
int l, r;///左右区间
int sum, min, add_lazy;///贡献值, 区间最小值, 标记
} tre[maxn << 2];
int arr[maxn];
inline void push_up(int rt) {
if(tre[rt].l == tre[rt].r) {
return ;
}
tre[rt].sum = tre[rt<<1].sum + tre[rt<<1|1].sum;
tre[rt].min = min(tre[rt<<1].min, tre[rt<<1|1].min);
}
inline void push_down(int rt) {
if(tre[rt].add_lazy) {
tre[rt<<1].add_lazy += tre[rt].add_lazy;
tre[rt<<1].min -= tre[rt].add_lazy;
tre[rt<<1|1].add_lazy += tre[rt].add_lazy;
tre[rt<<1|1].min -= tre[rt].add_lazy;
tre[rt].add_lazy = 0;
}
}
void build(int rt,int l,int r) {
tre[rt].l = l;
tre[rt].r = r;
tre[rt].add_lazy = 0;
if(l == r) {
tre[rt].sum = 0;
tre[rt].min = arr[l];
return ;
}
int mid = (l + r) >> 1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
push_up(rt);
}
void update1(int rt,int l,int r) { ///add
push_down(rt);
if(l == tre[rt].l && tre[rt].r == r && tre[rt].min > 1) {
tre[rt].add_lazy += 1;
tre[rt].min -= 1;
return ;
}
if(tre[rt].l == tre[rt].r) {
tre[rt].add_lazy += 1;
tre[rt].min -= 1;
if(tre[rt].min <= 0) {
tre[rt].min = arr[l];
tre[rt].sum += 1;
}
return ;
}
int mid = (tre[rt].l + tre[rt].r) >> 1;
if(r <= mid) {
update1(rt<<1,l,r);
} else if(l > mid) {
update1(rt<<1|1,l,r);
} else {
update1(rt<<1,l,mid);
update1(rt<<1|1,mid+1,r);
}
push_up(rt);
}
int query1(int rt,int l,int r) { ///sum
push_down(rt);
if(l == tre[rt].l && tre[rt].r == r) {
return tre[rt].sum;
}
int mid = (tre[rt].l + tre[rt].r) >> 1;
if(r <= mid) {
return query1(rt<<1,l,r);
} else if(l > mid) {
return query1(rt<<1|1,l,r);
} else {
return query1(rt<<1,l,mid) + query1(rt<<1|1,mid+1,r);
}
}
} S;
int main() {
int n, q;
while(cin >> n >> q) {
for(int i = 1; i <= n; i++) {
scanf("%d", &S.arr[i]);
}
S.build(1, 1, n);
string s;
int l, r;
while(q--) {
cin >> s >> l >> r;
if(s == "add") {
S.update1(1, l, r);
}
else {
cout << S.query1(1, l, r) << endl;
}
}
}
return 0;
}
2018 Multi-University Training Contest 2(部分题解)的更多相关文章
- 2018 Multi-University Training Contest 3(部分题解)
Problem F. Grab The Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Ja ...
- 2018 Multi-University Training Contest 1(部分题解)
Maximum Multiple Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2018 Multi-University Training Contest - Team 1 题解
Solved A HDU 6298 Maximum Multiple Solved B HDU 6299 Balanced Sequence Solved C HDU 6300 Triangle Pa ...
- 2018 Nowcoder Multi-University Training Contest 2
目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...
- 2016 Multi-University Training Contest 3 部分题解
1001,只要枚举区间即可.签到题,要注意的是输入0的话也是“TAT”.不过今天补题的时候却WA了好几次,觉得奇怪.原来出现在判断条件那里,x是一个int64类型的变量,在进行(x<65536* ...
- 2016 Multi-University Training Contest 1 部分题解
第一场多校,出了一题,,没有挂零还算欣慰. 1001,求最小生成树和,确定了最小生成树后任意两点间的距离的最小数学期望.当时就有点矛盾,为什么是求最小的数学期望以及为什么题目给了每条边都不相等的条件. ...
- 2016 Multi-University Training Contest 4 部分题解
1001,官方题解是直接dp,首先dp[i]表示到i位置的种类数,它首先应该等于dp[i-1],(假设m是B串的长度)同时,如果(i-m+1)这个位置开始到i这个位置的这一串是和B串相同的,那么dp[ ...
- 2018 Nowcoder Multi-University Training Contest 1
Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdo ...
- 2018 Nowcoder Multi-University Training Contest 5
Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...
随机推荐
- 手机APP测试之Fiddler
之前测试基本上是web端,突然接手了一个要在指定pad上测试APP的任务,于是决定研究研究pad抓包.最开始考虑有jmeter进行抓包测试,发现抓不到(可能方法有问题,后续还需继续研究),然后用fid ...
- 手动编译PHP开发环境
目录 手动编译PHP开发环境 问题复盘 部署环境及配置 目标环境 安装部署环境开始 首先安装PHP 安装mysql 安装nginx 手动编译PHP开发环境 这是一篇来自深夜加班的手稿 问题复盘 你有没 ...
- java课堂 动手动脑3
(1) 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { public static void main(Str ...
- Eclipse中代码自动添加注释及代码注释模板
介绍 为了提高代码的可读性以及为了有些代码有洁癖的人的需求,我们要从学生到职业进行迈进的过程中,必须把以前的那种代码可读性不高的习惯改掉,因为我们必须要与企业接轨.. 好了,废话不多说,反正就是提升自 ...
- 每个程序员都可以「懂」一点 Linux
提到 Linux,作为程序员来说一定都不陌生.但如果说到「懂」Linux,可能就没有那么多人有把握了.到底用 Linux 离懂 Linux 有多远?如果决定学习 Linux,应该怎么开始?要学到什么程 ...
- rpm包制作介绍
RPM(Rpm Package Management)在ReadHat等发行版下被用作软件包管理程序,其将某个软件相关的文件置入一个.rpm包中,用rpm命令,我们可以方便地完成Linux下软件安装. ...
- Spring基础笔记
Spring带给了我们什么便利? 注解版本的IOC如何玩? 组件注册 组件注册的过程中有哪些过滤规则? 如何控制组件的作用域(单例多例)? 六种注册组件的方式? 生命周期 什么是bean的生命周期 在 ...
- 《机器学习技法》---GBDT
1 对决策树使用adaboost 对决策树使用adaboost时,有以下几个问题: (1)adaboost每次更新的样本权重如何应用到决策树中? 由于我们不知道决策树的err目标是什么,因此通常的方法 ...
- 002——Netty之Netty介绍
Netty出现背景 Java NIO难用 据说存在bug 业界其他NIO框架不成熟 Netty主要解决两个相应关注领域 (1)异步和事件驱动的实现. (2)一组设计模式,将应用逻辑与网络层解耦. 特性 ...
- 如何运用PHP+REDIS解决负载均衡后的session共享问题
一.为什么要使用Session共享? 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的 ...