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)\))求出. 但是还不够,我们先对\( ...
随机推荐
- js代码检测设备问题:为什么在移动端检测设备的时候会出现pc的页面
为了在手机上也能正常显示页面,所以为之前写的页面又重写了一遍,专门用来在移动端显示,用js代码检测设备,如果是pc就显示pc的页面,如果是移动就显示移动的页面,但遇到一个问题就是在移动端打开会有一个延 ...
- HTML基础用 表格做报表
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Python 的 zip 和 dict 组合 生成新字典
>>> d = dict(zip(['a', 'b'], [1, 2]))>>> d{'a': 1, 'b': 2}>>> d = dict(zi ...
- mysql查找表名
SELECT *FROM information_schema.TABLESWHERE 1=1 AND table_name LIKE '%order%' AND table_comment like ...
- 英语单词Uninterrupted
Uninterrupted 来源——不间断电源供应 UPS(Uninterrupted Power Supply) 翻译 adj. 不间断的:连续的 GRE 词根 un- + interrupt ...
- spring依赖搜索
spring项目在启动时,spring框架会根据名称自动搜索实现类. 这在日常开发中还是很有用的. 下面举两个例子. 1. 先写一个接口(或者抽象类) public interface IPerson ...
- JS中数据结构之栈
1.栈的基本介绍 栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现. 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出( ...
- SSM - 全局跨域处理
这几天在开发中编写项目时需要前后端分离,刚好涉及到跨域这个问题,很早之前做项目时也用过,也是在网上找的列子,来源已经无处可寻了,若侵必删! 跨域问题一般出现两者服务器不同或者不同的端口上访问资源时会存 ...
- [HDU3117]Fibonacci Numbers
题目:Fibonacci Numbers 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3117 分析: 1)后四位可以用矩阵快速幂解决.$T= \left ...
- POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci
题目:Matrix Power Series 传送门:http://poj.org/problem?id=3233 分析: 方法一:引用Matrix67大佬的矩阵十题:这道题两次二分,相当经典.首先我 ...