首页 > 编程语言 >第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)

时间:2022-11-07 22:15:19浏览次数:73  
标签:int res 45 long ICPC vector using fwt 程序设计

比赛链接:

https://ac.nowcoder.com/acm/contest/12548/

H.Hard Calculation

思路:

输出 \(x\) + 2020。

代码:

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	LL x;
	cin >> x;
	cout << x + 2020;
	return 0;
}

L. Simone and graph coloring

题意:

给定一个排列,所有逆序对之间都有一条边,由此可以形成一个图,为每个值赋一个颜色,要求相邻两个值之间颜色不同,问至少需要多少颜色,输出一种方案。

思路:

如果从右向左遍历,以某个值为起点的递减序列的所有值的颜色都要不同,即以它为起点的最长下降序列。用树状数组维护该值。

代码:

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
struct fwt{
	int n;
	vector <int> a;
	fwt(int n) : n(n), a(n + 1) {}
	int Max(int x){
		int res = 0;
		for (; x; x -= x & -x)
			res = max(res, a[x]);
		return res;
	}
	void add(int x, int k){
		for (; x <= n; x += x & -x)
			a[x] = max(a[x], k);
	}
};
void solve(){
	int n;
	cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; i ++ )
		cin >> a[i];
	fwt f(n);
	vector<int> b(n);
	for (int i = n - 1; i >= 0; i -- ){
		b[i] = f.Max(a[i] - 1) + 1;
		f.add(a[i], b[i]);
	}
	cout << *max_element(b.begin(), b.end()) << "\n";
	for (int i = 0; i < n; i ++ )
		cout << b[i] << " \n"[i == n - 1];
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int T;
	cin >> T;
	while(T -- ){
		solve();
	}
	return 0;
}

标签:int,res,45,long,ICPC,vector,using,fwt,程序设计
From: https://www.cnblogs.com/Hamine/p/16867050.html

相关文章