2019 ICPC Universidad Nacional de Colombia Programming Contest C D J
C. Common Subsequence
题意:给出长度为n两个串,求两个串的最长公共子序列len,如果len>=0.99*n,两个串就是亲兄弟否则不是。
解法:朴素的求LCS的时间复杂度是O(nm),这题肯定超时。正解不容易想,要注意到0.99这个特点,我们从这个特点下手也就是说最多只能抛弃0.01*n=1000个字符,
那么我们设dp[i][j]为A串前i+dp[i][j]个字符抛弃掉i个字符,B串前j+dp[i][j]个字符抛弃掉j个字符获得的LCS长度为dp[i][j]。
那么对于此时枚举到的dp[i][j],i+dp[i][j]就是A串已经完成匹配的字符,j+dp[i][j]就是B串完成匹配的字符,换句话说就是AB串接下来开始的位置已经确定了,接下来我们继续从下一个字符开始匹配。
dp[i][j]匹配完之后,A[i+dp[i][j]+1]和B[j+dp[i][j]+1]不相等,那么只能有两种选择抛弃A[i+dp[i][j]+1]或者抛弃B[j+dp[i][j]+1]。所以用dp[i][j]去更新这两个值。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
char A[N],B[N];
int n,m,ans,dp[][]; int main()
{
scanf("%s%s",A+,B+);
n=strlen(A+);
m=min(,n);
for (int i=;i<=m;i++)
for (int j=;j<=m;j++) {
while (A[i+dp[i][j]+]==B[j+dp[i][j]+] && i+dp[i][j]+<=n && j+dp[i][j]+<=n) dp[i][j]++;
dp[i+][j]=max(dp[i+][j],dp[i][j]);
dp[i][j+]=max(dp[i][j+],dp[i][j]);
ans=max(ans,dp[i][j]);
}
if (*ans>=*n) puts("Long lost brothers D:"); else puts("Not brothers :(");
return ;
}
J. Jail Destruction
题意:给出初始序列a,有区间和查询和区间减操作,但是特别点在于当一个数减到小于等于0就会变成0而不会再减。对于每个区间和查询输出答案。
解法:这题一看肯定是线段树,也非常容易想到维护区间Min来优化减少向下递归操作,但是这样还不够还是会获得TLE。这里要用到一个小技巧是每当一个数减到小于等于0,我们就令这个数变成INF,这样的目的是让它不能对区间Min造成影响从而使得Min优化正常工作,不会因为某些数变成0使得Min变成0之后优化就失效了。但是这个操作也会带来一些问题,就是会使得lazy_tag标记失效,因为以前的lay_tag标记是根据区间长度来计算修改贡献的,这里因为某些事变成0没得减但是这个信息并没有反映在区间长度上。解决办法也很简单,新增一个act数字表示区间长度就行了,每当一个数字减到0变成INF时候,act就减1。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
typedef long long LL;
const LL INF=1LL<<;
int n,m,h[N];
LL Min[N<<],act[N<<],tag[N<<],sum[N<<]; void pushup(int rt) {
Min[rt]=min(Min[rt<<],Min[rt<<|]);
act[rt]=act[rt<<]+act[rt<<|];
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void pushdown(int rt) {
if (tag[rt]==) return;
tag[rt<<]+=tag[rt]; Min[rt<<]+=tag[rt]; sum[rt<<]+=tag[rt]*act[rt<<];
tag[rt<<|]+=tag[rt]; Min[rt<<|]+=tag[rt]; sum[rt<<|]+=tag[rt]*act[rt<<|];
tag[rt]=;
} void build(int rt,int l,int r) {
tag[rt]=;
if (l==r) {
Min[rt]=h[l]; act[rt]=; sum[rt]=h[l];
return;
}
int mid=l+r>>;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
pushup(rt);
} void update(int rt,int l,int r,int ql,int qr,int v) {
if (ql<=l && r<=qr && Min[rt]+v>=) {
Min[rt]+=v; tag[rt]+=v; sum[rt]+=act[rt]*v;
return;
}
if (l==r && Min[rt]+v<=) {
Min[rt]=INF; sum[rt]=; act[rt]=;
return;
}
int mid=l+r>>;
pushdown(rt);
if (ql<=mid) update(rt<<,l,mid,ql,qr,v);
if (qr>mid) update(rt<<|,mid+,r,ql,qr,v);
pushup(rt);
} LL query(int rt,int l,int r,int ql,int qr) {
if (ql<=l && r<=qr) return sum[rt];
int mid=l+r>>;
pushdown(rt);
LL ret=;
if (ql<=mid) ret+=query(rt<<,l,mid,ql,qr);
if (qr>mid) ret+=query(rt<<|,mid+,r,ql,qr);
return ret;
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&h[i]);
build(,,n);
for (int i=;i<=m;i++) {
int opt,x,y,z; scanf("%d",&opt);
if (opt==) {
scanf("%d%d",&x,&y);
if (y>=x) printf("%lld\n",query(,,n,x,y));
else printf("%lld\n",query(,,n,x,n)+query(,,n,,y));
} else {
scanf("%d%d%d",&x,&y,&z);
if (y>=x) update(,,n,x,y,-z);
else update(,,n,x,n,-z),update(,,n,,y,-z);
}
}
return ;
}
2019 ICPC Universidad Nacional de Colombia Programming Contest C D J的更多相关文章
- 2020 ICPC Universidad Nacional de Colombia Programming Contest
2020 ICPC Universidad Nacional de Colombia Programming Contest A. Approach 三分 显然答案可以三分,注意\(eps\)还有两条 ...
- 2017 ACM-ICPC, Universidad Nacional de Colombia Programming Contest K - Random Numbers (dfs序 线段树+数论)
Tamref love random numbers, but he hates recurrent relations, Tamref thinks that mainstream random g ...
- The Ninth Hunan Collegiate Programming Contest (2013) Problem J
Problem J Joking with Fermat's Last Theorem Fermat's Last Theorem: no three positive integers a, b, ...
- ICPC训练周赛 Benelux Algorithm Programming Contest 2019
D. Wildest Dreams 这道题的意思是Ayna和Arup两人会同时在车上一段时间,在Ayna在的时候,必须单曲循环Ayna喜欢的歌,偶数段Ayna下车,若此时已经放了她喜欢的那首歌,就要将 ...
- The 2019 Asia Nanchang First Round Online Programming Contest
传送门 A. Enju With math problem 题意: 给出\(a_1,\cdots,a_{100}\),满足\(a_i\leq 1.5*10^8\). 现在问是否存在一个\(pos\), ...
- The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)
题:https://nanti.jisuanke.com/t/41350 分析:先将字符串转置过来 状态转移,因为只有5个状态,所以 i 状态到 j 状态的最小代价就枚举[i][k]->[k][ ...
- The 2019 Asia Nanchang First Round Online Programming Contest E. Magic Master
题目链接:https://nanti.jisuanke.com/t/41352 题目意思还是好理解的,看过的人不多,感觉是被通过量吓到了.其实就是个水题,反向模拟就好了, 用队列模拟,反向模拟,它要放 ...
- The 2019 Asia Nanchang First Round Online Programming Contest B. Fire-Fighting Hero
题目链接:https://nanti.jisuanke.com/t/41349 题意:有一个灭火英雄,和一个灭火团队,一个人与一个团队比较. 灭火英雄到其他灭火点的最短路最大值,与一个团队到其他灭火点 ...
- The 2019 Asia Nanchang First Round Online Programming Contest The Nth Item
The Nth Item 思路: 先用特征根法求出通向公式,然后通向公式中出现了\(\sqrt{17}\),这个可以用二次剩余求出来,然后可以O(\(log(n)\))求出. 但是还不够,我们先对\( ...
随机推荐
- Sass函数:值列表函数length
length() 函数主要用来返回一个列表中有几个值,简单点说就是返回列表清单中有多少个值: >> length(10px) 1 >> length(10px 20px (bo ...
- 请求体中需要的true和requests包put请求冲突了
python put请求,添加请求头 不知道怎么解决
- 使用axios上传文件到阿里云对象文件存储服务器oss
背景 OSS可用于图片.音视频.日志等海量文件的存储.各种终端设备.Web网站程序.移动应用可以直接向OSS写入或读取数据.OSS支持流式写入和文件写入两种方式.使用阿里云oss做文件存储的时候,不可 ...
- 在vscode中快速生成vue模板
点击文件-->首选项-->用户代码片段-->输入vue,此时会打开vue.json文件,将下列代码复制进文件保存即可,新建一个vue文件,输入vue回车即可生成模板,$0表示生成模板 ...
- 03.父工程pom、整合测试、SpringBootApplication注解
父工程 idea点击spring-boot-starter-parent找到父工程spring-boot-dependencies模仿配置 父工程 <?xml version="1.0 ...
- gensim word2vec |来自渣渣硕的学习笔记
最近写论文跑模型,要用到word2vec,但是发现自己怎么也看不懂网上的帖子,还是自己笨吧,所以就有了我的第一篇博客!!! 关于word2vec工具打算写一个系列的,当然今天这篇文章只打算写: 如何 ...
- linux根据进程名获取PID
经常需要Kill多个进程,这些进程包含共同的关键字,可以用一条命令Kill掉它们. ps aux | grep "common" |grep -v grep| cut -c 9-1 ...
- tab切换中的滚动条下拉分页带来的问题
相信做过tab切换中滚动条下拉分页的童鞋都知道,我们在用scroll方法来做滚动条下拉分页的时候,都是有bug,切换中间的内容会互相影响,为了解决这个问题,我总结了2种方法: 1.方法一: <! ...
- linux 正则表达式与实践
正则表达式基础 准备 (1)alias grep='grep --color=auto' 易于显示 (2)LC_ALL=C,字符集,设置环境变量,字符顺序 基础正则 1)^word 匹配以Word开 ...
- 3 August
P1013 进制位 结论:加法必为 \(n-1\) 进制:\({(n-1)}^1\) 位必为数字 1:\(0+0=0\). 模拟.字符串. #include <cstdio> #inclu ...