首页 > 其他分享 >vp Codeforces Round 986 (Div. 2)

vp Codeforces Round 986 (Div. 2)

时间:2025-01-12 14:55:03浏览次数:1  
标签:std cnt int 986 vp -- push Div op

A. Alice's Adventures in "Chess"

题意:你从(0, 0)出发,重复固定的移动路径,问能不能经过(a, b)。

直接跑一百次就行,因为ab都很小(其实只要跑20次)。

点击查看代码
void solve() {
    int n, a, b;
    std::cin >> n >> a >> b;
    int x = 0, y = 0;
    std::string s;
    std::cin >> s;
    std::vector<std::pair<int, int> > c;
    for (auto & ch : s) {
    	if (ch == 'N') {
    		++ y;
    	} else if (ch == 'E') {
    		++ x;
    	} else if (ch == 'S') {
    		-- y;
    	} else {
    		-- x;
    	}

    	c.push_back({x, y});
    }

    for (int i = 0; i <= 100; ++ i) {
    	for (auto & it : c) {
    		if (it.first == a && it.second == b) {
    			std::cout << "YES\n";
    			return;
    		}

    		it.first += x; it.second += y;
    	}
    }

    std::cout << "NO\n";
}

B. Alice's Adventures in Permuting

题意:给你一个数组的生成式:\(a_i\)=(i-1)*b+c,每次把最大的数变成mex,问需要多少次可以变成0到n-1的排列。

自己写几个样例发现,如果全部数都小于n,那么b=1,c=0的情况是0次操作,b=0的话,c>=n是n次操作,c>=n-2是n-1次操作,其他都是-1。
对于数组里有大于等于n的数的情况,那么每次会把一个大于等于n的数变成mex,如果有m个大于等于n的数,就会操作m次,我是用二分找的这个m。

点击查看代码
void solve() {
	using i128 = __int128;
    i64 n, b, c;
    std::cin >> n >> b >> c;
    if (b == 0 && c >= n) {
    	std::cout << n << "\n";
    	return;
    }

    if (b == 0 && c >= n - 2) {
    	std::cout << n - 1 << "\n";
    	return;
    }


    if ((i128)(n - 1) * (i128)b + c == n - 1) {
		std::cout << 0 << "\n";	
		return;
	}

    if ((i128)(n - 1) * (i128)b + c < n - 1) {
		std::cout << -1 << "\n";	
		return;
	}

    i64 l = 1, r = n;
    while (l < r) {
    	i64 mid = l + r >> 1;
    	if ((i128)(mid - 1) * (i128)b + c >= n) {
    		r = mid;
    	} else {
    		l = mid + 1;
    	}
    }

    std::cout << n - l + 1 << "\n";
}

C. Alice's Adventures in Cutting Cake

题意:你要把一个数组分成m+1组,每一组都由连续的元素组成,其中m组每组总和要大于等于v,要让剩下属于我们的一组在满足这些条件下的总和最大。

如果我们以i开始,那么前面i-1个应该正好分成满足条件的几组,不然我们的开始位置可以往前移。那么我们可以从前往后枚举前面分几组,那么我们这组能取到后面哪个位置呢?为了让后面的组对我们的影响最小,应该从最后开始分给他们,那就预处理从后面开始到第i个可以取满几个组,那么如果我们前面有了k组,那么可以二分后面分成m-k组的最大下标,那么中间的数就都属于我们。

点击查看代码
void solve() {
    int n, m;
    i64 v;
    std::cin >> n >> m >> v;
    std::vector<i64> a(n);
    for (int i = 0; i < n; ++ i) {
    	std::cin >> a[i];
    }

    std::vector<i64> sum(n + 1);
    for (int i = 0; i < n; ++ i) {
    	sum[i + 1] = sum[i] + a[i];
    }

    std::vector<int> cnt(n + 2);
   	for (int i = n; i >= 1; -- i) {
   		int j = i;
   		while (j && sum[i] - sum[j - 1] < v) {
   			-- j;
   		}

   		if (j) {
   			cnt[j] = cnt[i + 1] + 1;
   		}

   		i = j;
   	}

   	for (int i = n; i >= 1; -- i) {
   		cnt[i] = std::max(cnt[i], cnt[i + 1]);
   	}

   	if (cnt[1] < m) {
   		std::cout << -1 << "\n";
   		return;
   	};

   	i64 ans = 0;
   	for (int i = 1, k = m; i <= n; ++ i, -- k) {
   		int l = i + 1, r = n + 1;
   		while (l < r) {
   			int mid = l + r + 1 >> 1;
   			if (cnt[mid] >= k) {
   				l = mid;
   			} else {
   				r = mid - 1;
   			}
   		}

   		if (cnt[l] >= k) {
   			ans = std::max(ans, sum[l - 1] - sum[i - 1]);
   		}

   		int j = i;
   		while (j <= n && sum[j] - sum[i - 1] < v) {
   			++ j;
   		}

   		i = j;
   	}

   	std::cout << ans << "\n";
}

