EZ 2018 03 30 NOIP2018 模拟赛(六)
链接:http://211.140.156.254:2333/contest/67
转眼间上次加回来的Rating又掉完了。
这次不知为何特别水,T1想了一段时间没想出来弃了,导致后面心态炸了。
T2也没有注意到有随机数据,少得了10分。
T3也没想过,直接输了些样例再手算了一组数据就没管了。
然而考完发现T1一直卡在一个坑里跳不出来,但很多人都A了T1而我只有30分。
所以一夜回到解放前。
T1 实际上是一道分治大水题。
我们先令a[i]=i;然后这当然是不满足要求的。
所以我们每次取出队列中的一半数字(下标为奇数),再取出另一半数字(下标为偶数)分别组成新的队列。
然后单独分治即可,这里给一个图理解一下:

所以对于n=6时,序列就是153264
由于是分而治之,因此复杂度为O(n log n)
T2 01串hash+线段树。
考虑O(n^2)的暴力,每次找出两个数i,j,然后把它们作为等差数列的前两项,然后查找第三项的位置是否合法。
然后只要加上一大堆类似clock之类的玄学操作竟然可以A了
然后考虑正解。对于读入的数x,如果x-k和x+k在之前都出现过(或都没出现过),那么是合法的。反之,若其中只有一个数出现过,那么必然会出现x-k,x,x+k或x+k,x,x-k这样的情况,就不是反等差数列。
因此我们再细化一点,用01串表示在x之前所有数的出现情况(出现就为1)
然后对它的性质进行分析可以发现当且仅当这个串在边界范围内以x为中心左右对称才合法。
例如(令当前的数为x):
当串为:1101x1011或1101x101110是都是合法的(后者前面4个数就到边界了,众所周知数的范围在1至n,没有负数之类的东西)
当串为:1011x1011或11011x11010时都是不合法的
然后对于所有的01串进行hash再判重即可。
但是单纯的hash会T,所以用线段树来维护hash
具体实现看代码,这里线段树要有3个信息:
len:子树大小,主要是为了hash
lh:从左向右的hash顺序时当前节点的值
rh:从右向左的hash顺序时当前节点的值
对于hash可以开unsighed long long自然溢出,这样比较方便。同时记得把次数预处理出来。
CODE
#include<cstdio>
using namespace std;
typedef unsigned long long uni;
const int N=;
struct segtree
{
int len;
uni lh,rh;
}tree[N<<];
int n,x,last;
uni h1,h2,seed[N];
inline char tc(void)
{
static char fl[],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,,,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=; char ch=tc();
while (ch<''||ch>'') ch=tc();
while (ch>=''&&ch<='') x=x*+ch-'',ch=tc();
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void build(int root,int l,int r)
{
if (l==r)
{
tree[root].len=;
return;
}
int mid=l+r>>;
build(root<<,l,mid);
build(root<<|,mid+,r);
tree[root].len=tree[root<<].len+tree[root<<|].len;
}
inline void updata(int root)
{
tree[root].lh=tree[root<<].lh*seed[tree[root<<|].len]+tree[root<<|].lh;
tree[root].rh=tree[root<<|].rh*seed[tree[root<<].len]+tree[root<<].rh;
}
inline void modify(int root,int l,int r,int id)
{
if (l==r)
{
tree[root].lh=tree[root].rh=;
return;
}
int mid=l+r>>;
if (id<=mid) modify(root<<,l,mid,id);
if (id>mid) modify(root<<|,mid+,r,id);
updata(root);
}
inline void l_query(int root,int l,int r,int beg,int end)
{
if (beg<=l&&end>=r)
{
h1+=tree[root].lh*seed[last];
last+=tree[root].len;
return;
}
int mid=l+r>>;
if (end>mid) l_query(root<<|,mid+,r,beg,end);
if (beg<=mid) l_query(root<<,l,mid,beg,end);
}
inline void r_query(int root,int l,int r,int beg,int end)
{
if (beg<=l&&end>=r)
{
h2+=tree[root].rh*seed[last];
last+=tree[root].len;
return;
}
int mid=l+r>>;
if (beg<=mid) r_query(root<<,l,mid,beg,end);
if (end>mid) r_query(root<<|,mid+,r,beg,end);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i;
read(n);
build(,,n);
for (seed[]=,i=;i<=n;++i)
seed[i]=seed[i-]*;
for (i=;i<=n;++i)
{
read(x);
modify(,,n,x);
int len=min(x-,n-x);
if (!len) continue;
last=; h1=; l_query(,,n,x-len,x-);
last=; h2=; r_query(,,n,x+,x+len);
if (h1!=h2) { puts("NO"); return ; }
}
puts("YES");
return ;
}
T3 搜索+打表。
然而当我看到这道题时觉得很不可做,输了样例等弄了7分。
实际上要发现一个性质:当一个串的左右括号的数量相等时必然是一个合法的括号序列的循环移位。
所以爆搜一些小的点,然后用组合数学推一下其中一个等于2时的情况就可以拿不少分。
这里对于标算的判重和思路不是很懂,所以还是只会30分左右的搜索。
CODE
#include<cstdio>
using namespace std;
const int N=,mod=;
int h[N][],l[N][],a,b,ans;
inline void check(void)
{
for (register int i=;i<=a;++i)
if (h[i][]!=h[i][]) return;
for (register int j=;j<=b;++j)
if (l[j][]!=l[j][]) return;
if (++ans>=mod) ans-=mod;
}
inline void DFS(int x,int y)
{
if (x>a) { check(); return; }
if (h[x][]>b/||h[x][]>b/) return;
if (l[y][]>a/||l[y][]>a/) return;
int xx=x,yy=y;
if (++yy>b) ++xx,yy=;
++h[x][]; ++l[y][]; DFS(xx,yy); --h[x][]; --l[y][]; ++h[x][]; ++l[y][]; DFS(xx,yy); --h[x][]; --l[y][];
}
int main()
{
scanf("%d%d",&a,&b);
DFS(,);
printf("%d",ans);
return ;
}
EZ 2018 03 30 NOIP2018 模拟赛(六)的更多相关文章
- EZ 2018 03 23 NOIP2018 模拟赛(五)
链接:http://211.140.156.254:2333/contest/65 这次Rating重回Rank18,我是20的守门员(滑稽) 这次题目和数据普遍偏水,我T2打错了一个变量名竟然过了所 ...
- EZ 2018 03 16 NOIP2018 模拟赛(四)
链接:http://211.140.156.254:2333/contest/64 我去掉了一百多分! 这次的题目怎么说呢,特别水,但是就是出现了一些很逗的错误导致炸裂. 最好笑的是SB的不只我一个: ...
- EZ 2018 03 09 NOIP2018 模拟赛(三)
最近挺久没写比赛类的blog了 链接:http://211.140.156.254:2333/contest/59 这次的题目主要考验的是爆搜+打表的能力 其实如果你上来就把所有题目都看过一次就可以知 ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
- EZ 2018 05 26 NOIP2018 模拟赛(十六)
这次难道就是传说中的标准分大赛?而且这次比赛的链接不翼而飞了 一堆人153pts然后就有Rank4?看来这个Rank4不值钱了,才涨了50+的Rating. 不过还好最后5min的时候想出了T1正解, ...
- EZ 2018 06 24 NOIP2018 模拟赛(二十)
很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...
- EZ 2018 06 02 NOIP2018 模拟赛(十七)
这次的比赛是真心比较狗,我TM的写了30min的树剖ZZ地直接memset超时了 话说我既然想到差分就应该去写差分的啊! 好了不过这次Rank还挺高的,终于要打进前10了当然是假的了. 好了下面开始讲 ...
- EZ 2018 05 20 NOIP2018 模拟赛(十五)
这次的比赛充满着玄学的气息,玄学链接 首先讲一下为什么没有第十四场 其实今天早上9点时看到题目就叫了:原题! 没错,整套试卷都做过,我还写了题解 然后老叶就说换一套,但如果仅仅是这样就没什么 但等13 ...
随机推荐
- onlyoffice新版5.1.2版解决中文汉字输入重复等问题
一个星期前新版更新,从5.07到了5.1.2.9.所以我的网盘中的镜像也做了相应的更新. 原来说的几个缺点,已经修改了几个,比如chrome浏览器和opera浏览器中,输入汉字,然后输入符号的时候,会 ...
- JSTL、JSTL核心标签库——流程处理标签
JSTL环境 JSTL是另一个标准规范,并非在JSP的规范中,所以必须另外下载JSTL实现. 要使用JSTL标签库,必须在JSP网页上使用taglib指示元素定义前置名称与uri参考.例如,引入JST ...
- 有道云笔记 markdown 本地资源图片 粘贴到word居然粘贴不过去 资源名不能有汉子
刚开始使用有道云笔记,整理一个说明文档的时候,出现了问题 我将一个图片保存到桌面,文件名是中文汉字的图片.在云笔记里能正常显示,但是粘贴到word里面,也没有图片.我尝试了半天.最后居然发现只要把文件 ...
- 在Windows上安装Gradle
1.开发环境 (1)Java:JDK8(必须是JDK或JRE7以上,使用java -version查看当前电脑java版本) (2)操作系统:Windows 7 2.安装步骤 (1)下载最新的Grad ...
- LeetCode题解之Palindromic Substrings
1.问题描述 2.问题分析 对于每一个字符,以该字符为中心计算回文个数. 3.代码 int countSubstrings(string s) { ; ) ; ; i < s.size(); i ...
- 如何加密 Windows VM 上的虚拟磁盘
为了增强虚拟机 (VM) 的安全性以及符合性,可以加密 Azure 中的虚拟磁盘. 磁盘是使用 Azure 密钥保管库中受保护的加密密钥加密的. 可以控制这些加密密钥,以及审核对它们的使用. 本文详细 ...
- 【JAVA】什么是冒泡排序?——面试加分题
冒泡排序是一种计算机科学领域的较简单的排序算法,有心人将代码不断优化改良,本人特摘抄部分代码进行学习. 文章来自开源中国,转载自:程序员小灰.原文:漫画:什么是冒泡排序? 冒泡排序第一版 public ...
- VUE中v-on:click事件中获取当前dom元素
在开发中总是忘记, 特意在此记录 关键字: $event <div class="bed" v-on:click="updateBed(index,$e ...
- 远程桌面web连接
我们可以利用web浏览器搭配远程桌面技术来连接远程计算机,这个功能被称为远程桌面web连接(Remote desktop web connection),要享有此功能,请先在网络上一台window ...
- Ctrl+Alt+F1~F6
Ctrl+ALT+F1~F6 可以进入不同的字符终端和图形界面.体现了 linux 或者 unix 的多用户的特点. 6个不同的终端,相当于六个不同的用户. 保持更新,转载请著名出处.