[toc]
CF293B Distinct Paths=JZOJ 4012
CF261E Maxim and Calculator=JZOJ 4010

JZOJ 2292 PPMM

题目

满足队列出入队,还要全部取反或者输出队列最大数


分析

首先全部取反也就是输出队列最小值的相反数

所以最理想的方法就是单调队列

也可以用带$log$的数据结构维护,但是容易被卡掉,

这里用树状数组,但是树状数组不满足删除,所以就把下标旋转,跑的还是挺快的


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=2000011,inf=2147483647;
int n,cur,now,op,ges,cmin[N],cmax[N];
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void Min(int &x,int y){if (x>y) x=y;}
inline void Max(int &x,int y){if (x<y) x=y;}
inline void add(int x,int y){for (;x<=now;x+=-x&x) Min(cmin[x],y),Max(cmax[x],y);}
inline signed qmin(int x){
rr int ans=inf;
for (;x;x-=-x&x) Min(ans,cmin[x]);
return ans;
}
inline signed qmax(int x){
rr int ans=-inf;
for (;x;x-=-x&x) Max(ans,cmax[x]);
return ans;
}
inline void Pop(){if (cur<=now) --now;}
inline void Push(int x){add(--cur,x*op);}
inline void Fan(){if (cur<=now) op*=-1,ges^=1;}
inline void Gax(){
if (cur<=now){
rr int ans=op*(ges?qmin(now):qmax(now));
if (ans<0) putchar('-'),print(-ans);
else print(ans);
putchar(10);
}
}
signed main(){
n=iut(),cur=n+1,now=n,op=1;
for (rr int i=1;i<=n;++i) cmin[i]=inf,cmax[i]=-inf;
for (rr int i=1;i<=n;++i){
rr char c=getchar(); rr bool flag=0;
while (c!='P'&&c!='M') c=getchar();
switch (c=getchar()){
case 'O':Pop(),flag=1;break;
case 'U':Push(iut()); break;
case 'I':Fan(); break;
case 'A':Gax(); break;
}
if (flag) c=getchar();
}
return 0;
}

JZOJ 4012 Distinct Paths

题目

有一个$n*m$的木板,一些块已经被涂上给出的$k$种颜色中的一种。

你需要把每个没涂色的块涂色使得从左上角到右下角的每条路径都不会经过两个颜色一样的块。路径只能向右或向下走。


分析

首先这道题就是$n+m-1>k$肯定不可能的,所以其实就是搜索,但是要有技巧的剪枝


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int mod=1000000007;
int g[11][11],a[11][11];
int cnt[11],xo[1024],n,m,k;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline signed dfs(int x,int y){
if (y==m+1) ++x,y=1;
if (x==n+1) return 1;
rr int S=g[x-1][y]|g[x][y-1],ans=0,sing=-1;
if (n+m-x-y+1>k-xo[S]) return 0;
for (rr int i=0;i<k;++i)
if (!(S&(1<<i))&&((!a[x][y])||(a[x][y]==i+1))){
++cnt[i+1],g[x][y]=S|(1<<i);
if (cnt[i+1]==1){
if (sing==-1) sing=dfs(x,y+1);
ans=mo(ans,sing);
}else ans=mo(ans,dfs(x,y+1));
--cnt[i+1];
}
return ans;
}
signed main(){
for (rr int i=1;i<1024;++i) xo[i]=xo[i&(i-1)]+1;
n=iut(),m=iut(),k=iut();
if (n+m>k+1) return !putchar(48);
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j) ++cnt[a[i][j]=iut()];
return !printf("%d",dfs(1,1));
}

JZOJ 4010 Philips and Calculator

题目

可以用$x$次操作后选取$y$次$1\sim x$的可以相同的数相乘,但要保证$x+y\leq p$,问$[l\sim r]$有多少数能够这样被得到


分析

首先$x<p$所以可以把$2\sim p-1$的质数预处理,然后用这些数构造$1\sim r$的能够被乘出来的数进行dp

赛时想到应该是质因数个数+最大质因数,然而并不是,就以$64=26=43=8^2$为例,选择$4+3=7$答案更小

