8.10 NOIP模拟测试16 Blue+Weed+Drink
T1 Blue
贪心,每次跳得时候跳能跳到的最远的地方,跳过的就把他设为0,每次二分找到位置,一直跳就行,如果能跳到的位置就是当前位置或比当前位置还小(数组里现在呆着的这一块石头,二分得到的就是当前位置,-1就比当前位置小了。但由于0的影响,while回退很慢,所以改用支持earse操作的set,可以水过他(这是T40和AC的区别!!!)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
int T,n,m,d,l;
set<int>st;
set<int>::iterator it;
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc<=''&&cc>=''){aa=aa*+cc-'';cc=getchar();}
return aa*bb;
}
int main()
{
T=read();
while(T--){
st.clear();
n=read();m=read();d=read(),l=read();
bool flag=,flag1=;
for(int i=;i<=n;i++){
st.insert(read());
}
st.insert(l);st.insert();
if(d==l){
puts("Excited");
continue;
}
for(int i=;i<=m;i++){
int pos=;
while(pos<l){
if(pos+d>=l) break;
it=st.upper_bound(pos+d);
if(*(--it)<=pos){
flag=;
break;
}
pos=*it;
st.erase(it);
}
if(flag){
printf("%d\n",i-);
flag1=;
break;
}
}
if(flag1) continue;
puts("Excited");
}
return ;
}
blue
T2 Weed
树袋熊学长的课件里讲过,然而我并不会。
又是一道神奇的线段树,用一个神奇的cal函数,我们就可以愉快的拿到100分的好成绩!
以时间为下标,建一棵线段树,树中维护4个值sum,del,cnt,las
sum:当前区间内所有操作添 删之后剩下金克拉的总和 ans=t[1].sum
del:当前区间还要向前(当前区间的前一个区间)删除多少层
cnt:当前区间被自己区间删完后还剩多少层
las:左儿子被右儿子用del删除后还剩多少(只对左儿子维护)
cal函数的作用就是计算las的值,update的时候维护x信息时,左儿子会被右儿子删除,为了维护区间信息的正确性,需要用右儿子的del删除左儿子的一些值,删除等操作我们只是保存在区间信息里,而不对下面的节点做修改(因为这是区间信息)。左儿子的cnt和右儿子的del有下面几种关系,分别处理即可
1.l.cnt<r.del 左儿子不够删,那就直接当作左儿子不存在,计算剩下的值得到x的sum值
2.r.del==0 右儿子中不存在删除操作,直接合并
3.l.r.cnt>r.del 左儿子的右儿子就够右儿子删了,return l.las+cal(l.r,r.del)
4.l.r.cnt<r.del 左儿子的右儿子不够右儿子不够删,那就继续去左儿子的左儿子里删 return cal(l.l,r.del-l.r.cnt+l.r.del) 记得加上左儿子的右儿子对左儿子的左儿子的del
5.l.r.cnt==r.del 左儿子的右儿子刚好够删,直接return l.las
修改操作实际上就是线段树的单点修改操作,改动一个值,其他区间的信息会被update上去,最后t[1].sum即为答案。
/*sum:区间内删完后的总和
del:当前区间要往前删多少个
cnt:当前区间删完后还有多少个加的操作
las:左儿子被右儿子删完后的总和*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct node
{
int l,r,sum,del,cnt,las;
}t[];
int n,m,opt,v;
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc<=''&&cc>=''){aa=aa*+cc-'';cc=getchar();}
return aa*bb;
}
int cal(int x,int num)
{
if(t[x*+].cnt>num) return t[x*].las+cal(x*+,num);
if(t[x*+].cnt<num) return cal(x*,num-t[x*+].cnt+t[x*+].del);
if(t[x*+].cnt==num) return t[x*].las;
}
void update(int x)
{
if(!t[x*+].del){
t[x].sum=t[x*].sum+t[x*+].sum;
t[x].del=t[x*].del;
t[x].cnt=t[x*].cnt+t[x*+].cnt;
t[x*].las=t[x*].sum;
return;
}
if(t[x*].cnt<=t[x*+].del){
t[x].sum=t[x*+].sum;
t[x].del=t[x*].del+t[x*+].del-t[x*].cnt;
t[x].cnt=t[x*+].cnt;
t[x*].las=;
return;
}
t[x*].las=cal(x*,t[x*+].del);
t[x].sum=t[x*].las+t[x*+].sum;
t[x].del=t[x*].del;
t[x].cnt=t[x*+].cnt+t[x*].cnt-t[x*+].del;
}
void build(int x,int l,int r)
{
t[x].l=l;t[x].r=r;
if(l==r){
opt=read();
if(opt==){
t[x].sum=read();
t[x].del=;
t[x].cnt=;
t[x].las=;
}
else{
t[x].sum=;
t[x].del=read();
t[x].cnt=;
t[x].las=;
}
return;
}
int mid=(l+r)>>;
build(x*,l,mid);
build(x*+,mid+,r);
update(x);
}
void change(int x,int pos)
{
if(t[x].l==t[x].r&&t[x].l==pos){
if(opt==){
t[x].sum=v;
t[x].del=;
t[x].cnt=;
t[x].las=;
}
else{
t[x].sum=;
t[x].del=v;
t[x].cnt=;
t[x].las=;
}
return;
}
int mid=(t[x].l+t[x].r)>>;
if(pos<=mid) change(x*,pos);
else change(x*+,pos);
update(x);
}
int main()
{
n=read();m=read();
build(,,n);
for(int i=,j;i<=m;i++){
j=read();opt=read();v=read();
change(,j);
printf("%d\n",t[].sum);
}
return ;
}
Weed
T3 Drink
一圈一圈的先存下来,然后转后应在的地方“铺”上去,用队列存T30,用数组存并且用char类型存储表格(只有1~9)可以到T60,调整一下循环顺序T80,register删掉,for改while可以卡到T90,最后把快读稍改,就A了
就一句话,疯狂卡常可以A。
然而正解并不长这样。。。具体长啥样我也不知道
以下是正解:
Drink:
看惯了罗马音的小朋友们都会知道r发l的音,题目名:D Link.
每次修改都会改变O( N ^ 2 )个位置的值,二维平面上没有一个确定的正方向,因此也无法使用传统数据结构。
什么东西的变化量是O( N )级别的呢?
如果把每个点都看作一个人,他的头面向某个方向。分别记录这个人的方向上的前后左右分别是谁,那么每次旋转改变的只是正方形边缘上的值,以及所有点的方向。
这样来看至少我们发现了变化量为O( N )级别的东西啦(虽然方向的该变量还是O( N ^ 2 ))。
注意到,我们并不需要真的知道每个点的方向,我们只需要正确地维护前后左右四个值即可。因为每个点的方向是可以由已知方向的相邻点算出来的!
每个点确实是有方向的,但是我们不用纪录也不用直接更改它,每次只要正确修改边界上的值,整个矩形的方向就会自动改变。
解决啦!
复杂度O( Q * N ), 常数稍大。
#include<iostream>
#include<cstdio>
const int L=<<|;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
using namespace std;
char a[][],c,b[];
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc<=''&&cc>=''){aa=(aa<<)+(aa<<)+(cc^);cc=getchar();}
return aa*bb;
}
int main()
{
int n,m,qq,num;
n=read(),m=read(),qq=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
c=getchar();
while(c<''||c>'') c=getchar();
a[i][j]=c;
}
int x,y,l,i=,j;
while(i<=qq){
x=read();y=read();l=read();
while(l>=){
num=;
j=;while(j<l) b[++num]=a[x][y+j],++j;
j=;while(j<l) b[++num]=a[x+j][y+l-],++j;
j=l-;while(j>=) b[++num]=a[x+l-][y+j],--j;
j=l-;while(j>=) b[++num]=a[x+j][y],--j; j=l-;while(j>=) a[x][y+j]=b[num--],--j;
j=;while(j<=l-) a[x+j][y]=b[num--],++j;
j=;while(j<=l-) a[x+l-][y+j]=b[num--],++j;
j=l-;while(j>=) a[x+j][y+l-]=b[num--],--j;
x++,y++;l-=;
}
i++;
}
i=;
while(i<=n){
j=;
while(j<=m){
putchar(a[i][j]),putchar(' ');
j++;
}
puts("");
i++;
}
return ;
}
Drink(暴力+卡常)
总之这道题的测试点还是很水的,T1T3暴力都可以水过,但样例给的太灭绝人性,把电脑卡崩3 4次。
8.10 NOIP模拟测试16 Blue+Weed+Drink的更多相关文章
- 2019.8.10 NOIP模拟测试16 反思总结【基本更新完毕忽视咕咕咕】
一如既往先放代码,我还没开始改… 改完T1滚过来了,先把T1T2的题解写了[颓博客啊] 今天下午就要走了,没想到还有送行的饯别礼,真是欣喜万分[并没有] 早上刚码完前面的总结,带着不怎么有希望的心情开 ...
- NOIP模拟测试16「Drink·blue·weed」
话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...
- noip模拟测试16
这次考试,难度还是不小的,先说一下考试过程,首先看一遍题,觉得开题顺序1 3 2, 然后我就先打了第一题,我当时可能是受到之前做题的限制了,觉得他只能每次走一 格,也就是一个单位长度,但是实际上,他甚 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 2019.8.9 NOIP模拟测试15 反思总结
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
随机推荐
- iframe嵌套页面中的跳转
简单说一下场景. 假设有A.B.C和D四个JSP页面,D通过iframe嵌套在C中,C通过iframe嵌套在B中,B通过iframe嵌套在A中. 然后现在在D中编写JavaScript代码跳转页面. ...
- axios和fetch区别对比
axios axios({ method: 'post', url: '/user/12345', data: { firstName: 'Fred', lastName: 'Flintstone' ...
- 解决 Visual Studio 符号加载不完全问题
解决 Visual Studio 符号加载不完全问题 工具 - 选项 - 搜索 "符号" - 选上服务器 | 加载所有符号, 之后符号就会显示完全
- FocusVisualStyle
<Style x:Key="MyFocusVisual"> <Setter Property="Control.Template"& ...
- 如何使用Charles让手机访问PC自定义域名?
需求:移动端访问PC上的自定义域名,如在Nginx上配置的域名 如vv.zzcloud.com这个域名在pc上是通过host映射的方式访问,现在需要在手机上访问到这个域名. 工具:Charles代 ...
- px与em的区别
PX特点:px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.EM特点 1. em的值并不是固定的:2. em会继承父级元素的字体大小.
- Python【day 10】函数进阶-动态函数
形参小结 1.位置参数2.默认值参数3.动态参数 1.*args 位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组 2.**kwargs 关键字参数的动态传参. 系统会自动的把所有的关键字 ...
- 学习shiro第一天
shiro是一个强大而且易用的安全框架(主要包括认证和授权),它比spring security更加简单,而且它不依赖于任何容器,可以和许多框架集成. shiro的核心是安全管理器(SecurityM ...
- JPA笔记1 ManyToOne
persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence ver ...
- Linux服务器用postfix 发送邮件延迟 阻塞 被接收方拒绝等问题
Linux服务器用postfix 发送邮件延迟 阻塞 被接收方拒绝等问题 postfix如何设置发送邮件延迟通知 1 */1 * * * /bin/bash /home/delete_postfix. ...