2018.07.17【2018提高组】模拟C组

2024-02-11 06:18
文章标签 模拟 17 2018 提高 2018.07

本文主要是介绍2018.07.17【2018提高组】模拟C组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:OTL。。。


题目

JZOJ 1264 乱头发节

题目

求一头牛到后面第一头不低于该牛身高的牛之间的牛的数量(不包括两头牛,如果没有不低于的,就当做最后有一头无限高的牛)


分析

单调栈!如果不想开long long,那就用unsigned


代码

#include <cstdio>
#include <cctype>
#include <stack>
using namespace std;
typedef unsigned u;
u n,a[80002],ans; stack<u>st;
u in(){u ans=0; char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans;
}
int main(){freopen("badhair.in","r",stdin);freopen("badhair.out","w",stdout);n=in(); st.push(n+1); a[n+1]=1<<31;for (u i=1;i<=n;i++) a[i]=in();for (u i=n;i>=1;i--){while (a[st.top()]<a[i]&&st.size()) st.pop();ans+=st.top()-i-1; st.push(i);}return !printf("%u",ans);
}

JZOJ 1265 Round Numbers

题目

求区间 [ l ⋅ ⋅ ⋅ r ] 中 [l\cdot\cdot\cdot r]中 [lr]在二进制下0的个数不少于1的个数 的数的个数。


分析

数位dp,用类似于前缀和的方式相减,可以发现对于最高位, 答案是
∑ l e n = 1 l e n &lt; L e n ∑ C l e n − 1 i ∣ i ∗ 2 &gt; = l e n \sum _{len=1}^{len&lt;Len}\sum C_{len-1}^i|i*2&gt;=len len=1len<LenClen1ii2>=len(kind of easy)
处理边界也比较简单,但是问题是非最高位怎么求,用一个duo表示1的个数。
然后剩下的挺像的,关键是细节部分!


代码

#include <cstdio>
#define min(a,b) (a<b)?a:b
using namespace std;
int len,l,r,num[31],f[31][31];
void init(){for (int i=0;i<31;i++) f[i][0]=1;for (int i=1;i<31;i++)for (int j=1;j<=i;j++) f[i][j]=f[i-1][j-1]+f[i-1][j];
}
int make(int x,int y){int resu=0;for (int i=0;i<=x;i++) if (i<<1>=x+y) resu+=f[x][i];return resu;
}
int ans(int x){if (x<2) return 0;int len=0,answer=0;while (x) num[++len]=x&1,x>>=1;for (int i=1;i<len;i++) answer+=make(i-1,1);int duo=1; len--;while (len){if (num[len]) answer+=make(len-1,duo-1);//如果是1说明可以扩展答案duo+=num[len--]?1:-1;//是不是1}return answer+=(duo<=0);//如果全是0那么答案加1
}
int main(){freopen("rndnum.in","r",stdin);freopen("rndnum.out","w",stdout);init(); scanf("%d%d",&l,&r);return !printf("%d",ans(r)-ans(l-1));//前缀和
}

JZOJ 1266 玉米田

题目

在M*N个格子里选择若干个互不相邻的格子并不能在规定的格子里,求方案数mod 1 0 8 10^8 108


分析

状压dp,状态转移方程 d p [ i ] [ j ] + = d p [ i − 1 ] [ k ∣ f [ i − 1 ] ] dp[i][j]+=dp[i-1][k|f[i-1]] dp[i][j]+=dp[i1][kf[i1]],枚举k,为上一行的状态,f[i]表示不能选择的状态。


代码

#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
typedef short sr;
sr n,m,f[13]; int dp[13][4097];
sr in(){sr ans=0; char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans;
}
int main(){freopen("cowfood.in","r",stdin);freopen("cowfood.out","w",stdout);n=in(); m=in();for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (!in()) f[i]|=1<<j-1;//0不能选for (int i=0;i<1<<m;i++) dp[0][i]=1;//一开始方案都只有一种for (int i=1;i<=n;i++){for (int j=0;j<1<<m;j++){//枚举当前状态if (~j&f[i]) continue; //不匹配for (int k=0;k<1<<m;k++) if (!(k&(k<<1))&&!(k&j))//若状态可选且上一个状态的格子与当前状态的格子互不相邻dp[i][j]=(dp[i][j]+dp[i-1][k|f[i-1]])%100000000;//dp}}return !printf("%d",dp[n][f[n]]);
}

JZOJ 1267 路障

题目

求单源次短路径


分析

在比赛的时候,spfa都打出来了,就是答案算错了V^V。双向SPFA,再枚举每一条边算出次短路径。


代码

#include <bits/stdc++.h>
using namespace std;
struct node{int y,w,next;}e[200001]; int ls[5001];
int n,m,k,dis1[5001],dis[5001]; bool v[5001]; queue<int>q;
int in(){int ans=0; char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans;
}
void spfa(int s,int *dis){v[s]=1; dis[s]=0; q.push(s);while (q.size()){int x=q.front(); q.pop();for (int i=ls[x];i;i=e[i].next)if (dis[x]+e[i].w<dis[e[i].y]){dis[e[i].y]=dis[x]+e[i].w;if (!v[e[i].y]) v[e[i].y]=1,q.push(e[i].y);}v[x]=0;} 
}
int main(){freopen("block.in","r",stdin);freopen("block.out","w",stdout);n=in(); m=in();for (int i=1;i<=m;i++){int x=in(),y=in(),w=in();e[++k]=(node){y,w,ls[x]}; ls[x]=k;e[++k]=(node){x,w,ls[y]}; ls[y]=k;}memset(dis,127/3,sizeof(dis)); spfa(1,dis); //从起点spfaint z=dis[n],ans=2147483647; memset(dis1,127/3,sizeof(dis1));memset(v,0,sizeof(v)); spfa(n,dis1);//从终点spfafor (int i=1;i<=n;i++)for (int j=ls[i];j;j=e[j].next)if (dis[i]+dis1[e[j].y]+e[j].w>z&&dis[i]+dis1[e[j].y]+e[j].w<ans) ans=dis[i]+dis1[e[j].y]+e[j].w;//每条边找次短路径return !printf("%d",ans);
}

后续

洛谷 2866 codevs 3098 badhair poj 3252 Round Numbers
洛谷 1879 玉米田 洛谷 2865 路障

这篇关于2018.07.17【2018提高组】模拟C组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699041

相关文章

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一