所以就$dp$,设$dp[n]$表示$n$所需要表示的最小步数,那么$dp[n]=\min{dp[n/i]+1}$,时间复杂度$O(pn)$,还要注意优化


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int prime[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
const int N=3000011; int l,r,p,ans,tot,bac,dp[N],a[N]; bool v[N];
inline void dfs(int dep,int now){
a[++tot]=now;
for (rr int i=dep;i<=bac;++i)
if (now<=r/prime[i])
dfs(i,now*prime[i]);
}
signed main(){
scanf("%d%d%d",&l,&r,&p);
if (p==1||p==2) return !putchar(48);
for (bac=24;prime[bac]>=p;--bac);
dfs(0,1),sort(a+1,a+1+tot),v[1]=1;
for (rr int i=2;i<=tot;++i) dp[i]=1e9;
for (rr int i=2;i<=p;++i)
for (rr int k=1,j=i;k<=tot;++k){
if (dp[k]+i+1>p) continue;
for (;j<=tot&&a[j]!=a[k]*i;++j);
if (j>tot) break;
if (dp[j]>dp[k]+1) dp[j]=dp[k]+1;
if (a[j]<l||v[j]||dp[j]+i>p) continue;
++ans,v[j]=1;
}
return !printf("%d",ans);
}

2020.02.05【NOIP提高组】模拟A 组的更多相关文章

  1. 纪中集训2020.02.05【NOIP提高组】模拟B 组总结反思——【佛山市选2010】组合数计算,生成字符串 PPMM

    目录 JZOJ2290. [佛山市选2010]组合数计算 比赛时 之后 JZOJ2291. [佛山市选2010]生成字符串 比赛时 之后 JZOJ2292. PPMM 比赛时 之后 JZOJ2290. ...

  2. 【纪中集训】2019.08.02【NOIP提高组】模拟 A 组TJ

    \(\newcommand{\RNum}[1]{\uppercase\expandafter{\romannumeral #1\relax}}\) T1 一道可以暴力撵标算的题-- Descripti ...

  3. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

    题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...

  4. [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)

    传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...

  5. 2020牛客NOIP赛前集训营-普及组(第二场)A-面试

    面 试 面试 面试 题目描述 牛牛内推了好多人去牛客网参加面试,面试总共分四轮,每轮的面试官都会对面试者的发挥进行评分.评分有 A B C D 四种.如果面试者在四轮中有一次发挥被评为 D,或者两次发 ...

  6. 2020牛客NOIP赛前集训营-普及组(第二场) 题解

    目录 T1 面试 描述 题目描述 输入描述: 输出描述: 题解 代码 T2 纸牌游戏 描述 题目描述 输入描述: 输出描述: 题解 代码 T3 涨薪 描述 题目描述 输入描述: 输出描述: 题解 代码 ...

  7. JZOJ 2020.02.01【NOIP提高组】模拟A 组

    2020.02.01[NOIP提高组]模拟A 组 二月份第一场比赛 闲话 惨烈啊! 50+30+0=80分 一题都没A 唉 最高150? \(zzh\) 暴虐A组 总结: 若干新东西 \(T1\) 我 ...

  8. JZOJ 2020.02.16【NOIP提高组】模拟A 组

    2020.02.16[NOIP提高组]模拟A 组 呼呼呼呼呼呼呼呼 今天暴力分可真多啊 第一次 \(A\) 组进前 \(5\) ! 呼呼呼呼呼呼呼呼 总有人虐场,总有人在场中被虐······ 总结 3 ...

  9. JZOJ 2020.01.11【NOIP提高组】模拟B组

    2020.01.11[NOIP提高组]模拟B组 今天的题是不是和 \(C\) 组放错了? 呵呵 然,却只有 \(300\) 分 首先,\(T4\) 看错题了 后,一时想不到正解 讨论区,一看,三个字- ...

  10. SX【2020.01.09】NOIP提高组模拟赛(day1)

    [2020.01.09]NOIP提高组模拟赛(day1) 这次考得不理想,只做了前两题,后两题没时间做,说明做题速度偏慢. source : 100 + 20 + 0 + 0 = 120 rank7 ...

随机推荐

  1. pikachu php反序列化漏洞

    原理 php中serialize(),unserialize()这两个函数. 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ p ...

  2. dart的map方法如何获取index

    一.前言 我们常常用dart中的map方法遍历List,但是直接用map,只能取到value,得不到index,这是因为map方法就只给了一个value,map的实现如下图: 下面就看看获取index ...

  3. day06---基础优化之防火墙,yum源,字符集,vim补充,echo命令

    1.系统版本号 cat /etc/redhat-release hostnamectl uname -r 2.系统 时间硬件时间 date hwclock clock hwclock systohc ...

  4. Vue 上传前获取图片宽度尺寸和大小

    参考资料:https://www.cnblogs.com/wyx-remove-love/p/wyx-20190626-1.html    https://blog.csdn.net/qq_22771 ...

  5. 黑马python基础课的一些题

    1, 打印5行小星星 思路: 可以用1个星星乘以行数:还可以循环嵌套,外层循环控制行数,内层循环控制每一行应该输出多少个小星星,比如,第一行输出1个,第二行输出2个,内层循环可以当成列,只不过这个列要 ...

  6. 使用rpa打开浏览器并执行js抓取页面元素详情步骤

    这里我们专门开一个文章来写如何在rpa中执行js获取页面元素. 个人觉得,复杂点的需求用js会方便很多,所以后续的文章我都会重点使用js去获取页面元素. 好,正文开始,我们先看一下rpa为我们提供的自 ...

  7. SpringCloud Ribbon和Feign 的使用和源码分析

    1. Ribbon 介绍 Ribbon 是 Netflix 公司开源的一款 客户端 负载均衡软件,并被SpringCloud集成 作为SpringCloud 负载均衡的工具 服务端负载均衡 : 即在服 ...

  8. C++ //常用集合算法 //set_intersection //求俩个容器的交集 //set_union //求两个容器的并集 //set_difference //求两个容器的差集

    1 //常用集合算法 2 //set_intersection //求俩个容器的交集 3 //set_union //求两个容器的并集 4 //set_difference //求两个容器的差集 5 ...

  9. Kali 获取任意设备信息

    注意:仅供测试 请勿商用 可获取对方位置 误差小于500m 访问摄像头 访问麦克风 一. 安装环境 #01 mac 安装虚拟机 下载地址:https://www.macyy.cn/archives/1 ...

  10. electron打包踩过的坑总结 好文

    electron打包踩过的坑总结 https://segmentfault.com/a/1190000018533945