2022.9.25———HZOI【CSP-S模拟11】游寄

Preface

不知不觉又咕了两周捏。———某屑 char_phi2022.10.09 如是说

好的先看成绩。嗯,这次 dbx 拿了 Rank1 ,我截个图记录一下 /youl

image

然后 APJ 大佬来爆踩我们了(他刚开始打错比赛了还 A 了两道题,肽聚辣)

我?我蒻爆了 Rank30/34

赛时得分 46pts + 12pts + 24pts + 0pts = 82pts

T1:回文,T2:快速排序,T3:混乱邪恶,T4:校门外歪脖树上的鸽子

T1 

我上来直接冲 T1,直接爆冲一发记搜,很快啊!然后得到了 46pts 的高分。

然后我又看了看 xiangxiang 的提交记录。

image

image

?(缓缓打出一个问号

然后仔细看了一眼,发现我开的数组是四维的,但是实际上只需要记录三维就行了,然后直接寄。

好了不说记搜了 正解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 

一上来就发现他给了我一个快排代码。我谔谔。

一个念头在我心中闪过。

补全程序?

然而并不是的。但是我还是对着他的代码研究了半天,最终也没还原出来(

正解的话,这个题似乎是个规律题。

挂题解跑路

image

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;
}

T3 

简要题意就是给定你一个序列(都是正整数),你可以把其中任何一些数给改成他的相反数,然后让你构造一种这样的方案。

这个题正解我不会,但我会歪解。

首先显然我们应当凑出来这个序列总和的 12,这样和另一半相加最后才为零。

朴素的思路就是爆搜枚举选谁出来凑对吧。然后你就大胆这样写,加上各种卡常和优化。得分效果捏,我截一张提交记录的图来。

image

然后卡卡常。

image

然后我就开始爆搜了,显然是迅速获得 96pts,然后再也卡不过。所以我特判了一下跑不过的那个点,强制他前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 

经典歪脖树

我不会啊,毒瘤数据结构,咕了

哦对了按照题意模拟有 48pts

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;
}
posted @   char_phi  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示