[NOIP模拟16]题解
A.Blue
出题人大概已经去为国家处理积压子弹了?
贪心,让每一只青蛙(我怂行吧)都尽量往远跳,能到达的最远的被踩了就跳次远的,以此类推。可以维护一个单调队列,表示每只青蛙的位置(开始都是0)。然后按顺序扫一遍每个石头,如果队首的青蛙不能跳过去就放弃它直接pop掉,如果能跳就把石头位置从队尾push进去并pop掉队首的旧位置,最后队列的size就是答案。因为你肯定不能可着一个青蛙往前跳,必须尽量不让任何一只掉队,所以一只跳完之后把它丢到队尾。
比较神奇的是这道题用STL会比手写队列快300ms??
#include<cstdio> #include<iostream> #include<cstring> #include<queue> using namespace std; const int N=1e6+5; int T,n,m,D,L; int a[N]; void work() {cin>>n>>m>>D>>L;for(int i=1;i<=n;i++)cin>>a[i];a[n+1]=L;deque<int> q;for(int i=1;i<=m;i++)q.push_back(0);for(int i=1;i<=n+1;i++){while(!q.empty()&&q.front()+D<a[i])q.pop_front();q.push_back(a[i]);q.pop_front();}if(q.size()==m)puts("Excited");else printf("%d\n",q.size()); } int main() {ios::sync_with_stdio(false);cin.tie(0);cin>>T;while(T--)work();return 0; }
STL:deque
#include<cstdio> #include<iostream> #include<cstring> #include<queue> using namespace std; const int N=1e6+5; int T,n,m,D,L; int a[N],q[N]; void work() {cin>>n>>m>>D>>L;for(int i=1;i<=n;i++)cin>>a[i];a[n+1]=L;memset(q,0,sizeof(q));int head=1,tail=m;for(int i=1;i<=n+1;i++){while(head<=tail&&q[head]+D<a[i])head++;q[++tail]=a[i];head++;}if(tail-head+1==m)puts("Excited");else printf("%d\n",tail-head+1); } int main() {ios::sync_with_stdio(false);cin.tie(0);cin>>T;while(T--)work();return 0; }
数组
B.Weed
好题,先咕着
用线段树维护操作的题还是第一次见
线段树上的区间指的是一段连续的操作区间,而不是实际的序列
维护$add$(加了多少层)$del$(删了多少层)$sum$(有多少量)$lsum(被兄弟删除后的量,仅对左儿子维护)$
$up()$的时候如果左儿子不够右儿子删,直接清0即可。但要是右儿子删不完左儿子就很麻烦了。需要专门设计一个函数计算当前区间中删了x个元素的和。
(于是我又懒癌发作了)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int read() {int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0',ch=getchar();}return x*f; } const int N=2e5+55; #define ls(k) k<<1 #define rs(k) k<<1|1 int m,Q; struct ques {int op,val; }q[N]; int del[N<<2],add[N<<2],lsum[N<<2],sum[N<<2]; int query(int k,int val) {if(val==add[rs(k)])return lsum[ls(k)];if(val>add[rs(k)])return query(ls(k),val-add[rs(k)]+del[rs(k)]);if(val<add[rs(k)])return lsum[ls(k)]+query(rs(k),val); } void up(int k) {if(add[ls(k)]<=del[rs(k)]){lsum[ls(k)]=0;sum[k]=sum[rs(k)];add[k]=add[rs(k)];del[k]=del[rs(k)]+del[ls(k)]-add[ls(k)];}else{del[k]=del[ls(k)];add[k]=add[ls(k)]+add[rs(k)]-del[rs(k)];if(del[rs(k)])lsum[ls(k)]=query(ls(k),del[rs(k)]);else lsum[ls(k)]=sum[ls(k)];sum[k]=sum[rs(k)]+lsum[ls(k)];} } void build(int k,int l,int r) {if(l==r){if(q[l].op==0)add[k]=1,sum[k]=lsum[k]=q[l].val;else del[k]=q[l].val;return ;}int mid=l+r>>1;build(ls(k),l,mid);build(rs(k),mid+1,r);up(k); } void update(int k,int l,int r,int pos,int op,int val) {if(l==r){lsum[k]=add[k]=sum[k]=del[k]=0;if(op)del[k]=val;elseadd[k]=1,sum[k]=lsum[k]=val;return ;}int mid=l+r>>1;if(pos<=mid)update(ls(k),l,mid,pos,op,val);else update(rs(k),mid+1,r,pos,op,val);up(k); } int main() {/*freopen("weed.in","r",stdin);freopen("my.out","w",stdout);*/m=read();Q=read();for(int i=1;i<=m;i++)q[i].op=read(),q[i].val=read();build(1,1,m);for(int i=1;i<=Q;i++){int num=read(),op=read(),val=read();update(1,1,m,num,op,val);printf("%d\n",sum[1]);}return 0; }
View Code
C.Drink
没有打恶心至极的大常数正解,其实优化暴力+卡常跑出来和正解的时间相差无几。
%%%WHS式循环展开 TQL 帅过WYS
优化暴力的思路就是每层矩形只枚举最上面的那条边上的点,因为有了这条边上一个点的坐标就可以完成矩形上四个点的旋转,所以只枚举一条边上的点就能完成整个矩形的旋转。
然后调整边长和左上角坐标,对每层矩形都来一遍就好了。复杂度其实相比最暴力的没有变,但是循环次数少了,相当于一种循环展开。
当然还要稍作卡常,$int$转$char$ $getchar$读入 $putchar$输出啥的
#include<cstdio> #include<iostream> #include<cstring> #define re register using namespace std; const int N=3005; int n,m,Q,x,y,c; char a[N][N],b[N][N]; inline int read() {re int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f; } int main() {n=read();m=read();Q=read();for(re int i=1;i<=n;i++)for(re int j=1;j<=m;j++){a[i][j]=getchar();while(!isdigit(a[i][j]))a[i][j]=getchar();}while(Q--){x=read();y=read();c=read();for( ;c>1;c-=2,x++,y++){re int L=y,U=x,D=x+c-1,R=y+c-1;for(re int i=0;i<=c-2;i++){char old=a[U+i][R];a[U+i][R]=a[U][L+i];a[U][L+i]=a[D-i][L];a[D-i][L]=a[D][R-i];a[D][R-i]=old;}}}for(re int i=1;i<=n;i++){for(re int j=1;j<=m;j++)putchar(a[i][j]),putchar(' ');putchar('\n');}return 0; }
View Code
转载于:https://www.cnblogs.com/Rorschach-XR/p/11333782.html
[NOIP模拟16]题解相关推荐
- [NOIP]模拟17 题解
A.入阵曲 部分分很肥,正解写得常数稍大就会和暴力一个分,考试的时候写什么自己考虑.(滑稽 部分分的循环边界手抖写错了-25 (原本暴力分中的10分都没了啊啊啊) 没写挂的话应该有75,其实就是二维前 ...
- 第一届『Citric杯』NOIP提高组模拟赛 题解
[官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...
- NOIP 模拟赛 长寿花 题解
NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...
- NOIP模拟赛 四校联考 递推 + 分类讨论 + 树上期望
NOIP 模拟题 题目名称兔子被子蚊子 源程序文件名rabbit.cpp quilt.cpp mosquito.cpp 输入文件名rabbit.in quilt.in mosquito.in 输出文件 ...
- 【noip模拟赛4】Matrix67的派对 暴力dfs
[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...
- 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26
背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...
- Noip 模拟练习5
Noip 模拟练习5 满分300,本人240.修正后300. 难度中等. 太空密码 Description 人类一直致力于探索地外文明,为此科学家们建造了一个巨大的射电望远镜 用于接收宇宙射线.一天从 ...
- 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)
[题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
最新文章
- 一个已经存在 10 年,却被严重低估的库!
- Python 之 Matplotlib (四)图例
- Stanford UFLDL教程 稀疏编码
- usb打印机命令_打印机脱机怎么办 打印机脱机解决方法【详解】
- bwlabel算法_bwlabel函数的c++实现
- adf可以自定义溶剂吗_ADF Faces。 立即的自定义客户端事件
- mgg mysql_mgg文件怎么转换mp3格式?
- java使用Websocket获取HttpSession出现的问题与解决
- html网页url伪静态,动态url 静态url 伪静态url页面的区别
- 计算机应用助手工程师,通信工程师备考助手
- 雷赛控制卡总线方式的坑
- Python3截图识字工具
- Youtube 开发通过遥控机控制实现快进快退功能
- ARM学习系列 ---- ARM公司简介
- _,predicted=中_,的作用
- Daemon Tools 4.x 或SPTD.SYS导致Windows不能启动的问题的解决方案
- centos搭建流媒体服务器
- 响应式极简新闻发布系统源码
- 6.28(HTML2)
- IOS开发学习笔记(一)
热门文章
- oracle 抽样_利用ORACLE实现数据抽样(sample block)
- OSG学习:OSG组成(二)——渲染状态和纹理映射
- 计算机系统结构 外文,计算机系统结构外文文献 计算机系统结构参考文献怎么写...
- 'wx' is not defined no-undef
- Android手机设备唯一标识符
- OpenGL中phong光照模型详解
- 回路、简单回路、简单路径
- linux pannel 误删除后的恢复方法
- Invalid row number (65536) outside allowable range (0..65535)
- 《疯狂农场》带来的启示