Educational Codeforces Round 62 (Div. 2)
阿新 • • 發佈:2019-03-23
insert 每次 ray multi fir ext 記錄 pri 暴力
自測的時候做出了A~E
E花的時間太多q-q
A Detective Book
暴力模擬
#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std; const int N = 1e4 + 5; int n, ans, pre; int main(){ scanf("%d", &n); for(int i = 1, x; i <= n; ++i){ scanf("%d", &x); pre = max(x, pre); if(i >= pre){++ans; pre = 0;} } printf("%d", ans); return 0; }
B Good String
取最左邊的">"和最右邊的"<"與最左/右邊距離的最小值
#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std; const int N = 105; int n, ans, fir, las; char str[N]; int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d%s", &n, str + 1); fir = n, las = 1; for(int i = 1; i <= n; ++i) if(str[i] == '>') {fir = i; break;} for(int i = n; i >= 1; --i) if(str[i] == '<') {las = i; break;} ans = min(fir - 1, n - las); printf("%d\n", ans); } return 0; }
C Playlist
按bi從大到小
用multiset模擬1~i - 1中t最大的k個的和
#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <set> using namespace std; const int N = 3e5 + 5; int n, m; long long ans; struct Node{ int x, y; }node[N]; inline bool rule(Node x, Node y){ return x.y > y.y; } multiset<int> st; long long stsize, len; int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i){ scanf("%d%d", &node[i].x, &node[i].y); } sort(node + 1, node + n + 1, rule); for(int i = 1; i <= n; ++i){ if(st.size() < m){ st.insert(node[i].x); len += node[i].x; } else if((*st.begin()) < node[i].x){ len += node[i].x - (*st.begin()); st.erase(st.begin()); st.insert(node[i].x); } long long d = 1ll * len * node[i].y; ans = max(d, ans); } printf("%lld", ans); return 0; }
D Minimum Triangulation
手玩一下。。。從一放射形劃分
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <set>
using namespace std;
const int N = 3e5 + 5;
int n;
long long ans;
int main(){
scanf("%d", &n);
for(int i = 3; i <= n; ++i){
ans += 1ll * i * (i - 1);
}
printf("%lld", ans);
return 0;
}
E Palindrome-less Arrays
有一點麻煩的dp
suf是每次向後跳兩個
找到第一個不為-1的數就記錄
如果沒有 那麽記錄為後面的最後一個-1 再沒有就記為零
f[i][0]是第i個所在-1連續子串在i的位置與suf不同的種類數
f[i][1]是第i個所在-1連續子串在i的位置與suf相同的種類數
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <set>
using namespace std;
const int N = 3e5 + 5;
const long long P = 998244353;
int n, k;
int a[N], suf[N], pre[N];
long long f[N][2], ans = 1;
int main(){
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
if(~a[i] && a[i] == a[i - 2]){
printf("0"); return 0;
}
}
for(int i = n - 2; i >= 1; --i){
if(~a[i + 2]) suf[i] = a[i + 2];
else suf[i] = suf[i + 2];
}
for(int i = 3; i <= n; ++i) pre[i] = a[i - 2];
for(int i = 1; i <= n; ++i){
if(~a[i]){
if(suf[i] == a[i]){
f[i][1] = 1;
}
else {
f[i][0] = 1;
}
}
else {
if(pre[i]){
if(suf[i]){
if(suf[i] != a[i + 2]) f[i][1] = f[i - 2][0];
f[i][0] = (f[i - 2][0] * (k - 2) % P + f[i - 2][1] * (k - 1) % P) % P;
}
else {
f[i][1] = 0;
f[i][0] = f[i - 2][0] * (k - 1) % P;
}
}
else {
if(suf[i]){
if(suf[i] != a[i + 2]) f[i][1] = 1;
f[i][0] = k - 1;
}
else {
f[i][1] = 0;
f[i][0] = k;
}
}
}
// printf("%d %d %lld %lld\n", pre[i], suf[i], f[i][0], f[i][1]);
}
for(int i = 1; i <= n; ++i){
if(suf[i] == a[i + 2]){
ans = ans * f[i][0] % P;
}
}
printf("%lld\n", ans);
return 0;
}
F Extending Set of Points
G Double Tree
Educational Codeforces Round 62 (Div. 2)