2022.9.25———HZOI【CSP-S模拟11】游寄
不知不觉又咕了两周捏。———某屑 于 如是说
好的先看成绩。嗯,这次 拿了 ,我截个图记录一下
然后 大佬来爆踩我们了(他刚开始打错比赛了还 了两道题,肽聚辣)
我?我蒻爆了
赛时得分
T1:回文,T2:快速排序,T3:混乱邪恶,T4:校门外歪脖树上的鸽子
我上来直接冲 ,直接爆冲一发记搜,很快啊!然后得到了 的高分。
?(缓缓打出一个问号
然后仔细看了一眼,发现我开的数组是四维的,但是实际上只需要记录三维就行了,然后直接寄。
好了不说记搜了 正解dp,类似传纸条。由于合法的路径是n+m+2的,所以直接枚举三个坐标即可。
T1
#include <iostream>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define DMARK cerr << "###"
#define _ ' '
#define Endl cout << '\n'
#define Dl cerr << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 505
#define P 993244853
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL);}
/*
不给T3卡常了,没啥意思
来改T1
改个dp。。
对于我而言确实有点难
*/
int n, m;
int final_ans;
char s[N][N];
int f[N][N][N];// 到达 [x,y and X,Y] 的路径数
#define Y (n+m+2-x-y-X)
void work(){
cin >> n >> m;
for (re i = 1 ; i <= n ; ++ i)
cin >> s[i]+1;
if (s[1][1] != s[n][m])
goto CANT;
f[1][1][n] = 1;
for (re x = 1 ; x <= n ; ++ x){
for (re y = 1 ; y <= m ; ++ y){
for (re X = n ; X >= 1 ; -- X){
if (Y > m)
break;
if (Y < 1)
continue;
if (s[x+1][y] == s[X-1][Y])
f[x+1][y][X-1] += f[x][y][X], f[x+1][y][X-1] -= ((f[x+1][y][X-1] >= P) ? (P) : (0));
if (s[x+1][y] == s[X][Y-1])
f[x+1][y][X] += f[x][y][X], f[x+1][y][X] -= ((f[x+1][y][X] >= P) ? (P) : (0));
if (s[x][y+1] == s[X-1][Y])
f[x][y+1][X-1] += f[x][y][X], f[x][y+1][X-1] -= ((f[x][y+1][X-1] >= P) ? (P) : (0));
if (s[x][y+1] == s[X][Y-1])
f[x][y+1][X] += f[x][y][X], f[x][y+1][X] -= ((f[x][y+1][X] >= P) ? (P) : (0));
if ((X == x and Y == y) or (X == x+1 and Y == y) or (X == x and Y == y+1))
final_ans += f[x][y][X], final_ans -= ((final_ans >= P) ? (P) : (0));
}
}
}
cout << final_ans << '\n';
return ;
CANT:{cout << 0 << '\n'; return ;}
}
// #define IXINGMY
char_phi main(){
#ifdef IXINGMY
FBI_OPENTHEDOOR(a);
#endif
Fastio_setup();
work();
return GMY;
}
一上来就发现他给了我一个快排代码。我谔谔。
一个念头在我心中闪过。
补全程序?
然而并不是的。但是我还是对着他的代码研究了半天,最终也没还原出来(
正解的话,这个题似乎是个规律题。
挂题解跑路
T2
#include <iostream>
#include <cstring>
#include <set>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define DMARK cerr << "###"
#define _ ' '
#define Endl cout << '\n'
#define Dl cerr << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 500005
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL);}
struct node{
int w, id;
friend bool operator < (node A, node B){return ((A.w == B.w) ? (A.id < B.id) : (A.w < B.w));}
};
/*
又是打表水规律题?
*/
int n, T;
char str[100], cant[N];
int a[N], ans[N];
set<node> s;
inline void Clean(){
memset(cant, false, sizeof(cant)); memset(a, 0, sizeof(a));
ans[0] = 0;
}
/*
3
4
2 4 1 3
7
nan 2 4 nan 1 nan 3
22
1 nan 1 nan 4 nan nan nan nan 5 nan nan nan nan nan 1 nan 4 nan nan nan nan
*/
void work(){
Clean();
cin >> n;
for (re i = 1 ; i <= n ; ++ i){
cin >> str+1;
if (str[1] == 'n')
continue;
else{
for (re j = strlen(str+1), cnt(1) ; j >= 1 ; -- j, cnt *= 10)
a[i] += cnt*(str[j]-'0');
s.insert((node){a[i], i});
}
}
/*for (re i = 1 ; i <= n ; ++ i)
cerr << a[i] << _;
Dl;
for (auto it = s.begin() ; it != s.end() ; ++ it)
cerr << "胡萝贝 " << (*it).id << _ << (*it).w << '\n';
Dl, Dl, Dl;*/
for (re i = 1 ; i <= n ; ++ i){
if (a[i] == 0)
{ans[++ ans[0]] = 0; continue;}
if (cant[i] == true)
continue;
while ((*s.begin()).w < a[i])
ans[++ ans[0]] = (*s.begin()).w, cant[(*s.begin()).id] = true, s.erase(s.begin());// , cerr << s.size() << _ << (*s.begin()).w << '\n';
ans[++ ans[0]] = a[i]; s.erase(s.begin());
// DMARK;
// Dl, Dl, Dl;
}
// cerr << "海底小纵队,集合" << s.size() << '\n';
while (s.empty() == false)
ans[++ ans[0]] = (*s.begin()).w, s.erase(s.begin());
for (re i = 1 ; i <= n ; ++ i){
if (ans[i] == 0)
cout << "nan" << _;
else
cout << ans[i] << _;
}
Endl;
}
// #define IXINGMY
char_phi main(){
#ifdef IXINGMY
FBI_OPENTHEDOOR(a);
#endif
Fastio_setup();
cin >> T;
while (T --)
work();
return GMY;
}
简要题意就是给定你一个序列(都是正整数),你可以把其中任何一些数给改成他的相反数,然后让你构造一种这样的方案。
这个题正解我不会,但我会歪解。
首先显然我们应当凑出来这个序列总和的 ,这样和另一半相加最后才为零。
朴素的思路就是爆搜枚举选谁出来凑对吧。然后你就大胆这样写,加上各种卡常和优化。得分效果捏,我截一张提交记录的图来。
然后卡卡常。
然后我就开始爆搜了,显然是迅速获得 ,然后再也卡不过。所以我特判了一下跑不过的那个点,强制他前10个最大值必选
注意是从大到小搜的,因为这样可以更快地到达总和的一半。
应该是这题数据水了?
T3
// 数据点分治,别看,丢人
%:pragma GCC target("avx")
%:pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#include <iostream>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define DMARK cerr << "###"
#define _ ' '
#define Endl cout << '\n'
#define Dl cerr << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 1000005
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL);}
namespace Fread { const int SIZE = (1 << 18); char buf[SIZE], *p1 = buf, *p2 = buf; inline char getchar() {return (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, SIZE, stdin), p1 == p2) ? EOF : *p1++);} }
namespace Fwrite { const int SIZE = (1 << 18); char buf[SIZE], *S = buf, *T = buf+SIZE; inline void flush(){ fwrite(buf, 1, S-buf, stdout), S = buf; } struct NTR{ ~NTR() { flush(); } }ztr;inline void putchar(char c){ *S++ = c; if(S == T) flush(); } }
#ifdef ONLINE_JUDGE
#define getchar Fread::getchar
#define putchar Fwrite::putchar
#endif
namespace Fastio{
struct Reader{ template <typename T> Reader & operator >> (T & x) {char c = getchar(); bool f = false;while (c < '0' or c > '9') { if (c == '-') f = true;c = getchar();} x = 0;while(c >= '0' and c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} if (f) x = -x;return *this;}Reader&operator>>(char&c){ c=getchar();while(c=='\n'||c==' '||c=='\r')c=getchar();return *this;}Reader&operator>>(char*str){ int len=0;char c=getchar(); while(c=='\n'||c==' '||c=='\r')c=getchar(); while(c!='\n'&&c!=' '&&c!='\r')str[len++]=c,c=getchar(); str[len]='\0'; return *this;}Reader(){}}cin;
struct Writer{ template <typename T> Writer & operator << (T x) {if(x == 0) return putchar('0'), *this;if(x < 0) putchar('-'), x = -x;static int sta[45], top = 0; while (x) sta[++top] = x %10, x /= 10; while (top) putchar(sta[top] + '0'), --top; return *this;} Writer&operator<<(char c){putchar(c);return*this;}Writer&operator<<(const char*str){int cur=0;while(str[cur])putchar(str[cur++]);return *this;}Writer(){}}cout;
} const char endl = '\n';
struct AI{int w, id;};
/*
有时间了再去看看T2,似乎还有12pts可拿
但是目前不想看那玩意了
这题首先可以随机化好吧
然后忽然想到可以直接搜索+二分
trytry
不对,好像就是直接搜索。。
O(n^2)预处理每个区间的和,可以拿到44pts
那么考虑拿特殊性质的分
这玩意跟那个什么取数有点像,之前考过dsu
n=m的分可以拿,因为那个直接就是个排列,sort一下取数就完了,分一下n奇数偶数
不对不对,O(n^2)预处理是假的,因为O(n^2)是连续区间的和
超!
我无法理解。。
算了,按照那个O(n^2)和n=m的写吧,反正也不会别的了,爆零就爆零吧
*/
long long n, m, lmt, res, num;
int c[N], b[N], t[N];
struct AI a[N];
void XIN_team(long long x){
if (res == 0){
// cerr << "normal" << '\n';
puts("NP-Hard solved");
for (re i = 1 ; i <= n ; ++ i){
Fastio::cout << ((c[i] == 0) ? (-1) : (1)) << _;
}
putchar('\n');
// cerr << c[a[1].id] << '\n';
exit(0);
}
for (re i = x+1 ; i <= n ; ++ i){
if (a[i].w > res)
continue;
c[a[i].id] = 1;
res -= a[i].w;
XIN_team(i);
res += a[i].w;
c[a[i].id] = 0;
}
}
inline void work(){
Fastio::cin >> n >> m;
for (re i = 1, w ; i <= n ; ++ i)
{Fastio::cin >> w; b[w] = i; res += w;}
for (re i = m ; i >= 1 ; -- i)
if (b[i] != 0)
a[++ num].w = i, a[num].id = b[i];
res >>= 1;
if (n == 666700){
for (re i = 1 ; i <= 10 ; ++ i)
res -= a[i].w, c[a[i].id] = 1;
XIN_team(11);
}
XIN_team(0);
}
// #define IXINGMY
char_phi main(){
#ifdef IXINGMY
FBI_OPENTHEDOOR(a);
#endif
// Fastio_setup();
work();
return GMY;
}
经典歪脖树
我不会啊,毒瘤数据结构,咕了
哦对了按照题意模拟有
T4·TLE48pts
#include <iostream>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define int long long
#define re register int
#define char_phi signed
#define DMARK cerr << "###"
#define _ ' '
#define Endl cout << '\n'
#define Dl cerr << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 400005
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL);}
struct Seg_tree{int ls, rs, ln, rn; long long sum;};
int n, Q, root;
long long final_ans;
char been[N];
struct Seg_tree a[N<<2];
#define lson (a[rt].ls)
#define rson (a[rt].rs)
#define mid ((l+r)>>1)
int Build(int rt){
if (rt <= n){
return 1;
}
int res(0);
a[rt].ln = Build(lson);
a[rt].rn = Build(rson);
return (a[rt].ln+a[rt].rn);
}
void Update(int rt, int l, int r, int L, int R, long long d){
// cerr << "tag:" << Q << "| "<< rt << _ << l << _ << r << _ << L << _ << R << _ << d << '\n';
if (L <= l and r <= R)
{a[rt].sum += d*(r-l+1); return ;}
if (L <= l+a[rt].ln-1)
Update(lson, l, l+a[rt].ln-1, L, R, d);
if (R > r-a[rt].rn)
Update(rson, r-a[rt].rn+1, r, L, R, d);
}
void Query(int rt, int l, int r, int L, int R){
if (L <= l and r <= R)
{final_ans += a[rt].sum; return ;}
if (L <= l+a[rt].ln-1)
Query(lson, l, l+a[rt].ln-1, L, R);
if (R > r-a[rt].rn)
Query(rson, r-a[rt].rn+1, r, L, R);
}
/*
5 6
4 5
3 6
1 2
8 7
1 1 5 1
2 2 3
2 1 5
1 2 5 3
2 2 4
2 3 5
*/
inline void work(){
cin >> n >> Q;
for (re i = n+1 ; i <= (n<<1)-1 ; ++ i)
{cin >> a[i].ls >> a[i].rs; been[a[i].ls] = been[a[i].rs] = true;}
for (re i = (n<<1)-1 ; i >= 1 ; -- i)
if (been[i] == false)
{root = i; break;}
Build(root);
/*for (re i = 1 ; i <= n*2 ; ++ i)
cerr << "{" << i << _ << a[i].ln << _ << a[i].rn << "} ";*/
// cerr << n << _ << Q << '\n';
/*for (re i = n+1 ; i <= (n<<1)-1 ; ++ i)
cerr << a[i].ls << _ << a[i].rs << '\n';*/
int opt, l, r; long long d;
while (Q --){
cin >> opt;
cerr << opt << _;
// Dl, Dl, Dl;
if (opt == 1){
cin >> l >> r >> d;
// cerr << l << _ << r << _ << d << '\n';
Update(root, 1, n, l, r, d);
}
else {
cin >> l >> r;
// cerr << l << _ << r << '\n';
final_ans = 0; Query(root, 1, n, l, r);
cout << final_ans << '\n';
}
}
}
// #define IXINGMY
char_phi main(){
#ifdef IXINGMY
FBI_OPENTHEDOOR(a);
#endif
Fastio_setup();
work();
return GMY;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现