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的更多相关文章

  1. 2019.8.10 NOIP模拟测试16 反思总结【基本更新完毕忽视咕咕咕】

    一如既往先放代码,我还没开始改… 改完T1滚过来了,先把T1T2的题解写了[颓博客啊] 今天下午就要走了,没想到还有送行的饯别礼,真是欣喜万分[并没有] 早上刚码完前面的总结,带着不怎么有希望的心情开 ...

  2. NOIP模拟测试16「Drink·blue·weed」

    话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...

  3. noip模拟测试16

    这次考试,难度还是不小的,先说一下考试过程,首先看一遍题,觉得开题顺序1 3 2, 然后我就先打了第一题,我当时可能是受到之前做题的限制了,觉得他只能每次走一 格,也就是一个单位长度,但是实际上,他甚 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  5. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  7. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  8. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  9. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

随机推荐

  1. 为Azure DevOps Server (TFS) 配置安全访问(HTTPS with SSL)

    Contents 1. 概述 2. HTTP和HTTS比较 支持HTTP和HTTPS两种方式 要求所有连接使用HTTPS 优点: 缺点: 3. 为Azure DevOps Server 配置安全访问 ...

  2. MySQL数据库中查询表的所有列名

    MySQL数据库中: 查询某个数据库中某个表的所有列名 SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ...

  3. springboot2+shiro+jwt整合

    参考:https://www.jianshu.com/p/ef0a82d471d2 https://www.jianshu.com/p/3c51832f1051 https://blog.csdn.n ...

  4. 【洛谷5437】【XR-2】约定(拉格朗日插值)

    [洛谷5437][XR-2]约定(拉格朗日插值) 题面 洛谷 题解 首先发现每条边除了边权之外都是等价的,所以可以考虑每一条边的出现次数. 显然钦定一条边之后构成生成树的方案数是\(2*n^{n-3} ...

  5. 使用 PDBDownloader 解决 IDA 加载 ntoskrnl.exe 时符号不完全问题

    解决 IDA 加载 ntoskrnl.exe 时符号不完全问题 1. 问题:IDA加载xp系统的 ntoskrnl.exe 加载不完全. 2. 尝试过但未成功的解决方案: 1)配置好的IDA的 pdb ...

  6. Tomcat 简单容器化

    Tomcat 容器化 思考 问题1 , Tomcat 容器化,Tomcat 如何配置 APR 连接器 Tomcat 的基础镜像已经是开启了 APR. 问题2, Tomcat 是每次都需要重新构建. 一 ...

  7. 【论文阅读】Objects as Points 又名 CenterNet | 目标检测

    目录 Abstract Instruction 分析 CenterNet 的Loss公式 第一部分:\(L_k\) 第二部分:\(L_{size}\) 第三部分:\(L_{off}\) Abstrac ...

  8. Winform 通过 WebBrowser 与 JS 交互

    Winform 通过 WebBrowser 与 JS 交互 魏刘宏 2019.08.17 之前在使用 Cef (可在 Winform 或 WPF 程序中嵌入 Chrome 内核的网页浏览器的组件)时, ...

  9. 钉钉企业内部H5微应用开发

    企业内部H5微应用开发 分为 服务端API和前端API的开发,主要涉及到进入应用免登流程和JSAPI鉴权. JSAPI鉴权开发步骤: 1.创建H5微应用 登入钉钉开放平台(https://open-d ...

  10. charles代理设置与数据劫持

    1.安装charles,点击帮助——ssl代理——在移动设备或远程浏览器上安装charles root证书,看到如下界面: 2.在手机保证和电脑连接同一个wifi的前提下,开启手机代理,输入服务器地址 ...