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. java this的应用

    package java04; /* * 当方法的局部变量和类的成员变量重名时,会根据“就近原则”,优先使用局部变量. * 如果需要访问奔雷中的成员变量,需要使用格式: this.成员变量名 * * ...

  2. HTML 地理定位 的实例

    <!DOCTYPE html> <html lang="en"> <head> <title>地理定位</title> ...

  3. 带有IBM大脑的浮动机器人被成功引导至太空

    近日,带有IBM大脑的浮动机器人被成功引导至太空,在接下来的装运前往国际空间站包近三吨的研究和再补给材料. 机器人的全名是CrewInteractiveMobileCompanion:Cimon.它看 ...

  4. Python 的 zip 和 dict 组合 生成新字典

    >>> d = dict(zip(['a', 'b'], [1, 2]))>>> d{'a': 1, 'b': 2}>>> d = dict(zi ...

  5. react-jsx和数组

    JSX: 1.全称:JavaScriptXML, 2.react定义的一种类似于XML的JS扩展语法:XML+JS 3.作用:用来创建react虚拟DOM(元素)对象 var ele=<h1&g ...

  6. 什么是ppa

    What is ppa? PPAs are for non standard software/updates. They are generally used by people who want ...

  7. Java基本数据类型及所占字节大小

    一.Java基本数据类型 基本数据类型有8种:byte.short.int.long.float.double.boolean.char 分为4类:整数型.浮点型.布尔型.字符型. 整数型:byte. ...

  8. XP定位(APP元素定位)

    Appium app自动化测试经验分享-Xpath定位总结 在我看来,自动化测试中元素定位的倚天剑和屠龙刀莫过于 Xpath和CSS,但CSS只用于Web(之前已经分享过),这次就分享下Xpath的定 ...

  9. LOJ 2541 「PKUWC2018」猎人杀——思路+概率+容斥+分治

    题目:https://loj.ac/problem/2541 看了题解才会……有三点很巧妙. 1.分母如果变动,就很不好.所以考虑把操作改成 “已经选过的人仍然按 \( w_i \) 的概率被选,但是 ...

  10. 简记 jQuery 插件模板

    /** * @lisence jquery plugin demo v1.0.0 * * author: Jeremy Yu * * description: * this is a jquery p ...