「ROI 2017 Day 2」存储器

无聊的题。

首先 \(s\) 中每一个片段,其在 \(t\) 中对应的字符必然是相同的。

对于 \(t\) 中的每一个片段,考虑检查能否操作出这个片段,实际上只需要模拟这个过程,每次选择能操作的一段操作并合并段就行。

用 set 加速即可,做到 \(O(n\log n)\)。

Code
const int N=1e6+5;
char a[N],b[N];
bool chk1(int l,int r) {
char tmp=b[l];
FOR(i,l+1,r) if(tmp!=b[i]) return 0;
return 1;
}
int fa[N],siz[N],R[N],L[N];
int find(int x) {return fa[x]=(fa[x]==x?x:find(fa[x]));}
void merge(int x,int y) {
int fx=find(x),fy=find(y);
if(fx==fy) return;
if(siz[fx]<siz[fy]) swap(fx,fy);
siz[fx]+=siz[fy],fa[fy]=fx;
}
bool chk2(int l,int r) {
if(a[l]==b[l-1]) return 0;
set<int> qu;
FOR(i,l,r) L[i]=R[i]=0,fa[i]=i,siz[i]=1;
FOR(i,l+1,r) if(a[i]==a[i-1]) merge(i,i-1);
int las=l;
FOR(i,l+1,r+1) if(a[i]!=a[i-1]) R[las]=i-1,L[i-1]=las,las=i;
if(R[l]==r&&a[l]!=b[l]) return 0;
for(int i=l;i<=r;i=R[i]+1)
if(a[i]!=b[l]) {
if(i!=l&&siz[find(i)]<siz[find(i-1)]) qu.insert(i);
if(R[i]!=r&&siz[find(i)]<siz[find(R[i]+1)]) qu.insert(i);
}
while(sz(qu)) {
int x=*qu.begin();qu.erase(x);
if(x!=l) merge(x,x-1);
if(R[x]!=r) merge(x,R[x]+1);
if(x==l) L[R[R[x]+1]]=x,R[x]=R[R[x]+1];
if(R[x]==r) R[L[x-1]]=R[x],L[R[x]]=L[L[x-1]];
if(x!=l&&R[x]!=r) L[R[R[x]+1]]=L[x-1],R[L[x-1]]=R[R[x]+1];
x=(x==l?x:L[x-1]);
if(x!=l&&siz[find(x)]>siz[find(x-1)]) qu.insert(L[x-1]);
if(R[x]!=r&&siz[find(x)]>siz[find(R[x]+1)]) qu.insert(R[x]+1);
}
if(siz[find(l)]!=r-l+1) return 0;
return 1;
}
void solve() {
scanf("%s %s",a+1,b+1);
int n=strlen(a+1),m=strlen(b+1);
if(n!=m) return puts("No"),void();
int l=1;
FOR(i,2,n+1) if(a[i]!=a[i-1]) {
if(!chk1(l,i-1)) return puts("No"),void();
l=i;
}
l=1;
FOR(i,2,n+1) if(b[i]!=b[i-1]) {
if(!chk2(l,i-1)) return puts("No"),void();
l=i;
}
puts("Yes");
}
int main() {
int T=read();
while(T--) solve();
}

「ROI 2017 Day 2」水星上的服务器

简单题。

可以根据左右求出当前如果想要向左一直到底和向右一直到底的时间区间。

注意到要等的情况只有 \(l_i\) 可行的情况,特判一下就行。

Code
const int N=2e5+5;
int n,t[N],l[N],r[N],l0[N],r0[N],l1[N],r1[N];
int main() {
n=read();
FOR(i,1,n) t[i]=read(),l0[i]=l1[i]=1;
FOR(i,1,n-1) l[i]=read(),r[i]=read();
l0[1]=0,r0[1]=1e9+1;
l1[n]=0,r1[n]=1e9+1;
FOR(i,2,n) {
int L=max(l0[i-1],l[i-1]),R=min(r0[i-1],r[i-1]);
if(L<=l[i-1]&&l[i-1]<=R) l0[i]=L-t[i],r0[i]=R;
else l0[i]=L,r0[i]=R;
l0[i]=max(l0[i],0);
}
ROF(i,n-1,1) {
int L=max(l1[i+1],l[i]),R=min(r1[i+1],r[i]);
if(L<=l[i]&&l[i]<=R) l1[i]=L-t[i],r1[i]=R;
else l1[i]=L,r1[i]=R;
l1[i]=max(l1[i],0);
}
FOR(i,1,n) {
int l=max(l0[i],l1[i]),r=min(r0[i],r1[i]);
if(l>r) puts("-1");
else printf("%d\n",l);
}
}

「ROI 2017 Day 2」反物质

记 \(f_i\) 表示还有 \(i\) 个位置,这 \(i\) 个位置可以产生的价值,有 DP 式子:

