NOI2019 SX 模拟赛 no.5
Mas 的童年
题目描述:不知道传送门有没有用?
反正就是对于每个前缀序列求一个断点,使得断点左右两个区间的 分别的异或和 的和最大
分析
jzoj 原题?
但是我 TM 代码没存账号也过期了啊!
然后只能绞尽脑汁思考做法,然后在左边 bzt 大仙各种提示下终于打出了一个 n log n 的做法
考虑暴力肯定非常可做于是我们来个暴力完事
我们想想当前的前缀序列的异或和为 x 的情况下,我们考虑从高位到低位去使贡献最大化:
那么假设当前处理的位置是 i :
如果 x 的第 i 位为 0 ,并且能从前面找到某个断点使得左边右边两个区间的当前位都是 1 ,那这样肯定是最优的,我们给找寻的断点加上这个限制
另外,我们考虑是从高位处理到低位的,我们在考虑 y 位的贡献时前面位的贡献必须已经最大化了,那么我们要在前面高位的限制下寻找新的断点,找到就增加答案并增加限制,找不到就拉倒什么也别干
如果 x 的第 i 位为 1 ,那么怎么分都没关系,贡献都是 1 ,限制就比较小
然后我们江当前的前缀作为一个断点,江它的所有真子集都变为 1 表示存在这样的断点
但是这样的复杂度是 \(n m\) 的, m 就是 \(a_i\) 的数据范围(说白了就是 \(n^2\))
那么怎么优化呢?
我们考虑从断点更新方面无法优化了,那么考虑这个子集能不能预处理
预处理的方法就是对于每种状态我们记录一下它最早可以达到的时间点,然后寻找的时候直接看当前限制状态记录的时间点是否在当前时间的前面,如果是的话就说明存在满足条件的断点
这样做有什么优化到的地方么? 我们发现可以用高维前缀和传递信息,复杂度$ n log m $
于是高维前缀和就弄掉
//by Judge
#include<cstdio>
#include<cstring>
#include<iostream>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define lowbit(x) (x&-x)
#define ll long long
using namespace std;
const int M=2e6+3;
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline bool cmin(int& a,int b){return a>b?a=b,1:0;}
inline bool cmax(int& a,int b){return a<b?a=b,1:0;}
inline int read(){ int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr=' '){
if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,mx,a[M],pre[M],tmp;
int main(){ n=read(),memset(pre,0x3f,sizeof pre);
fp(i,1,n) a[i]=read()^a[i-1]; fd(i,n,1) pre[a[i]]=i,cmax(mx,a[i]);
fd(i,mx,1) fp(j,0,20) if((i>>j)&1) cmin(pre[i^(1<<j)],pre[i]);
fp(i,1,n){ tmp=0;
fd(j,20,0) if(((a[i]>>j)&1)^1)
if(pre[tmp|(1<<j)]<=i) tmp|=1<<j;
print((a[i]^tmp)+tmp);
} return sr[CCF]='\n',Ot(),0;
}
Z的家乡
题目描述:不知道传送门有没有用?
反正就是给你一棵树每次在树上加一个叶子,然后要你在每次加入的节点后 dfs
序的最大字典序...(讲不大清楚?)
然后就是一眼看出这玩意儿超级像 LCT 中的 access ,每次都把当前节点所在的链优先级提到最大了,但是不会做...
没搞懂,抄了篇比较短的代码感觉还不错...就当是锻炼手速了!
//by Judge
#include<bits/stdc++.h>
#define fp(i,a,b) for(register int i=(a),I=(b)+1;i<I;++i)
using namespace std;
const int mod=998244353;
const int M=1e5+3;
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int mul(int a,int b){return 1ll*a*b%mod;}
inline int inc(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int read(){ int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr='\n'){
if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,pw[M];
struct data{ int siz,ans;
data operator +(data y)const{
return (data){siz+y.siz,inc(ans,mul(y.ans,pw[siz]))};
}
};
struct seg{ int l,r; data x; };
namespace seg_T{ int x,tot,root[M],stk[M*20]; data y; seg t[M*20];
#define mid ((l+r)>>1)
#define lch t[rt].l
#define rch t[rt].r
inline int New(){return *stk?stk[(*stk)--]:++tot;}
inline void R(int& rt){t[rt].l=t[rt].r=0,t[rt].x=(data){0,0},stk[++*stk]=rt,rt=0;}
inline void add(int l,int r,int& rt){ if(!rt) rt=New(); if(l==r) return t[rt].x=y,void();
if(x<=mid) add(l,mid,lch); else add(mid+1,r,rch); t[rt].x=t[rch].x+t[lch].x;
}
inline void del(int l,int r,int& rt){ if(l==r) return R(rt);
if(x<=mid) del(l,mid,lch); else del(mid+1,r,rch);
t[rt].x=t[rch].x+t[lch].x; if(!t[rt].x.siz) R(rt);
}
inline void add(int rt,int _x,data _y){x=_x,y=_y,add(1,n,root[rt]);}
inline void del(int rt,int _x){x=_x,del(1,n,root[rt]);}
inline data get(int x){return t[root[x]].x;}
} using namespace seg_T;
struct LCT{ arr f,l,r,id; data t[M];
inline bool isroot(int x){return l[f[x]]^x&&r[f[x]]^x;}
inline void pushup(int x){ id[x]=r[x]?id[r[x]]:x,t[x]=t[r[x]]+get(x)+(data){1,x}+t[l[x]];}
inline void rotate(int x){ int y=f[x],z=f[y];
if(l[z]==y) l[z]=x; else if(r[z]==y) r[z]=x; f[x]=z,f[y]=x;
if(l[y]==x) f[l[y]=r[x]]=y,r[x]=y; else f[r[y]=l[x]]=y,l[x]=y;
pushup(y),pushup(x);
}
inline void splay(int x){
for(int y,z;!isroot(x);rotate(x))
if(y=f[x],z=f[y],!isroot(y))
rotate((l[z]==y)^(l[y]==x)?x:y);
}
inline void init(){fp(i,1,n) pushup(i);}
inline void link(int u,int v){ int p1,p2,x;
for(f[x=v]=u,p1=0;x;x=f[x]){ splay(x);
if(r[x]) add(x,id[r[x]],t[r[x]]);
if(r[x]=p1,p1&&p1^v) del(x,p2);
p1=x,p2=id[x],pushup(x);
} splay(v),print(t[v].ans);
}
}T;
int main(){ n=read(),pw[0]=1;
fp(i,1,n) pw[i]=mul(pw[i-1],257933);
T.init(); fp(i,2,n) T.link(read(),i);
return Ot(),0;
}
战棋游戏
题目描述:不知道传送门有没有用?
反正就是不可做
分析
NTT,不会,我只会打板子
代码?算了吧...(比赛比完都没几个 A 的)
NOI2019 SX 模拟赛 no.5的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- NOIP模拟赛-2018.11.5
NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...
- NOIP模拟赛-2018.10.22
模拟赛 今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试... 老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人 这套题风格挺奇怪的...为什 ...
- noip模拟赛 蒜头君救人
分析:之前的一道模拟赛题是dp+dfs,这道题是dp+bfs. 我们设f[stu][i][j]为当前状态为stu,走到(i,j)的答案,考虑怎么设计stu,每个人的状态有3种:要么在原地,要么被背着, ...
- NOIP模拟赛 17.10.10
初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
随机推荐
- windows批量修改文件后缀名
有时候需要批量修改一些文件的后缀名,下面介绍批量修改的方法. 1.在文件夹内新建一个.txt文本文档. 2.在文本文档内写:ren * *.mp3 (意思是把没有后缀名的全部改成.mp3的格式, ...
- windows环境配置计划任务让weblogic的servers开机启动【原】
准备脚本 注意如果weblogic在D盘,那么以下cmd中的所有C:都要替换成D: , 因为windows需要切盘符. 启动weblogic管理服务adminServer 的文件: startAdmi ...
- solrj管理索引库
solrj管理索引库 1.1. 什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务, ...
- 开源框架.netCore DncZeus学习(四)项目升级
今天发现开源代码从1.0.0.1升级到了1.0.1.0,主要去掉了id主键,升级办法打开DncZeus,右键Git Bash Here,输入以下命令 合并失败,因为上一节尝试修改了几个代码,解决办法 ...
- ubuntu没有/usr/include/sys目录
实际上不是没有sys目录,只是系统给换路径了 32位系统:/usr/incude/i386-linux-gnu/sys 64位系统:/usr/include/x86_64-linux-gnu/sys/ ...
- (一)python的前世今生
一:Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum)(目前还活着),诞生于1989年,是一个脚本解释程序,由于python语言结构优美,清晰简单,随着人工智能 ...
- 【解题报告】SRM-08
A Description 给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T. 这里的出现定义为存在一串下标 ,满足 且 . Input 一行,一个 01 串 Output 一行, ...
- mongodb 添加字段并设置默认值
db.doc名称.update({}, {$set: {新字段名称: 默认值}}, false, true) 如:db.fly_bill.update({}, {$set: {usableStatus ...
- 牛客 被3整除的子序列dp
题意很清楚,直接dp即可,dp[i][j]表示到第i个字符的状态为j的方案数,这里状态指的是子序列最大下标到第i直接dp即可,dp[i][j]表示到第i个字符的状态为j的方案数,这里状态指的是子序列最 ...
- 前端 - jsonp 跨域ajax
jsonp 跨域ajax原理: 浏览器同源策略限制 如何解决同源策略限制: 方式一: 利用创建script块,在其中执行src属性为 远程url 异域 用函数(返回值) 的形式返回参数 方式二: jq ...