D. Alice's Adventures in Cards

题意:我们手里有一个1,希望它变到n,我们可以和三个人交换,每个人对i都有一个重视值,如果第i个数重视值大于第j个数,那么我们可以用j换i。我们只可以换比手里更大的数。要求给定一个操作序列。

正解好像是dp,我写了个差不多搜索的东西。
三个set存分别存{\(a_i\), i}, {\(b_i\), i}, {\(c_i\), i}。
开始我们把1入队,用优先队列每次出最小的数。然后把还没进队的比当前数小的数从三个set里都删了。然后三个set分别lower_bound一下枚举比当前数值小的数,求个最短路记录转移,最后把新入队的数统一从三个set里删了。

点击查看代码
void solve() {
    int n;
    std::cin >> n;
    std::vector<int> a(n + 1), b(n + 1), c(n + 1);
    for (int i = 1; i <= n; ++ i) {
    	std::cin >> a[i];
    }

    for (int i = 1; i <= n; ++ i) {
    	std::cin >> b[i];
    }

    for (int i = 1; i <= n; ++ i) {
    	std::cin >> c[i];
    }

    std::vector<int> pre(n + 1);
    std::vector<std::string> op(n + 1);
    std::priority_queue<int, std::vector<int>, std::greater<int> > q;
    q.push(1);
    std::set<int> s;
    std::set<std::pair<int, int> > sa, sb, sc;
    for (int i = 2; i <= n; ++ i) {
    	s.insert(i);
    	sa.insert({a[i], i});
    	sb.insert({b[i], i});
    	sc.insert({c[i], i});
    }

    while (q.size()) {
    	int u = q.top(); q.pop();
    	while (s.size() && *s.begin() < u) {
    		int id = *s.begin();
    		sa.erase({a[id], id});
    		sb.erase({b[id], id});
    		sc.erase({c[id], id});
    		s.erase(s.begin());
    	}

    	std::vector<int> del;

    	auto ia = sa.lower_bound({a[u], 0});
    	while (ia != sa.begin()) {
    		-- ia;
    		int v = ia->second;
			if (op[v].empty()) {
				pre[v] = u;
				op[v] = "Q";
				q.push(v);
				del.push_back(v);
	    	}
	    }

	    auto ib = sb.lower_bound({b[u], 0});
    	while (ib != sb.begin()) {
    		-- ib;
    		int v = ib->second;
			if (op[v].empty()) {
				pre[v] = u;
				op[v] = "K";
				q.push(v);
				del.push_back(v);
	    	}
	    }

	    auto ic = sc.lower_bound({c[u], 0});
    	while (ic != sc.begin()) {
    		-- ic;
    		int v = ic->second;
			if (op[v].empty()) {
				pre[v] = u;
				op[v] = "J";

				q.push(v);
				del.push_back(v);
	    	}
	    }

    	for (auto & id : del) {
    		sa.erase({a[id], id});
    		sb.erase({b[id], id});
    		sc.erase({c[id], id});
    		s.erase(id);
    	}
    }

    if (s.count(n)) {
    	std::cout << "NO\n";
    } else {
    	std::cout << "YES\n";
    	std::vector<std::string> ans;
    	int i = n;
    	while (i > 1) {
    		ans.push_back(op[i] + " " + std::to_string(i));
    		i = pre[i];
    	}

    	std::reverse(ans.begin(), ans.end());
    	std::cout << ans.size() << "\n";
    	for (auto & s : ans) {
    		std::cout << s << "\n";
    	}
    }
}

标签:std,cnt,int,986,vp,--,push,Div,op
From: https://www.cnblogs.com/maburb/p/18666951

