比赛链接:
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