\[\begin{aligned}
\max_j\min_k(f_k+(i-k)\times 10^9+c_j\to f_i) \ \ \ r_j\le i,k\in [i-r_j,i-l_j]
\end{aligned}
\]

注意到这是一个求 \(f_k-k\times 10^9\) 在某个区间内的最小值的过程,这个区间显然是单调的,故可以使用滑动窗口优化。

Code
const int N=105,V=2e6+5,Z=1e9;
int n,a,l[N],r[N],c[N];
ll f[V],ans;
deque<int> q[N];
int main() {
n=read(),a=read();
FOR(i,1,n) l[i]=read(),r[i]=read(),c[i]=read();
FOR(i,0,a) {
FOR(j,1,n) if(i-r[j]>=0) {
while(sz(q[j])&&q[j].front()<i-r[j]) q[j].pop_front();
int z=q[j].front();
chkmax(f[i],f[z]+1ll*(i-z)*Z-c[j]);
}
FOR(j,1,n) if(i-l[j]+1>=0) {
while(sz(q[j])&&f[i-l[j]+1]-1ll*(i-l[j]+1)*Z<f[q[j].back()]-1ll*q[j].back()*Z) q[j].pop_back();
q[j].push_back(i-l[j]+1);
}
chkmax(ans,f[i]);
}
printf("%lld\n",ans);
}

「ROI 2017 Day 2」学习轨迹

考虑到有方案为某一个大学全选,故若两个大学均选,设第一个大学选 \([l,r]\),则第二个大学必然从 \(\frac{\sum}{2}\) 的位置向左右扩展。

枚举 \(r\),向左向右求单调栈,就可以维护了。

Code
const int N=5e5+5;
int n,m,a[N],b[N],c[N*2];
ll sa[N],sb[N];
ll ans;
int la,ra,lb,rb;
void updans(ll a,int b,int c,int d,int e,int fl) {
if(fl) swap(b,d),swap(c,e);
if(ans<a) ans=a,la=b,ra=c,lb=d,rb=e;
}
ll ma[N*4],add[N*4];
void pushadd(int p,ll v) {ma[p]+=v,add[p]+=v;}
void pushdown(int p) {
if(add[p]) pushadd(p*2,add[p]),pushadd(p*2+1,add[p]),add[p]=0;
}
void build(int p,int l,int r) {
add[p]=0;
if(l==r) return ma[p]=sa[n]-sb[l-1],void();
int mid=(l+r)>>1;
build(p*2,l,mid),build(p*2+1,mid+1,r);
ma[p]=max(ma[p*2],ma[p*2+1]);
}
void update(int p,int l,int r,int x,int y,ll v) {
if(x<=l&&r<=y) return pushadd(p,v);
int mid=(l+r)>>1;pushdown(p);
if(x<=mid) update(p*2,l,mid,x,y,v);
if(y>mid) update(p*2+1,mid+1,r,x,y,v);
ma[p]=max(ma[p*2],ma[p*2+1]);
}
int query(int p,int l,int r) {
if(l==r) return l;
int mid=(l+r)>>1;pushdown(p);
if(ma[p]==ma[p*2]) return query(p*2,l,mid);
return query(p*2+1,mid+1,r);
}
int stl[N],str[N],tpl,tpr;
void solve(bool fl=0) {
int mid=lower_bound(sa+1,sa+n+1,(sa[n]+1)/2)-sa;
build(1,1,m),tpl=tpr=0;
FOR(i,1,m) {
if(b[i]) {
if(b[i]<=mid) {
while(tpl&&b[i]>b[stl[tpl]]) update(1,1,m,stl[tpl-1]+1,stl[tpl],sa[b[stl[tpl]]]),--tpl;
update(1,1,m,stl[tpl]+1,i,-sa[b[i]]),stl[++tpl]=i;
}
else {
while(tpr&&b[i]<b[str[tpr]]) update(1,1,m,str[tpr-1]+1,str[tpr],sa[n]-sa[b[str[tpr]]-1]),--tpr;
update(1,1,m,str[tpr]+1,i,-sa[n]+sa[b[i]-1]),str[++tpr]=i;
}
}
int id=query(1,1,m);
int p1=lower_bound(stl+1,stl+tpl+1,id)-stl,p2=lower_bound(str+1,str+tpr+1,id)-str;
p1=(p1<=tpl?b[stl[p1]]+1:1),p2=(p2<=tpr?b[str[p2]]-1:n);
updans(sb[i]+ma[1],p1,p2,id,i,fl);
}
}
int main() {
n=read(),m=read();
FOR(i,1,n) a[i]=read();
FOR(i,1,n) sa[i]=sa[i-1]+read();
FOR(i,1,m) c[read()]=i;
FOR(i,1,m) sb[i]=sb[i-1]+read();
FOR(i,1,n) a[i]=c[a[i]],b[a[i]]=i;
updans(sa[n],1,n,0,0,0),updans(sb[m],0,0,1,m,0);
solve(),swap(n,m),swap(a,b),swap(sa,sb),solve(1);
printf("%lld\n%d %d\n%d %d\n",ans,la,ra,lb,rb);
}

