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=lai/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≤lrn, 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(部分题解)的更多相关文章

  1. 2018 Multi-University Training Contest 3(部分题解)

    Problem F. Grab The Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Ja ...

  2. 2018 Multi-University Training Contest 1(部分题解)

    Maximum Multiple Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. 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 ...

  4. 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 ...

  5. 2016 Multi-University Training Contest 3 部分题解

    1001,只要枚举区间即可.签到题,要注意的是输入0的话也是“TAT”.不过今天补题的时候却WA了好几次,觉得奇怪.原来出现在判断条件那里,x是一个int64类型的变量,在进行(x<65536* ...

  6. 2016 Multi-University Training Contest 1 部分题解

    第一场多校,出了一题,,没有挂零还算欣慰. 1001,求最小生成树和,确定了最小生成树后任意两点间的距离的最小数学期望.当时就有点矛盾,为什么是求最小的数学期望以及为什么题目给了每条边都不相等的条件. ...

  7. 2016 Multi-University Training Contest 4 部分题解

    1001,官方题解是直接dp,首先dp[i]表示到i位置的种类数,它首先应该等于dp[i-1],(假设m是B串的长度)同时,如果(i-m+1)这个位置开始到i这个位置的这一串是和B串相同的,那么dp[ ...

  8. 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 ...

  9. 2018 Nowcoder Multi-University Training Contest 5

    Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...

随机推荐

  1. ElasticSearch6.x版本聚合分析整理

    ElasticSearch6.x版本聚合分析整理 ES将聚合分析主要分为如下4类 Bucket,分桶类型,类似SQL中的GROUP BY语法 Metric,指标分析类型,如计算最大值 , 最小值,平均 ...

  2. Jenkins 持续集成持续发布使用搭建基础

    一.环境搭建基础 1.持续集成.持续交付.持续部署概念 ①.集成: 是指软件多人研发的部分软件代码整合交付,以便尽早发现个人开发部分的问题:持续集成:强调开发人员提交了新代码之后,立刻进行构建(单元) ...

  3. 利用MAVEN打包可运行jar包,包括依赖的第三方包

    转载自:http://bglmmz.iteye.com/blog/2058914 背景: 另一篇文章说了如何利用IDEA来打包,现在来说说如何利用MAVEN打包 目标:应用本身打成一个jar包,依赖的 ...

  4. .Net异步编程详解入门

    前言 今天周五,早上起床晚了.赶着挤公交上班.但是目前眼前有这么几件事情.刷牙洗脸.泡牛奶.煎蛋.在同步编程眼中.先刷牙洗脸,然后烧水泡牛奶.再煎蛋,最后喝牛奶吃蛋.毫无疑问,在时间紧促的当下.它完了 ...

  5. 关于JVM内存溢出的原因分析及解决方案探讨

    前言:JVM中除了程序计数器,其他的区域都有可能会发生内存溢出. 0.什么是内存溢出 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出. 1. ...

  6. docker-compose 综合训练

    Docker-compose综合训练 一. 实验目的: 熟悉Docker-compose的基本工作原理: 熟悉Docker-compose安装 熟悉Docker compose命令基础 熟悉Docke ...

  7. 7.18 collection time random os sys 序列化 subprocess 等模块

    collection模块 namedtuple 具名元组(重要) 应用场景1 # 具名元组 # 想表示坐标点x为1 y为2 z为5的坐标 from collections import namedtu ...

  8. mybatis 源码分析(二)mapper 初始化

    mybatis 的初始化还是相对比较复杂,但是作者在初始化过程中使用了多种设计模式,包括建造者.动态代理.策略.外观等,使得代码的逻辑仍然非常清晰,这一点非常值得我们学习: 一.mapper 初始化主 ...

  9. ElasticSearch实战系列一: ElasticSearch集群+Kinaba安装教程

    前言 本文主要介绍的是ElasticSearch集群和kinaba的安装教程. ElasticSearch介绍 ElasticSearch是一个基于Lucene的搜索服务器,其实就是对Lucene进行 ...

  10. Day 03--设计与完善(一)

    1.今天我们把软件原型基本完成了,功能流程一套下来,像一个真正的软件了.这是几个主要模块: 首先是首页,登入小程序后可以直观地看到各个食堂,并显示自己的定位.屏幕下方还可以时刻切换查看自己以前的订单. ...