YMOI 2019.6.15
题解 YMOI 2019.6.15
前记
NOIP信心个蛋赛,被各路大佬吊打,信心--
耻辱墙: \(2019.6.15\) \(rank\) \(\color{red}{3}\)
T1 简单队列
题意概述:定义连续的一段单调不递减连续子序列“\(\leq\)”为递增序列,求解最长递增序列的长度\(len\),和长度\(\geq \lfloor \frac{len}{2}\rfloor\)的递增序列的个数
这个嘛,比较简单
对于子问题1,从头到尾扫一遍
\(num[a]\leq num[a+1]\),则将第\(a+1\)个数字增添到已有数列上
\(num[a]>num[a+1]\),则将第\(a\)个数字作为新的递增序列的左端点
对于子问题2,还是扫一遍。注意枚举到第\(i\)位的意义是处理到了以\(i\)作为右端点的递增序列
当前枚举到了\(i\),记录长度为\(size\)
\(num[a]\leq num[a+1]\),\(size=size+1\)
\(num[a]>num[a+1]\),\(size=1\)
如过\(size \geq \lfloor \frac{len}{2}\rfloor\),则\(ans+=size - \lfloor \frac{len}{2}\rfloor +1\)
然后,记得特殊处理\(ans=1\)的情况,因为此时\(\lfloor \frac {1}{2} \rfloor=0\),因此输出答案为\(1\) \(n\)
code:
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX=1e5+5;
int n; ll num[MAX];
int ans,tar;
ll cnt;
inline int read();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#else
freopen("sim.in","r",stdin);
freopen("sim.out","w",stdout);
#endif
n=read();
for(int i=1;i<=n;++i) cin>>num[i];
for(int i=1;i<=n;){
int u=num[i],p=i,size=1;
while(p<n&&num[p+1]>=u){
u=num[p+1]; p++; size++;
}
ans=max(ans,size);
i=p+1;
}
tar=ans/2;
if(ans==1){
cout<<ans<<" "<<n<<endl;
return 0;
}
for(int i=1;i<=n;){
int u=num[i],p=i,size=1;
if(size>=tar){
cnt+=(ll)(size+1-tar);
}
while(p<n&&num[p+1]>=u){
u=num[p+1]; p++; size++;
if(size>=tar){
cnt+=(ll)(size+1-tar);
}
}
i=p+1;
}
cout<<ans<<" "<<cnt<<endl;
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<'0'||tmp>'9'){
if(tmp=='-') flag=true;
tmp=getchar();
}
while(tmp>='0'&&tmp<='9'){
sum=(sum<<1)+(sum<<3)+tmp-'0';
tmp=getchar();
}
return flag?-sum:sum;
}
T2 简单筛选
题意概述:区间质数和
emm,最烦这种会了就会,不会就完的繁琐小知识点!(╯▔皿▔)╯但既然遇到了就尝试解决一下
这种题目的数据通常是\(l\)和\(r\)都极大,什么筛法都不可能完整筛下来,但是\(r-l\)在可接受范围内。这就让我们注意到区间的重要性
可以发现,对于\(r\)以内的合数,其最小质因数必定\(\leq \sqrt{r}\),且所有合数都可表示为其最小质因数的倍数。
那么当前处理的区间是\([l,r]\),我们先处理出来\([2,\sqrt{r}]\)的质数,然后用这些质数枚举倍数,筛掉原区间里的合数
类似埃氏筛的筛法,所以复杂度应该是\(O(n \log n)\),吧..原谅菜鸡的我并不会严格证明
code:
#include <map>
#include <ctime>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX=1e5+5;
int prime[MAX]; bool notprime[MAX];
int k,l,r,ans;
clock_t st,ed;
inline int read();
void oula();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#else
freopen("sieve.in","r",stdin);
freopen("sieve.out","w",stdout);
#endif
oula();
cin>>k;
while(k--){
cin>>l>>r; l--;
int ansl=0,ansr=0;
for(int i=1;i<=prime[0];++i){
if(prime[i]>l) break;
ansl++;
}
for(int i=1;i<=prime[0];++i){
if(prime[i]>r) break;
ansr++;
}
ans+=(ansr-ansl);
}
cout<<ans<<endl;
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<'0'||tmp>'9'){
if(tmp=='-') flag=true;
tmp=getchar();
}
while(tmp>='0'&&tmp<='9'){
sum=(sum<<1)+(sum<<3)+tmp-'0';
tmp=getchar();
}
return flag?-sum:sum;
}
void oula(){
prime[0]=0;
for(ll i=2;i<=100000;++i){
if(!notprime[i]) prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&i*prime[j]<=100000;++j){
notprime[prime[j]*i]=true;
if(i%prime[j]==0) break;
}
}
}
T3 简单动规
唯一的难点,怎么判断是否是合法转移
将难点提取概括一下:\(4a+7b\)可以表示哪些数字?
好像正解是用拓展欧几里得来证明的,但我不会会过,但考场忘了这里还是说说在考场也有可能想出来的思路吧
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
上图的格子对应下面表格中的数字
\(\color{green}{绿色}\) 代表\(4\)的倍数
\(\color{red}{红色}\) 代表\(7\)的倍数
\(\color{blue}{蓝色}\) 代表\(4\)的倍数佐以\(7\)的倍数,即\(4\)和\(7\)可以表达的所有数字
发现规律,\(4\)和\(7\)表达不出来的最大的数字是\(4\times7-4-7\)
这个规律也可以进一步推广为,\(a\)和\(b\)表达不出来的最大的数字是\(a\times b -a -b\)。虽然对这道题没什么乱用,但可以用之解决NOIP毒瘤真题之小凯的疑惑
code:
#include <map>
#include <ctime>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX=1e5+5;
struct data{
int pos,wei;
bool operator < (const data &x) const{
return pos<x.pos;
}
}takala[MAX];
int n,m,ans;
int f[MAX];
bool lawful[18];
inline int read();
void init();
bool check(int);
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
init();
n=read(); m=read();
for(int i=1;i<=n;++i) takala[i].wei=read(),takala[i].pos=read();
sort(takala+1,takala+1+n);
int rec,top; rec=0,top=0;
for(int i=1;i<=n;++i){
if(!check(takala[i].pos)) continue;
while(rec<i&&takala[rec+1].pos+17<takala[i].pos){
rec++; top=max(top,f[rec]);
}
for(int j=rec+1;j<=i-1;++j){
if(!check(takala[i].pos-takala[j].pos)) continue;
f[i]=max(f[i],f[j]);
}
f[i]=max(f[i],top);
f[i]+=takala[i].wei;
ans=max(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<'0'||tmp>'9'){
if(tmp=='-') flag=true;
tmp=getchar();
}
while(tmp>='0'&&tmp<='9'){
sum=(sum<<1)+(sum<<3)+tmp-'0';
tmp=getchar();
}
return flag?-sum:sum;
}
void init(){
for(int k=0;k<=17;++k){
for(int i=0;i<=7;++i){
for(int j=0;j<=4;++j){
if(i*4+j*7==k) lawful[k]=true;
}
}
}
}
bool check(int k){
if(k>17) return true;
else return lawful[k];
}
后记
被吊打了~~果然大佬随手用小知识点摸一道题,菜鸡就只能干瞪眼..
一言(ヒトコト)
喜欢你,因为我喜欢你,比地球上任何人都,喜欢你...
——名侦探柯南
YMOI 2019.6.15的更多相关文章
- Data truncation: Incorrect datetime value: 'May 15, 2019 4:15:37 PM
因为系统在windows下测试过是正常的 windows下的jdk+ windows下安装的mysql 全部cases通过 linux下的jdk + windows下安装的mysql 新增和更新,影响 ...
- MyBatis 配置/注解 SQL CRUD 经典解决方案(2019.08.15持续更新)
本文旨在记录使用各位大神的经典解决方案. 2019.08.14 更新 Mybatis saveOrUpdate SelectKey非主键的使用 MyBatis实现SaveOrUpdate mybati ...
- Python脱产8期 Day03 2019/4/15
一 变量的命名规范 1.只能由 字母, 数字, _, 组成. 2. 不能以数字开头 3.避免与系统关键字重名:重名不会报错,但系统的功能就被自定义的功能屏蔽掉了(严重不建议这样来做) 4.以_开头的 ...
- 纪中OJ 2019.02.15【NOIP提高组】模拟 B 组 梦回三国 比赛题解(第一个)
声明 旁边的同学小 H(胡)对我说: “哟,比赛拿了 140,强!要知道,如果哥第三题 AC 了,哥就 230 了,你个废柴!!!(比赛实际分数 130 额呵)” 顿时,千万草泥马从我心中奔腾而过:你 ...
- 2019.03.15 ZJOI2019模拟赛 解题报告
得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...
- 【2019.8.15 慈溪模拟赛 T1】插头(plugin)(二分+贪心)
二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能 ...
- 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)
卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...
- 【2019.7.15 NOIP模拟赛 T2】与非树(nand)(树形DP)
树形\(DP\) 实际上,这道题应该不是很难. 我们设\(f_{x,i,j}\)表示在以\(x\)为根的子树内,原本应输出\(i\),结果输出了\(j\)的情况数. 转移时,为了方便,我们先考虑与,再 ...
- 【2019.7.15 NOIP模拟赛 T1】夹缝(mirror)(思维题)
思维题 此题应该是比较偏思维的. 假设一次反射后前进的距离是\(2^x(2y+1)\),则显然,它可以看做是前进距离为\(2^x\)的光线经过了\((2y+1)\)次反射,两者是等价的,甚至后者可能还 ...
- 第十八次CSP认证游记 | 2019.12.15
CSP认证的考试是Haogod介绍的,取得一定成绩之后能有机会参加CCSP的分赛区和全国决赛.这次来参加认证要感谢老师的奔走为我们申请学校的报销,虽然最终因为这不是比赛所以报名费和差旅费下不来,但是老 ...
随机推荐
- Vue学习之--------列表渲染、v-for中key的原理、列表过滤的实现(2022/7/13)
文章目录 1.基本列表 1.1 基本知识 1.2 代码实例 1.3 测试效果 2.key的原理 2.1基本知识 2.2 代码实例 2.3 测试效果 2.4 原理图解 3.列表过滤 3.1 代码实例 3 ...
- Selenium+Python系列(三) - 常见浏览器操作
写在前面 上篇文章为大家分享了自动化测试中,常见元素定位的操作. 今天再次读文章,居然忘记了大家特别喜欢的CSS和Xpath定位操作分享,这怎么能行呢? 马上安利,感兴趣的同学去参考下面链接: CSS ...
- day02-HTML02
4.HTML 4.3HTML基本标签 4.3.9表格(table)标签 基本语法: <table border="边框宽度" cellspacing="空隙大小&q ...
- pod(七):静态pod
目录 一.系统环境 二.前言 三.静态pod 3.1 何为静态pod 3.2 创建静态pod 3.2.1 使用--pod-manifest-path指定静态pod目录 3.2.2 静态pod默认目录/ ...
- python uiautomator
电脑连接上一个手机或多个手机, 确保adb已经添加到环境变量中,执行下面的命令会自动安装本库所需要的设备端程序:uiautomator-server .atx-agent.openstf/minica ...
- TypeScript(基础篇)day01
一.TS介绍 1.1 简介 ts是2012年由微软开发,在js的基础上添加了类型支持 1.2 优劣势 优势 :任何位置都有代码提示,增加效率:类型系统重构更容易:使用最新的ECMAscript语法 劣 ...
- Halocn双目相机标定
[Halcon]Halcon双目标定 相机标定(4)---基于halcon的双目立体视觉标定 双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,) 双目测距 ...
- K8S节点配置资源驱逐
#参考文章:https://www.cnblogs.com/zhangrui153169/p/15726165.html 当节点内存到达多少时.对节点的pod进行驱逐 [root@lecode-tes ...
- i春秋Upload
打开是一句普普通通的话,先查看源码,发现提示,我们需要post我们从i春秋得到的东西 得到了什么呢?不知道,去看看cookie,没什么特别的地方,再去抓包试试 找到了我们需要post的东西,不过这东西 ...
- 求10以内所有偶数和-Java
public class Demo{ //求10以内所有偶数和 public static void main (String[] args){ int sum = 0; for(int i = 0; ...