2022.11.13 NOIP2022 模拟赛八的更多相关文章

  1. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

  2. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  3. EZ 2018 04 13 NOIP2018 模拟赛(八)

    这次的题目都是什么鬼? 玄学乱搞+肉眼看CODE+倒着搜索? 好吧是我ZZ了 链接在此 T1 玄学乱搞 由于考场上写的部分分做法忘记讨论n<=2000时的情况,少得了30pts 很容易得到一个基 ...

  4. 2019/11/12 CSP模拟赛&&考前小总结

    写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...

  5. 11.13 noip模拟试题

    题目名称 笔记 括号 城堡可执行文件名 note brackets castle输入文件名 note.in brackets.in castle.in输出文件名 note.in brackets.ou ...

  6. EZ 2018 05 13 NOIP2018 模拟赛(十三)

    这次的比赛真心水,考时估分240,然后各种悠闲乱逛 然后测完T1数组开小了炸成40,T2,T3都没开long long,T2炸成20,T3爆0 掉回1600+的深渊,但是还有CJJ dalao比我更惨 ...

  7. 2019.03.13 ZJOI2019模拟赛 解题报告

    得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...

  8. 2018.11.7 PION 模拟赛

    期望:100 + 80 + 75 = 255 实际:0 + 80 + 60 = 140 唉~一天比一天犯的错误智障,感觉noip要凉啊... 吓得我赶紧吃几颗药补补脑子. 奶一下大佬: lgj AK ...

  9. 2018.11.6 PION 模拟赛

    期望:100 + 40 + 50 = 190 实际:60 + 10 + 50 = 120 考得好炸啊!!T1数组开小了炸掉40,T2用 int 读入 long long ,int存储 long lon ...

  10. 2018.11.5 PION模拟赛

    期望:30 + 40 + 50 = 120 实际:30 + 50 + 40 = 120 ‘’ 思路:最重要的是发现 是完全没有用的,然后这个题目就可以转成DP来做. /* 期望的分:30 */ #in ...

随机推荐

  1. react+Native使用typeScript

    1.为什么使用typeScript? typeScript是JavaScript的超集 typeScript在编译期间就可以将错误抛出 增强代码的可阅读性和可维护性 2.案例的功能逻辑 切换职业 选择 ...

  2. Python语言课程实验报告

    Python语言基础实验 一.实验目的和要求 1.了解Python的基本数据类型: 2.学习了解变量的定义与使用: 3.学会使用Python运算符: 4.掌握数据类型的实际应用. 二.实验环境 软件版 ...

  3. 七、25.创建user子分支并把代码推送到码云仓库中

    打开终端点击+新建一个终端 注意 :如下操作都是在2:powershell下进行 先来检查一下当前所处分支 git branch 我们应该把这些代码都写到user分支上 接下来应该把这些代码统一迁移到 ...

  4. poi 5.2 导出

    如果能给你带来帮助,不胜荣幸,如果有错误也请批评指正. 1:maven 依赖,现在好多都是用的poi 3.6 和 poi3.9 的jar,项目升级了,现在得用5.x的了,所以就用5.x的给大家简单的演 ...

  5. (性能测试笔记)逻辑IO和物理IO的区别

    IO性能对于一个系统的影响是至关重要的. 一个系统经过多项优化以后,瓶颈往往落在数据库:而数据库经过多种优化以后,瓶颈最终会落到IO.而IO性能的发展,明显落后于CPU的发展.Memchached也好 ...

  6. Qt中父子页面切换隐藏实现方法 (利用信号槽机制实现)

    首先既然你打开了这篇文章,那你一定想到过,将子界面作为父界面的一个属性来实现,但是这样父界面通知子界面会很轻松,但子界面通知父界面怎么搞呢?很显然不能再子界面再实例化父界面(因为这样做会循环引用),那 ...

  7. 【c#】csharp_learn

    csharp learn JSON C#解析JSON字符串总结 https://www.cnblogs.com/nc923/p/11418583.html c#解析json字符串处理(最清晰易懂的方法 ...

  8. JAVA JAR包注册成服务,开机启动,WINSW使用

    1,下载工具 WINSW. https://www.aliyundrive.com/s/fACj3xk8R74 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画 ...

  9. B - Yet Another Palindrome Problem

    B - Yet Another Palindrome Problem 思路: 给一个长为n(≤5000≤5000)的数组,问是否存在一个长度至少为3的子序列是回文的.回文的定义是把序列reverse, ...

  10. vue3 门户网站搭建2-ngnix

    路由配好了,需要调试下 build 后是否可用,这时我们需要一个服务端来运行静态网页. 官网直接下载一个 windows 版本的 ngnix 即可: http://nginx.org/en/downl ...