相关文章

  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!) B. Friendly Arrays
    Codeforces题解-[B.FriendlyArrays]题目链接题目描述Youaregiventwoarraysofintegers—\(a_1,\ldots,a_n\)oflength\(n\),and\(b_1,\ldots,b_m\)oflength\(m\).Youcanchooseanyelement\(b_j\)fromarray\(b\)(\(1\leqj\leqm......
  • YOLOv11改进,YOLOv11添加HAttention注意机制用于图像修复的混合注意力转换器,CVPR2023,超
    摘要基于Transformer的方法在低层视觉任务中表现出色,例如图像超分辨率。然而,作者通过归因分析发现,这些网络只能利用有限的空间范围的输入信息。这意味着现有网络尚未充分发挥Transformer的潜力。为了激活更多的输入像素以获得更好的重建效果,作者提出了一种新型的混合注......
  • VP UNIQUE VISION Programming Contest 2024 Christmas (AtCoder Beginner Contest 38
    A-Equally题意:给你三个数,判断能不能分成大于一组后每组和相等。只可能分成两个和一个或者三组一个的。点击查看代码voidsolve(){inta,b,c;std::cin>>a>>b>>c;if((a==b&&b==c)||(a+b==c)||(b+c)==a||(a+c)==b){ s......
  • VP AtCoder Beginner Contest 387
    A-HappyNewYear2025按题意输出即可。点击查看代码voidsolve(){inta,b;std::cin>>a>>b;std::cout<<(a+b)*(a+b)<<"\n";}B-9x9Sum直接遍历累加满足不等于x的数即可,注意这个九九乘法表是9*9的矩阵,不是我们学的下三角。点击查看......
  • VP Codeforces Round 995 (Div. 3)
    A.PreparingfortheOlympiad题意,有两个数组a和b,如果你选了a数组中第i个,那么对手获得b数组第i+1个,求你们得分的差值最大。直接加上所有ai>bi+1的就行。点击查看代码voidsolve(){intn;std::cin>>n;std::vector<int>a(n),b(n);for(inti=0;......
  • CF div2 994 (A~E)
    VP赛时三题,自我感觉发挥不错,唯一不满意的地方在于D题完全没有思路。A答案最多为2,因为最坏情况即为先将整个区间合并为一个数,若这个数不是0,则再将这个数变为0。所以3种情况分类讨论即可:全是0,则不需要操作->\(0\)只有一段非\(0\)连续区间->\(1\)不止\(1\)个非\(0\)连续区......
  • 南京芯麒电子-基于KU115的3U VPX 高性能处理平台
    概述该平台是由16nm工艺的的KINTEXUltraScale+系列主器件XCKU115构建的一款标准3UVPX高性能数据处理平台,板载1组独立的DDR4SDRAM,存储带宽64位,2GHz数据率,最大支持4GByteDDR4SDRAM,提供1个FMC+接口、可搭配我司各类FMC子卡使用,实现数据采集回放。板卡设计满足工业级要求,可用于......
  • 产品创新为什么需要MVP流程
    01什么是MVP? 最近很多共创力客户在参加公开课或者现场咨询服务时,提到一个比较多的问题是:如何快速地打造产品原型?并得到市场的验证?尤其像美的、TCL、海信、格力、小米等电子电器类企业,产品迭代更新的周期较短,很多产品半年迭代升级一次,如工业设计、产品系列化设计、产品的性能等......
  • 南京芯麒电子-基于6U VPX的TMS320C6678+XCVU9P的高性能处理平台
    概述该平台是由16nm工艺的的XCUV9PFPGA和TI公司高性能数字信号处理器TMS320C6678构建的一款标准6UVPX高性能数据处理平台,VPXP1上定义4个x4GTY,P2上1路PCIex16接口、P3~P6上引出了大量GTY/GTH以及RS422/GPIO信号。板卡提供2个FMC+接口、可搭配我司各类FMC子卡使用,实现数据采集......
  • 南京芯麒电子-基于6U VPX的XCVU9P+ZU9EG的高性能处理平台
    **概述**该平台是由16nm工艺的的XCUV9P+ZU9EG构建的一款标准6UVPX高性能数据处理平台,VPXP1上定义4个x4GTY,P2上1路PCIex16接口、P3~P6上引出了大量GTY/GTH以及RS422/GPIO信号。板卡提供2个FMC+接口、可搭配我司各类FMC子卡使用,实现数据采集处理。板卡设计满足工业级要求,可用......