2018.10.15模拟赛

2024-01-03 14:18
文章标签 15 模拟 2018.10

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

T1

水题

T2

有很多种方法能 A A A,比如说树状数组或者线段树

觉得 w z h wzh wzh的方法很好,就是将采矿点排序,然后对于每个矿石区间,二分查找能覆盖到的第一个采矿点和最后一个采矿点,用类似差分的思想在这两个点上做个标记,然后遍历每一个采矿点,如果说这个点被一些区间覆盖了,但是这些区间之中有一些还可以覆盖前面采矿点,此时如果用 2 n 2^n 2n这种方法算的话会算重,那么只需要把单独选前面那些区间的方案去掉就好了,就是 2 n − 2 m 2^n-2^m 2n2m这种

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 200005
#define LL long long
using namespace std;
int n,m,a[maxn],l[maxn],r[maxn],cntr[maxn],cntl[maxn];
LL ans,bin[maxn];
bool isp[maxn];
const int mod=998244353;inline int rd(){int x=0,f=1;char c=' ';while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}inline void prework(){bin[0]=1;for(int i=1;i<=n;i++) bin[i]=(bin[i-1]<<1)%mod;
}inline int find(int x,bool typ){int ll=1,rr=m,res=0;while(ll<=rr){int mid=(ll+rr)>>1;if(!typ){//找第一个大于等于左端点的 if(a[mid]>=x) rr=mid-1,res=mid;else ll=mid+1;}else{//找第一个小于等于右端点的 if(a[mid]<=x) ll=mid+1,res=mid;else rr=mid-1;}} return res;
}inline void solve(){sort(a+1,a+m+1);for(int i=1;i<=n;i++){int lf=find(l[i],0);if(!lf || a[lf]>r[i]) continue;cntl[lf]++; int rg=find(r[i],1);cntr[rg]++;}int cnt=0;for(int i=1;i<=m;i++){if(cntl[i])(ans+=bin[cnt+cntl[i]]-bin[cnt]+mod)%=mod;cnt+=cntl[i]-cntr[i];}
}int main(){freopen("B.in","r",stdin);freopen("B.out","w",stdout);n=rd(); m=rd(); prework();for(int i=1;i<=n;i++) l[i]=rd(),r[i]=rd();for(int i=1;i<=m;i++) a[i]=rd();solve();printf("%lld\n",ans);return 0;
}

T3

看似很难其实很简单的题

一开始想暴力,可以维护一个栈,如果下一个元素和栈顶元素相同就弹出,他们可以匹配成一对括号,栈为空就是一个合法的序列,正解和暴力的思想差不多,就是用哈希维护栈的形态,,用 m a p map map存当前形态出现次数,如果当前栈的形态和之前某次栈的形态相同,那么说明中间的一段一定是合法的,就让 a n s + = m p [ n o w ] ans+=mp[now] ans+=mp[now],哈希要用双哈希,就是把两个哈希拼到一起,看别人的博客学习了一下双哈希姿势

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#define maxn 1000005
#define LL long long
using namespace std;
int n,stk[maxn],top;
char s[maxn];
LL ans;
const int bas=29, mod1=1e9+7,mod2=1e9+9;struct qwq{int x,y;LL get(){return 1LL*x*mod2+y;}bool operator <(const qwq &b) const{return x<b.x||(x==b.x&&y<b.y);}
}has[maxn];map<LL,int> mp;int main(){freopen("C.in","r",stdin);freopen("C.out","w",stdout);scanf("%s",s+1); n=strlen(s+1);has[0].x=0,has[0].y=0; mp[has[0].get()]++;for(int i=1;i<=n;i++){if(top && stk[top]==s[i]-'a'+1) top--;else{stk[++top]=s[i]-'a'+1;has[top]=has[top-1];has[top].x=(1LL*has[top].x*bas+s[i]-'a'+1)%mod1;has[top].y=(1LL*has[top].y*bas+s[i]-'a'+1)%mod2;}LL tmp=has[top].get();ans+=mp[tmp]; mp[tmp]++;}printf("%lld\n",ans);return 0;
}

整场考试处于不清醒的状态···立 f l a g flag flag以后 23 : 20 23:20 23:20以前睡觉

这篇关于2018.10.15模拟赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【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<

hdu4431麻将模拟

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

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

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

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代