2.18杂
先写一道题CF5E
#include <bits/stdc++.h>
#define maxn 1000005
using namespace std;
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; char c = getchar(); }
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
int n, p, m;
int a[maxn], h[maxn], s[maxn], cnt[maxn];
signed main() {
n = read();
int ma = 0;
//1 2 4 5 3
for (int i = 1; i <= n; i++) {
a[i] = read();
if (ma < a[i]) ma = a[i], p = i;
}
for (int i = p + 1; i <= n; i++) h[++m] = a[i];
for (int i = 1; i < p; i++) h[++m] = a[i];
//h: 3 1 2 4
//for (int i = 1; i <= m; i++) cout << h[i] << " ";
cout << endl;
int top = 0, ans = n - 1;
for (int i = 1; i <= m; i++) {
while (s[top] < h[i] && top) ans += cnt[top--];
//cout << s[top] << " ";
if (s[top] != h[i]) s[++top] = h[i], cnt[top] = 0;
//cout << cnt[top] << " ";
ans += cnt[top]++;
//cout << ans << endl;
}
while (top > 1) ans += cnt[top--];
cout << ans;
}
DP+单调栈即可,递推一下。
然后去开了场答辩会,听why说答辩。
就两周了,能讲个寄吧课,文化课都快学不懂了。
只能说6……
又写了一道题一道塔尖
然而塔尖已经有点忘了
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; char c = getchar(); }
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
struct edge {
int v, nxt;
}e[maxn], G[maxn];
int head[maxn], h[maxn], cnt, tot;
void add1(int u, int v) {
e[++cnt] = { v, head[u] };
head[u] = cnt;
}
void add2(int u, int v) {
G[++tot] = { v, h[u] };
h[u] = tot;
}
int n, m;
int dfn[maxn], low[maxn], tme;
int s[maxn], top;
int id[maxn], scc_cnt, din[maxn], vis[maxn];
void init() {
cnt = 0, tot = 0, scc_cnt = 0;
memset(head, -1, sizeof(head));
memset(h, -1, sizeof(h));
memset(dfn, 0, sizeof(dfn));
memset(low, 0, sizeof(low));
memset(vis, 0, sizeof(vis));
memset(id, 0, sizeof(id));
memset(din, 0, sizeof(din));
memset(e, 0, sizeof(e));
memset(G, 0, sizeof(G));
memset(s, 0, sizeof(s));
top = 0;
tme = 0;
}
void Tarjan(int x) {
dfn[x] = low[x] = ++tme;
vis[x] = 1, s[++top] = x;
for (int i = head[x]; ~i; i = e[i].nxt) {
int y = e[i].v;
if (!dfn[y]) {
Tarjan(y);
low[x] = min(low[x], low[y]);
}
else if (vis[y]) low[x] = min(low[x], dfn[y]);
}
if (dfn[x] == low[x]) {
++scc_cnt;
int y;
do{
y = s[top--];
vis[y] = 0;
id[y] = scc_cnt;
} while (y != x);
}
}
bool tp() {
queue<int> q;
for (int i = 1; i <= scc_cnt; i++)
if (!din[i]) q.push(i);
while (!q.empty()) {
if (q.size() > 1) return 0;
int x = q.front(); q.pop();
for (int i = h[x]; ~i; i = G[i].nxt) {
int y = e[i].v;
if(--din[y] == 0) q.push(y);
}
}
return 1;
}
signed main() {
int T = read();
while (T--) {
init();
n = read(), m = read();
for (int i = 1; i <= m; i++) {
int u = read(), v = read();
add1(u, v);
}
for (int i = 1; i <= n; i++)
if (!dfn[i]) Tarjan(i);
for (int i = 1; i <= n; i++) {
for (int j = head[i]; ~j; j = e[j].nxt) {
int v = e[j].v;
if (id[i] == id[v]) continue;
add2(id[i], id[v]);
din[id[v]]++;
}
}
if (tp()) cout << "Yes\n";
else cout << "No\n";
}
}
我是smsb(
后来来了一堆人真tm服了烦死了来了也不干正事把机房当网吧
之后一个小时又写了道数据结构,太久没写线段树了,bug太多直接ctj(大雾
#include <bits/stdc++.h>
#define maxn 100005
#define lc t[p << 1]
#define rc t[p << 1 | 1]
using namespace std;
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; char c = getchar(); }
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
struct node{
int l, r;
int d, ld, rd;
int tag;
}t[maxn << 2];
int n, m;
void pushup(int p) {
t[p].ld = lc.ld;
if (lc.ld == lc.r - lc.l + 1) t[p].ld = lc.d + rc.ld;
t[p].rd = rc.rd;
if (rc.rd == rc.r - rc.l + 1) t[p].rd = rc.d + lc.rd;
t[p].d = max(lc.d, max(rc.d, lc.rd + rc.ld));
}
void build(int p, int l, int r) {
t[p].l = l, t[p].r = r;
if (l == r) {
t[p].d = t[p].ld = t[p].rd = 1;
return;
}
int mid = t[p].l + t[p].r >> 1;
build(p << 1, l, mid), build(p << 1 | 1, mid + 1, r);
pushup(p);
}
void pushdown(int p) {
node& u = t[p];
if (u.tag) {
if(u.tag == 1) {
lc.d = lc.ld = lc.rd = lc.r - lc.l + 1;
rc.d = rc.ld = rc.rd = rc.r - rc.l + 1;
}
else if(u.tag == 2) {
lc.d = lc.ld = lc.rd = rc.d = rc.ld = rc.rd = 0;
}
lc.tag = rc.tag = u.tag;
u.tag = 0;
}
}
int query(int p, int len) {
if(t[p].d == 1 && t[p].l == t[p].r && len == 1) return t[p].l ;
if(t[p].d < len) return 0;
pushdown(p);
int mid = t[p].l + t[p].r >> 1;
if(lc.d >= len) return query(p << 1, len);
if(lc.rd + rc.ld >= len) return lc.r - lc.rd + 1;
if(rc.d >= len) return query(p << 1 | 1, len);
return 0;
}
void modify(int p, int l, int r, int opt) {
if(t[p].l >= l && t[p].r <= r) {
if(opt == 1)
t[p].d = t[p].ld = t[p].rd = t[p].r - t[p].l + 1;
else
t[p].d = t[p].ld = t[p].rd = 0;
t[p].tag = opt;
return;
}
pushdown(p);
int mid = t[p].l + t[p].r >> 1;
if(l <= mid) modify(p << 1, l, r, opt);
if(r > mid) modify(p << 1 | 1, l, r, opt);
pushup(p);
}
signed main() {
n = read(), m = read();
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int opt = read();
if (opt == 1) {
int d = read();
int l = query(1, d);
cout << l << endl;
if(l) modify(1, l, l + d - 1, 2);
}
else {
int x = read(), d = read();
modify(1, x, x + d - 1, 1);
}
}
}
这题之前似乎还做过,再做一遍就做不对了QwQ
机房人真多,烦,不知道干什么
又写了赤壁之战,一个树状数组优化的DP,发现洛谷上之前做过……都忘记了……
#include <bits/stdc++.h>
#define maxn 1005
#define INF 0x3f3f3f3f
#define mod 1000000007
using namespace std;
int n, m, a[maxn], b[maxn], c[maxn], f[maxn][maxn], num;
void add(int x, int y) {
while (x <= n + 1) {
c[x] = (c[x] + y) % mod;
x += x & -x;
}
}
int ask(int x) {
int ans = 0;
while (x) {
ans = (ans + c[x]) % mod;
x -= x & -x;
}
return ans;
}
int main() {
int T;
cin >> T;
while (T--) {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
memcpy(b, a, sizeof(b));
sort(b + 1, b + n + 1);
for (int i = 1; i <= n; i++)
a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b + 1;
a[0] = f[0][0] = 1;
for (int i = 1; i <= m; i++) {
memset(c, 0, sizeof(c));
add(1, f[i - 1][0]);
for (int j = 1; j <= n; j++) {
f[i][j] = ask(a[j] - 1);
add(a[j], f[i - 1][j]);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) ans = (ans + f[m][i]) % mod;
printf("Case #%d: %d\n", ++num, ans);
}
}
看了一眼,为什么缩进这么奇怪………
乱!乱!乱!烦寄吧死了!几把的什么也干不进去!跟网吧没两样
真tm的sb,一个个往机房跑,真把机房当自己家
本来中午都不说话挺安静,听着歌很有氛围,结果后来越来越tm吵,我******
写了一下玉米田
#include <bits/stdc++.h>
#define int long long
#define maxn 100005
using namespace std;
const int mod = 1e8;
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); }
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
int n, m;
int x[15];
int f[15][1 << 15];
int v[1 << 15];
signed main() {
m = read(), n = read();
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
int a = read();
(x[i] <<= 1) += a;
}
}
for (int i = 0; i < (1 << n); i++)
v[i] = !(i & (i << 1)) && !(i & (i >> 1));
// for (int i = 1; i < (1 << n); i++)
// if (v[i] && (i & x[1]) == i) f[1][i] = 1;
f[0][0] = 1;
for (int i = 1; i <= m; i++)
for (int j = 0; j < (1 << n); j++) if (v[j] && ((j & x[i]) == j))
for (int k = 0; k < (1 << n); k++)
if (!(k & j)) f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
int ans = 0;
for (int i = 0; i < (1 << n); i++)
ans = (ans + f[m][i]) % mod;
cout << ans;
}
还出现了:
for (int i = 1; i <= m; i++) {
for (int i = 1; i <= n; i++) {
int a = read();
(x[i] <<= 1) += a;
}
}
的sb状况……
下午摆大烂,打冰与火之舞和MC
#include <bits/stdc++.h>
#define int long long
#define maxn 100005
using namespace std;
const int mod = 1e8;
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); }
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
int k, n[31], f[31][31][31][31][31];
signed main() {
while (k = read()) {
memset(n, 0, sizeof(n));
for (int i = 1; i <= k; i++) n[i] = read();
memset(f, 0, sizeof(f));
f[0][0][0][0][0] = 1;
for (int a1 = 0; a1 <= n[1]; a1++)
for (int a2 = 0; a2 <= n[2]; a2++)
for (int a3 = 0; a3 <= n[3]; a3++)
for (int a4 = 0; a4 <= n[4]; a4++)
for (int a5 = 0; a5 <= n[5]; a5++) {
if (a1 < n[1]) f[a1 + 1][a2][a3][a4][a5] += f[a1][a2][a3][a4][a5];
if (a2 < n[2] && a1 > a2) f[a1][a2 + 1][a3][a4][a5] += f[a1][a2][a3][a4][a5];
if (a3 < n[3] && a2 > a3) f[a1][a2][a3 + 1][a4][a5] += f[a1][a2][a3][a4][a5];
if (a4 < n[4] && a3 > a4) f[a1][a2][a3][a4 + 1][a5] += f[a1][a2][a3][a4][a5];
if (a5 < n[5] && a4 > a5) f[a1][a2][a3][a4][a5 + 1] += f[a1][a2][a3][a4][a5];
}
cout << f[n[1]][n[2]][n[3]][n[4]][n[5]] << endl;
}
}
#include <bits/stdc++.h>
#define int long long
#define maxn 55
using namespace std;
const int mod = 1e8;
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); }
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
int n, m;
int a[maxn][maxn];
int f[maxn][maxn][maxn][maxn];
signed main() {
m = read(), n = read();
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
a[i][j] = read();
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= m; k++)
for (int l = 1; l <= n; l++) {
f[i][j][k][l] = max(f[i][j][k][l],
max(f[i - 1][j][k - 1][l],
max(f[i - 1][j][k][l - 1],
max(f[i][j - 1][k - 1][l],
f[i][j - 1][k][l - 1]))));
f[i][j][k][l] += a[i][j] + !(i == k && j == l) * a[k][l];
}
cout << f[m][n][m][n];
}
然后写了一个一百多行的DP,花了多半个小时写了依托答辩,最后还是ctj过掉…………
#include <bits/stdc++.h>
#define int long long
#define maxn 17
#define _f f[i][j][l][r][x][y]
#define _cl cl[i][j][l][r][x][y]
#define _cr cr[i][j][l][r][x][y]
#define _dx dx[i][j][l][r][x][y]
#define _dy dy[i][j][l][r][x][y]
using namespace std;
const int mod = 1e8;
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); }
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
int f[maxn][maxn * maxn][maxn][maxn][2][2];
int cl[maxn][maxn * maxn][maxn][maxn][2][2], cr[maxn][maxn * maxn][maxn][maxn][2][2];
int dx[maxn][maxn * maxn][maxn][maxn][2][2], dy[maxn][maxn * maxn][maxn][maxn][2][2];
void work(int i, int j, int l, int r, int x, int y, int w, int L, int R, int X, int Y) {
if (w < _f)
return;
_f = w;
_cl = L;
_cr = R;
_dx = X;
_dy = Y;
}
void print(int i, int j, int l, int r, int x, int y) {
if (!j)
return;
print(i - 1, j - (r - l + 1), _cl, _cr, _dx, _dy);
for (j = l; j <= r; j++)
printf("%d %d\n", i, j);
}
int n, m, K;
int a[maxn][maxn], b[maxn][maxn];
signed main() {
n = read(), m = read(), K = read();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
a[i][j] = read();
b[i][j] = b[i][j - 1] + a[i][j];
}
memset(f, 0xcf, sizeof(f));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= K; j++)
for (int l = 1; l <= m; l++)
for (int r = l; r <= m; r++) {
if (r - l + 1 > j)
break;
int w = b[i][r] - b[i][l - 1];
for (int x = 0; x < 2; x++)
for (int y = 0; y < 2; y++)
work(i, j, l, r, x, y, w, m, 0, x, y);
for (int p = l; p <= r; p++)
for (int q = p; q <= r; q++)
work(i, j, l, r, 1, 1, f[i - 1][j - (r - l + 1)][p][q][1][1] + w, p, q, 1, 1);
for (int p = 1; p <= l; p++)
for (int q = r; q <= m; q++)
for (int x = 0; x <= 1; x++)
for (int y = 0; y <= 1; y++)
work(i, j, l, r, 0, 0, f[i - 1][j - (r - l + 1)][p][q][x][y] + w, p, q, x, y);
for (int p = l; p <= r; p++)
for (int q = r; q <= m; q++)
for (int y = 0; y <= 1; y++)
work(i, j, l, r, 1, 0, f[i - 1][j - (r - l + 1)][p][q][1][y] + w, p, q, 1, y);
for (int p = 1; p <= l; p++)
for (int q = l; q <= r; q++)
for (int x = 0; x <= 1; x++)
work(i, j, l, r, 0, 1, f[i - 1][j - (r - l + 1)][p][q][x][1] + w, p, q, x, 1);
}
int ans = 0, ai, al, ar, ax, ay;
for (int i = 1; i <= n; i++)
for (int l = 1; l <= m; l++)
for (int r = l; r <= m; r++)
for (int x = 0; x <= 1; x++)
for (int y = 0; y <= 1; y++)
if (ans < f[i][K][l][r][x][y]) {
ans = f[i][K][l][r][x][y];
ai = i, al = l, ar = r, ax = x, ay = y;
}
printf("Oil : %d\n", ans);
print(ai, K, al, ar, ax, ay);
}
剩下一个小时摆烂!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