abc209题解
A
B
C
降智了,一直想容斥,,,浪费了10min。
其实很简单,按
D
E
妙啊,考场时我只想怎么连边,怎么连边都有很多。
其实可以将点看成边,这样边只有
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <vector>
#include <queue>
#include <iostream>
#define LL long long
using namespace std;
const int MAXN = 4e5 + 5;
int n, len, tot, d[MAXN], vis[MAXN], a[MAXN], b[MAXN];
vector <int> v[MAXN];
string s, s1, s2;
map <string, int> mp;
queue <int> que;
int main() {
scanf("%d", &n); memset(vis, -1, sizeof(vis));
for(int i = 1; i <= n; i ++) {
s.clear(); cin >> s; len = s.length(); s1.clear(); s2.clear();
s1 += s[0]; s1 += s[1]; s1 += s[2]; s2 += s[len - 3]; s2 += s[len - 2]; s2 += s[len - 1];
// cout << s1 << ' ' << s2 << endl;
if(mp.find(s1) == mp.end()) mp[s1] = ++ tot;
if(mp.find(s2) == mp.end()) mp[s2] = ++ tot;
a[i] = mp[s1]; b[i] = mp[s2];
v[b[i]].push_back(a[i]); d[a[i]] ++;
}
for(int i = 1; i <= tot; i ++) if(!d[i]) que.push(i), vis[i] = 0;
while(!que.empty()) {
int t = que.front(); que.pop();
for(int i = 0; i < v[t].size(); i ++) {
int q = v[t][i]; d[q] --;
if(vis[q] != 1) {
if(vis[t] == 0) { vis[q] = 1; que.push(q); continue; }
if(!d[q]) que.push(q), vis[q] = 0;
}
}
}
for(int i = 1; i <= n; i ++) {
if(vis[b[i]] == 0) printf("Takahashi\n");
else if(vis[b[i]] == 1) printf("Aoki\n");
else printf("Draw\n");
}
return 0;
}
F
很容易想到一个贪心:先选最大的。
考虑一段区间
换句话说,题目让你求排列的数量,排列满足:对于所有相邻的两个数,大的那个数都比小的那个数先选。看得出来这是一个拓扑图(虽然对正解没什么帮助
考虑
分类讨论。注意边界取不取。
则
, ,这里 时相当于 原来在 处,插入 在 前,它也在 处,于是可行。 , 。 , 。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define LL long long
using namespace std;
const int MAXN = 4005, Mod = 1e9 + 7;
int n, a[MAXN], ans;
LL dp[MAXN][MAXN], pre[MAXN];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
dp[1][1] = 1; pre[1] = 1;
for(int i = 2; i <= n; i ++) {
for(int j = 1; j <= i; j ++) {
if(a[i] > a[i - 1]) dp[i][j] = pre[i - 1] - pre[j - 1];
else if(a[i] < a[i - 1]) dp[i][j] = pre[j - 1];
else dp[i][j] = pre[i - 1];
dp[i][j] = (dp[i][j] % Mod + Mod) % Mod;
}
for(int j = 1; j <= i; j ++) pre[j] = (pre[j - 1] + dp[i][j]) % Mod;
}
for(int i = 1; i <= n; i ++) ans = (ans + dp[n][i]) % Mod;
printf("%d", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】