zoukankan      html  css  js  c++  java
  • 【Educational Codeforces Round 103 (Rated for Div. 2) C】Longest Simple Cycle

    题目链接

    链接

    翻译

    每一列的头尾会和前一列的第 (a_i) 和第 (a_j) 个节点相连,第 (i) 列有 (c_i) 个节点。

    问你能形成的一个最长的环是多少。

    题解

    (pre_i) 表示从第 (i) 列的 两端 开始,往前延伸,形成的最长的环。

    (pre_i) 有两种更新方式,第一种在第 (i-1) 列往两边开花,第二种,在第 (i-1) 列闭合。

    第一种情况注意第一列不能继续开花的情况就好。

    最后用 (c[i]+pre_i) 更新答案即可。

    以及, LL

    代码

    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    const int N = 1e5;
    
    int T,n;
    LL c[N + 10], a[N + 10], b[N + 10],pre[N + 10];
    
    int main() {
    	#ifdef LOCAL_DEFINE
    		freopen("in.txt", "r", stdin);
    	#endif // LOCAL_DEFINE
    	ios::sync_with_stdio(0), cin.tie(0);
    	cin >> T;
    	
    	while(T--){
    		cin >> n;
    		for (int i = 1; i <= n; i++) {
    			cin >> c[i];
    		}
    		for (int i = 1; i <= n; i++) {
    			cin >> a[i];
    		}
    		for (int i = 1; i <= n; i++) {
    			cin >> b[i];
    		}
    		pre[1] = 0;
    		for (int i = 2; i <= n; i++) {
    			if (a[i] != b[i]) {
    				if (i > 2) {
    					if (a[i] < b[i]) {
    						pre[i] = pre[i - 1] + 2 + a[i] - 1 + c[i - 1] - b[i];
    					}
    					else {
    						pre[i] = pre[i - 1] + 2 + b[i] - 1 + c[i - 1] - a[i];
    					}
    				}
    				else {
    					pre[i] = 0;
    				}
    				
    			}
    			else pre[i] = 2;
    			pre[i] = max(pre[i], 2 + abs(b[i] - a[i]));
    		}
    		LL ans = pre[2] + c[2]-1;
    		for (int i = 3; i <= n; i++) {
    			ans = max(ans, pre[i] + c[i]-1);
    		}
    		cout << ans << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    Oauth2.0认证原理
    互联网开放平台API安全设计
    API接口幂等性框架设计
    防盗链&CSRF&API接口幂等性设计
    ElasticSearch高可用集群环境搭建和分片原理
    SpringBoot2.0+ElasticSearch网盘搜索实现
    Elasticsearch6.4.3文档的映射
    中文分词器
    C# 插件
    JavaScript 网址
  • 原文地址:https://www.cnblogs.com/AWCXV/p/14498439.html
Copyright © 2011-2022 走看看