L++

6.30集训模拟赛4(炸裂的一天qwq)

随声附和 提交于 2020-08-10 16:48:29
T1浇水:   题目描述   在一条长n米,宽m米米的长方形草地上放置着k个喷水装置。假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m /2 ),也就是说喷水装置全部位于一条直线上。此外第 i 个喷水装置能向半径r i 的圆形区域内喷水。 负责管理喷水装置的园丁老大爷想知道,要想覆盖整个草地,至少需要开启多少个喷水装置。   输入格式 第一行三个正整数 k , n , m 。其中 m 为偶数。 接下来 k 行,每行两个整数a i 和r i ,代表第 i 个喷水装置的横坐标和喷水半径。   输出格式 一个整数 ans 代表至少需要开启的喷水装置数量。若所有装置都开启依然不能覆盖整个草地则输出-1 。   样例   样例输入1 9 16 6 0 5 2 5 4 5 6 5 8 5 10 5 12 5 14 5 16 5   样例输出1 2   样例输入2 8 20 2 5 3 4 1 1 2 7 2 10 2 13 3 16 2 19 4   样例输出2 6   数据范围与提示 样例1 解释开启位于4和12的喷水装置即可。 30%的数据中:k ≤ 20。 另有20%的数据中:r i 均相等。 100%的数据中:m≤20000,ri≤10000,n,k≤100000,a i 。   分析:   喷水装置在长方形的中线上

6.30集训模拟赛4(炸裂的一天qwq)

风格不统一 提交于 2020-08-10 13:25:21
T1浇水:   题目描述   在一条长n米,宽m米米的长方形草地上放置着k个喷水装置。假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m /2 ),也就是说喷水装置全部位于一条直线上。此外第 i 个喷水装置能向半径r i 的圆形区域内喷水。 负责管理喷水装置的园丁老大爷想知道,要想覆盖整个草地,至少需要开启多少个喷水装置。   输入格式 第一行三个正整数 k , n , m 。其中 m 为偶数。 接下来 k 行,每行两个整数a i 和r i ,代表第 i 个喷水装置的横坐标和喷水半径。   输出格式 一个整数 ans 代表至少需要开启的喷水装置数量。若所有装置都开启依然不能覆盖整个草地则输出-1 。   样例   样例输入1 9 16 6 0 5 2 5 4 5 6 5 8 5 10 5 12 5 14 5 16 5   样例输出1 2   样例输入2 8 20 2 5 3 4 1 1 2 7 2 10 2 13 3 16 2 19 4   样例输出2 6   数据范围与提示 样例1 解释开启位于4和12的喷水装置即可。 30%的数据中:k ≤ 20。 另有20%的数据中:r i 均相等。 100%的数据中:m≤20000,ri≤10000,n,k≤100000,a i 。   分析:   喷水装置在长方形的中线上

字符串:翻转单词顺序

