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

  1. 2020 ICPC Universidad Nacional de Colombia Programming Contest

    2020 ICPC Universidad Nacional de Colombia Programming Contest A. Approach 三分 显然答案可以三分,注意\(eps\)还有两条 ...

  2. 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 ...

  3. 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, ...

  4. ICPC训练周赛 Benelux Algorithm Programming Contest 2019

    D. Wildest Dreams 这道题的意思是Ayna和Arup两人会同时在车上一段时间,在Ayna在的时候,必须单曲循环Ayna喜欢的歌,偶数段Ayna下车,若此时已经放了她喜欢的那首歌,就要将 ...

  5. 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\), ...

  6. The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)

    题:https://nanti.jisuanke.com/t/41350 分析:先将字符串转置过来 状态转移,因为只有5个状态,所以 i 状态到 j 状态的最小代价就枚举[i][k]->[k][ ...

  7. The 2019 Asia Nanchang First Round Online Programming Contest E. Magic Master

    题目链接:https://nanti.jisuanke.com/t/41352 题目意思还是好理解的,看过的人不多,感觉是被通过量吓到了.其实就是个水题,反向模拟就好了, 用队列模拟,反向模拟,它要放 ...

  8. The 2019 Asia Nanchang First Round Online Programming Contest B. Fire-Fighting Hero

    题目链接:https://nanti.jisuanke.com/t/41349 题意:有一个灭火英雄,和一个灭火团队,一个人与一个团队比较. 灭火英雄到其他灭火点的最短路最大值,与一个团队到其他灭火点 ...

  9. The 2019 Asia Nanchang First Round Online Programming Contest The Nth Item

    The Nth Item 思路: 先用特征根法求出通向公式,然后通向公式中出现了\(\sqrt{17}\),这个可以用二次剩余求出来,然后可以O(\(log(n)\))求出. 但是还不够,我们先对\( ...

随机推荐

  1. $NOI2014$ 购票(斜率优化 点分治)

    \(NOI2014\)购票 哇终于可以碰电脑了赶快切些火题找找感觉. 拿到这道题的时候发现简单的斜率优化推一推可以秒掉平方做法,然后一条链也可以做. 然后呢... 卧槽这个在一棵树上怎么办啊. 大力\ ...

  2. 2.WCF学习--地址

    一.URI(统一资源标识) web服务可视为一种网络资源,并且可以通过一个URI来进行唯一标识.而服务通过终结点的形式发布出来,我们所说的一个服务在大部分场景中实际上指的是服务的某个终结点.终结点的核 ...

  3. Vue通信的10种方式

    1.10种通信方式 10种:https://juejin.im/post/5bd18c72e51d455e3f6e4334 2.除此之外,还有children和ref. 需要注意 $children  ...

  4. u-tools图床便捷生成markdown图片

    u-tools 图床 上传图片生成markdown图片非常便捷. 支持的图片服务器有几种,其中搜狗.网易和掘金的加载速度更快些: 也可以用阿里与和腾讯云的OSS; 其中网易生成图片不是原图尺寸好像被改 ...

  5. Webpack 4 和单页应用入门

    引言 本文转自https://github.com/wallstreetcn/webpack-and-spa-guide,为了方便阅读转到博客园. webpack 更新到了 4.0,官网还没有更新文档 ...

  6. jmeter+ant+jenkins搭建接口自动化测试环境

    jmeter+ant+jenkins搭建接口自动化测试环境(基于win) 1.jmeter jmeter依赖java运行环境,所以需要提前下载jdk并配置好环境变量 官网下载(http://jmete ...

  7. list的过滤操作

    假设 l = ['abc', 'mn', 'aq', 'liuming'] 我要过滤出以a开头的元素,方法有以下两种 方法1: l = ['abc', 'mn', 'aq', 'liuming'] l ...

  8. Python 中内建属性 __getattribute__

    参考自:https://blog.csdn.net/yitiaodashu/article/details/78974596 __getattribute__是属性访问拦截器,就是当这个类的属性被访问 ...

  9. spring-boot整合Dubbo分布式架构案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 3.2.5 2.项目文件目录 3.Maven Plugin管理 总项目 pom.xml配置代码: &l ...

  10. php chr()函数 语法

    php chr()函数 语法 作用:从指定的 ASCII 值返回字符.直线电机选型 语法:chr(ascii) 参数: 参数 描述 ascii  必须,指定ASCII值 说明:chr() 函数从指定的 ...