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. Kotlin学习笔记(9)- 数据类

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...

  2. JavaScript的三大组成部分

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  3. shell 函数传递参数的几种方式

    1.最近总结了 shell 中 function 的传递变量的几种方式 1.传递单个变量 2.传递数组变量   #!/bin/bash   #trying to pass an variable.   ...

  4. mysql中文乱码解决办法

    Windows 在C:\Program Files\MySQL\MySQL Server 5.5\bin目录下 MySQLInstanceConfig.exe执行 重新配置character_set_ ...

  5. [Java复习] 微服务

    1. 怎么样定义一个微服务,或划分服务比较合理?业务导向的共性? 对应服务拆分,先设计高内聚低耦合的领域模型(DD),再实现相应的分布式系统是一种比较合理的方式. 微服务是手段,不是目的.目的是为了让 ...

  6. mybatis源码分析之06二级缓存

    上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的. 通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置 &l ...

  7. 使用Docker搭建Cloudera Hadoop 环境搭建

    单节点 单节点:https://hub.docker.com/r/cloudera/quickstart/ 相关命令 docker pull cloudera/quickstart:latest do ...

  8. 【HDOJ6578】Blank(DP)

    题意:一个长为n的序列,每个位置上的值是0,1,2,3中的一个,有m个限制条件,限制位置[l[i],r[i]]中不同的数值有x[i]个,问方案数MOD 998244353 n<=100,m< ...

  9. BZOJ 4399: 魔法少女LJJ(线段树)

    传送门 解题思路 出题人真会玩..操作\(2\)线段树合并,然后每棵线段树维护元素个数和.对于\(6\)这个询问,因为乘积太大,所以要用对数.时间复杂度\(O(nlogn)\) 代码 #include ...

  10. Sumdiv

    题目链接 题意:求a^b的所有约数之和mod9901. 思路:因为一个数A能够表示成多个素数的幂相乘的形式.即A=(a1^n1)*(a2^n2)*(a3^n3)...(am^nm).所以这个题就是要求 ...