…衆ロ難τιáo~ 提交于 2020-08-08 12:21:41
题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 思路: 先全部翻转,如i am students.-->.stneduts ma i ,然后再局部翻转,遇到空格就翻转这个单词。 代码: public class Solution { public String ReverseSentence(String str) { if(str==null ||str.length()==0) return str; //不能返回null //先转换为char,然后全部翻转 char[] s=str.toCharArray(); rev(s,0,s.length-1); //局部翻转 int l=0; int r=0; while(l<s.length){ if(s[r]==' '){ rev(s,l,r-1); //跳过空格继续遍历下一单词 r++; l=r; } //到了最后,翻转完就break,要不然r就越界了 if(r==s.length-1){ rev(s,l

SPOJ MAXOR (分块 || 可持久化字典树 || 异或)(好题)

两盒软妹~` 提交于 2020-07-28 09:51:38
You are given a sequence A[1], A[2], ..., A[N]. (0 ≤ A[i] < 2 31 , 1 ≤ N ≤ 12000). A query is defined as follows: Query(x,y) = Max { a[i] xor a[i+1] xor ... xor a[j] ; l ≤ i ≤ j ≤ r }. l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ). r = max ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ). lastans[1] = 0 , lastans[i] = Query[i-1]. Given M queries, your program must output the results of these queries. (0 ≤ M ≤ 6000). IMPORTANT : PROBLEM ENHANCED. ( I'M SO SORRY.. ) Input The first line of the input file contains 2 numbers : N M. In the second line, N numbers follow. M lines follow,

马踏棋盘之贪心算法优化

≡放荡痞女 提交于 2020-07-27 09:59:07
问题描述: 曾经用简单的深度优先搜索方法、递归的形式对马踏棋盘进行搜索,运行效率不甚理想。(博客见 马踏棋盘之递归实现 )。 所以现在用贪心算法将其优化了一下。 问题解析: 主要的思想没有变,还是用深度优先搜索,只是在选下一个结点的时候做了贪心算法优化,其思路如下: 从起始点开始,根据“马”的走法,它的下一步的可选择数是有0—8个的。 我们知道,当下一步的可选择数为0的时候,进行回溯。当下一步的可选择数有1个的时候,我们直接取那一步就行了。 但是如果下一步的可选择数有多个的时候呢? 在上一篇博客中,我们是任意取一个的,只要它在棋盘内,且未遍历就可以了。 但其实我们怎么选下一步,对搜索的效率影响是非常大的! 先介绍一下“贪心算法”。百科里面的定义是: 贪心算法(又称贪婪算法),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 它只考虑局部的最优,从而让总体也最优。就我们这个马踏棋盘来说,我们每走一步都取最优的那个选择,从而让整体的算法也最优。 但是我们选择下一步的时候(假设有a、b、c、d四个点可以选择),怎样选才算是最优呢? 答案是: 哪一个选择的下一步少,就选哪一个。 我们选择a、b、c、d之中的某一个点作为下一步,选哪个比较好,就看哪个点的后续下一步比较少。假如我们选了a

usaco2013 mar【懒惰的奶牛】

拜拜、爱过 提交于 2020-07-25 18:10:17
描述   夏天又到了,奶牛贝里斯开始变得非常懒惰。他想要站在一个地方,然后只走很少的一段路,就能吃到尽可能多的美味的青草。   有N块草坪排列在一条直线上,第i个草坪拥有g_i数量的青草,第i个草坪所在的位置是x_i。奶牛贝里斯想要在直线上选择一个点作为他的初始点(初始点有可能和草坪的位置重合),这样他就能吃到以这个点为中点距离不超过K的位置上的所有青草。   如果初始点可以自由选择的话,请帮助贝里斯计算他最多能吃到的青草的数量。 输入输出格式 输入   第一行是两个正整数,表示N和K。   第2行到第N+1行,每行两个整数,第i行的两个整数表示第i个草坪的g_i和x_i。 输出   输出贝里斯最多能吃到的青草数量。 输入输出样例 样例输入1 4 3 4 7 10 15 2 2 5 1 样例输出1 11 样例说明   如果贝里斯将初始点选择在x=4的位置,那么他可以吃到x=1,x=2和x=7这三个地方的青草,总共是11。 数据规模   1<=N<=100000,1<=g_i<=10000,0<=x_i<=1000000,1<=k<=2000000。 解题思路   刚开始我想用前缀和,然后每次枚举区间比较最大值,但是我最后还是用的类似于队列的东西来做 (因为老师强制性) ,每次用一个左端点和右端点移动就行。 题解 1 #include<bits/stdc++.h> 2 using

洛谷 P2622 关灯问题II (状压入门)

心已入冬 提交于 2020-05-09 07:47:42
题目描述 现有n盏灯,以及m个按钮。每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果。按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时候,把它关上,否则不管;如果为-1的话,如果这盏灯是关的,那么把它打开,否则也不管;如果是0,无论这灯是否开,都不管。 现在这些灯都是开的,给出所有开关对所有灯的控制效果,求问最少要按几下按钮才能全部关掉。 输入输出格式 输入格式: 前两行两个数,n m 接下来m行,每行n个数,a[i][j]表示第i个开关对第j个灯的效果。 输出格式: 一个整数,表示最少按按钮次数。如果没有任何办法使其全部关闭,输出-1 输入输出样例 输入样例#1: 复制 3 2 1 0 1 -1 1 0 输出样例#1: 复制 2 说明 对于20%数据,输出无解可以得分。 对于20%数据,n<=5 对于20%数据,m<=20 上面的数据点可能会重叠。 对于100%数据 n<=10,m<=100 终于开始看状压了,边看题解边写的。此题bfs暴力可得,枚举每一次关灯后的结果,记录去重,以(1<<n-1)为起点。 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<map> 6

2019银联高校极客挑战赛 复赛

对着背影说爱祢 提交于 2020-05-08 03:54:47
一直不在状态…… 想着各种事情…… A. 正常的方法是预处理k!和inv(k!),然后每次询问O(1)。 然后某同学的方法是dp,O(n*m)也能过。 f(i,j,0)和f(i,j,1)吗?i<=n,j<=m,0和1分别代表是否已经选择F吗。 B. 对于a,是x的倍数,且不是y的倍数(其中p%x==0,y%x==0,p%y==0) x乘上某个数,这个数除以z(z为不可以使用的约数的乘积,详见代码)为r(计算0~z-1)。 则对于b,是(p/x)的倍数 不好写。。。 时间复杂度: 预处理:k个质因数(<=6),2^k * 对应的大小(<=p) 约数的个数*(k+k) 还有更快的方法 题解:数论方式分析。 a=px+y y*b=p的倍数 则b是p/y的倍数。 然后枚举y。 写得很快。。。 看群里还有使用mobius的,比赛时想过,但没想到。 对于数字a,b gcd(a,p)=d 然后b为p/d的倍数即可。 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include < string > 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 #define ll long long

[LeetCode] 42. Trapping Rain Water 收集雨水

ε祈祈猫儿з 提交于 2020-05-06 23:41:27
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image! Example: Input: [0,1,0,2,1,0,1,3,2,1,2,1] Output: 6 这道收集雨水的题跟之前的那道 Largest Rectangle in Histogram 有些类似,但是又不太一样,先来看一种方法,这种方法是基于动态规划 Dynamic Programming 的,维护一个一维的 dp 数组,这个 DP 算法需要遍历两遍数组,第一遍在 dp[i] 中存入i位置左边的最大值,然后开始第二遍遍历数组,第二次遍历时找右边最大值,然后和左边最大值比较取其中的较小值,然后跟当前值 A[i

Codeforces 1188C DP 鸽巢原理

删除回忆录丶 提交于 2020-05-06 03:31:49
题意:定义一个序列的beauty值为序列中元素之差绝对值的最小值,现在给你一个数组,问所有长度为k的子序列的beauty值的和是多少? 思路:(官方题解)我们先解决这个问题的子问题:我们可以求出beauty值大于等于给你值的序列有多少个(假设为p[i]),那么其实答案就是∑(i从1到max(a)) p[i]。怎么求p数组呢?我们先对数组排序,假设现在求p[x], 设dp[i][j]为以第i个元素为结尾,长度为j的子序列的个数。那么所有a[i] - a[j] >= x的j都可以向i转移,所以,我们用指针维护满足a[i] - a[j] >= x的最靠近i的位置,并且维护前缀和以进行O(1)转移。这样每次的转移是O(n * k)的。假设m = max(a), 那么总的复杂度是O(m * n * k)。但是,我们发现,长度为k的序列有k - 1个差,那么beauty值的最小值为n / (k - 1) (由鸽巢原理可知), 所以复杂度变成了O(m / (k - 1) * n * k) = O(n * m)的,可以过。这个题需要注意一下,如果把dp的两维交换一下,即dp[i][j]表示长度为i的子序列中,以元素j为结尾的子序列的个数,这样表示可以快大概600ms。如果学过《深入理解计算机系统》可能会知道为什么,因为n >= k, 所以访问n的机会多,放第二维会让n的访问之间连续,时间更短