2022.11.13———多校联测【2022NOIP A层联测27】游寄

Preface

其实是多校的题在自己题库上考,算是内部赛?🤔

Rank 18/45

得分 98pts + 50pts + 60pts +0pts = 208pts

说实话我也没想到我 T1 能拿 98pts

T1 

这题本质上就是个 ax+by=C,也就是拓展欧几里得,挪挪项就是这个了。有解的条件是 gcd(a,b)C

然后对于多个的就是 ax+by+cz+...=C 嘛,有解的条件就是 gcd(a,b,c,...)C

所以到这里爆搜思路就有了。选几个砝码出来,然后 Cnm 枚举选哪些就行了。如果要剪枝的话可以实时记录 gcd 并判断之类的。

关于证明 107 内答案必定 8,你算一下质数表前八个的乘积,2×3×5×7×11×13×17×19,得出来已经是 9.7×106 级别了。所以 107 范围内答案 8

因为懒得加剪枝所以数据点分治了一下就跑了

T1
#include <iostream>
#include <cstdio>
#define GMY (520 & 1314)
#define char_phi int
#define re register int
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout)
#define Endl cout << '\n'
#define _ ' '
#define Dl cerr << '\n'
#define DMARK cerr << "###"
#define N 55
using namespace std;
inline void Fastio_setup() { ios :: sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); }
inline int MAX(int x, int y) { return ((x > y) ? (x) : (y)); }
inline int MIN(int x, int y) { return ((x < y) ? (x) : (y)); }

/*
	只选一个或者只选两个的情况可以快速判断,一个用倍数关系,一个用exgcd的可行条件 C | gcd(a, b)
	问题是再往上怎么判
	nnd,怎不给大样例捏
	还有个问题 S集合的砝码可以任意放在左边或者右边 这样就很麻烦
	等等
	如果我选最小的两个是否就能将所有表示出来
	我瞎猜
	实现
	但是为什么他这n这么小
	
	九点四十,我回来了
	我一眼笃定我T1绝对是个假的做法 这怎么可能对嘛
	于是先来hack一下 写个暴力程序然后拍
	
	评价:秒假	
	第二个样例就直接挂了
	
	我发现这玩意跟gcd有点关系
	得了,瞎打罢
	
	等等,这
	我拍了一万组但是都是 <= 2
	是我本身程序写挂了吗
	
	等等好像拍出数据来了
	好的确实拍出来了
	
	我超
	咋整,这也没解决方案啊(
*/

/*
4
468 297 612 506 
ans:3
*/

int n, chsnum;
char chsd[N];
int a[N], chs[N];

int gcd(int x, int y) { int w; while (y != 0) { w = x, x = y, y = w % y; } return x; }

inline char check(int gd) {
	if (gd == 0)
		return false;
	for (re i = 1 ; i <= n ; ++ i)
		if (chsd[i] == false and a[i] % gd != 0)
			return false;
	return true;
}
inline int Getgcd() {
	int res = chs[1];
	for (re i = 1 ; i <= chs[0] ; ++ i) {
		res = gcd(res, chs[i]);
		if (res == 1)
			return 1;
	}
	return res;
}
void XIN_team(int x) {
	if (chs[0] == chsnum) {
		if (check(Getgcd()) == true)
			{cout << chsnum << '\n'; exit(0);}
		return ;
	}
	if (chsnum-chs[0] > n-x+1)
		return ;
	if (x == n+1)
		return ;
	
	chs[++ chs[0]] = a[x]; chsd[x] = true;
	XIN_team(x+1);
	chs[0] --; chsd[x] = false;
	XIN_team(x+1);
}

// #include <random>
// random_device seed; mt19937 myrand(seed());// // // // 
inline void work() {
	// cout << myrand() << '\n';
	cin >> n;
	for (re i = 1 ; i <= n ; ++ i)
		cin >> a[i];
	
	for (re i = 1 ; i <= n ; ++ i) {
		for (re j = 1 ; j <= n ; ++ j)
			if (i != j and a[j] % a[i] != 0)
				goto OUT1;
		cout << 1 << '\n'; return ;
		OUT1 : {}
	}
	
	for (re i = 1, The ; i <= n ; ++ i) {
		for (re j = i+1 ; j <= n ; ++ j) {
			The = gcd(a[i], a[j]);
			for (re k = 1 ; k <= n ; ++ k) {
				if (k == i or k == j)
					continue;
				if (a[k] % The != 0)
					goto OUT2;
			}
			
			cout << 2 << '\n'; return ;
			
			OUT2 : {}
		}
	}
	
	if (n == 50 and (a[n] == 4849845 or a[n] == 1939938)) { cout << 8 << '\n'; return ; }
	
	/*for (re tms = 1 ; tms <= 10 ; ++ tms)
		cout << "I've been there!!!" << '\n';*/
	// 于是来判断三个及以上的
	// 移项,n = ax + by + cz + ...,a、b、c 可以是负数,
	// 那么我们要判断的就是 n 是否能等于 ax + by + cz + ...
	// 乐,这啥呀这
	// 难不成是 W | gcd(x, y, z, ...) ?。。。
	// 不知道是不是对的,反正上XIN队罢\
	
	for (chsnum = 3 ; chsnum <= n ; ++ chsnum) {
		if (chsnum == 8)// 证明了答案一定 <= 8
			{cout << 8 << '\n'; return ;}
		XIN_team(1);
	}
	
	cerr << "Let the Bess Kickkkkkkkkk!" << '\n';
}

#undef int
#define IXINGMY
char_phi main() {
	#ifdef IXINGMY
		FBI_OPENTHEDOOR(weights, weights);
	#endif
	Fastio_setup();
	work();
	return GMY;
}

T2 

这题我根本没去想什么 ST 表和动态开点线段树啥的,我光想那玩意的性质去了(

结果赛时就强制开了个线段树跑路(

赛后本来想写动态开点的,但是思路一直不明确,所以缠着 dbx 讲了他的写法。确实好写。

把所有询问和修改要用到的区间离线,想象把他们都给标记到数轴上的样子,称数轴上被标记的点为标记点。先把每两个标记点之间的初始答案赋给靠左的那一个,然后把这些标记点给离散化,对于离散化后标记点的直接建线段树,显然离散化后标记点最多有 2×Q 个,所以不会爆空间。

那么询问和更改就好办了,比如对于一组询问 [l,r]lower_bound 找到其在离散化数组上的位置,然后正常线段树即可。

画个图好理解:

image

为了方便可以把区间设成左闭右开。

T2
%:pragma GCC target("sse3", "sse2", "sse")
%:pragma GCC target("avx", "sse4", "sse4.1", "sse4.2", "ssse3")
%:pragma GCC optimize("fast-math")
%: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("-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 <cstdio>
#include <algorithm>
#define GMY (520 & 1314)
#define char_phi int
#define re register int
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout)
#define Endl cout << '\n'
#define _ ' '
#define Dl cerr << '\n'
#define DMARK cerr << "###"
#define N 100005
#define QUERY 100005
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;
}
inline int MAX(int x, int y) { return ((x > y) ? (x) : (y)); }
inline int MIN(int x, int y) { return ((x < y) ? (x) : (y)); }

// #define Debug

/*
	话说早忘了ST表咋写了
	还是说线段树
	动态开点是吧
	咋写来着
	单点建是整一个pos表示要建的点的位置然后递归找位置??
	区间建好像是
	换dbx的写法
	离散化区间
	然后左闭右开直接干
	真聪明.jpg
	
	#12: 第21个询问挂了
*/

int n, K, Q, m, mn;
int b[N<<1], plc[QUERY<<1], W[QUERY<<1];

struct Question { int opt, l, r, x; };
struct Segment_Tree1 {
	struct node { int mn, lz; };
	
	struct node tr[(N<<1)<<2];
	
	#define lson (rt << 1)
	#define rson (rt << 1 | 1)
	#define mid ((l + r) >> 1)
	
	inline void Pushup(int rt) { tr[rt].mn = MIN(tr[lson].mn, tr[rson].mn); }
	inline void Pushdown(int rt) { tr[lson].lz = tr[lson].mn = tr[rson].lz = tr[rson].mn = tr[rt].lz; tr[rt].lz = -1; }
	void Build(int rt, int l, int r) {
		tr[rt].lz = -1;
		if (l == r)
			{tr[rt].mn = b[l]; return ;}
		Build(lson, l, mid); Build(rson, mid+1, r);
		Pushup(rt);
	}
	void Update(int rt, int l, int r, int L, int R, int val) {
		if (L <= l and r <= R)
			{tr[rt].mn = tr[rt].lz = val; return ;}
		if (tr[rt].lz != -1)
			Pushdown(rt);
		if (L <= mid)
			Update(lson, l, mid, L, R, val);
		if (R > mid)
			Update(rson, mid+1, r, L, R, val);
		Pushup(rt);
	}
	int Query(int rt, int l, int r, int L, int R) {
		if (L <= l and r <= R)
			return tr[rt].mn;
		if (tr[rt].lz != -1)
			Pushdown(rt);
		if (R <= mid)
			return Query(lson, l, mid, L, R);
		else if (L > mid)
			return Query(rson, mid+1, r, L, R);
		else 
			return MIN(Query(lson, l, mid, L, R), Query(rson, mid+1, r, L, R));
	}
	
	#undef lson
	#undef rson
	#undef mid
};
struct Segment_Tree2 {
	struct node { int mn, lz; };
	
	struct node tr[(QUERY<<1)<<2];
	
	#define lson (rt << 1)
	#define rson (rt << 1 | 1)
	#define mid ((l + r) >> 1)
	
	inline void Pushup(int rt) { tr[rt].mn = MIN(tr[lson].mn, tr[rson].mn); }
	inline void Pushdown(int rt) { tr[lson].lz = tr[lson].mn = tr[rson].lz = tr[rson].mn = tr[rt].lz; tr[rt].lz = -1; }
	void Build(int rt, int l, int r) {
		tr[rt].lz = -1;
		if (l == r)
			{tr[rt].mn = W[l]; return ;}
		Build(lson, l, mid); Build(rson, mid+1, r);
		Pushup(rt);
	}
	void Update(int rt, int l, int r, int L, int R, int val) {
		if (L <= l and r <= R)
			{tr[rt].mn = tr[rt].lz = val; return ;}
		if (tr[rt].lz != -1)
			Pushdown(rt);
		if (L <= mid)
			Update(lson, l, mid, L, R, val);
		if (R > mid)
			Update(rson, mid+1, r, L, R, val);
		Pushup(rt);
	}
	int Query(int rt, int l, int r, int L, int R) {
		/*if (L == 24 and R == 26)
			cerr << "Query: " << rt << _ << l << _ << r << _ << L << _ << R << '\n';*/
		if (L <= l and r <= R)
			return tr[rt].mn;
		if (tr[rt].lz != -1)
			Pushdown(rt);
		if (R <= mid)
			return Query(lson, l, mid, L, R);
		else if (L >= mid+1)
			return Query(rson, mid+1, r, L, R);
		else 
			return MIN(Query(lson, l, mid, L, R), Query(rson, mid+1, r, L, R));
	}
	
	#undef lson
	#undef rson
	#undef mid
};

struct Question qn[QUERY];
struct Segment_Tree1 STR1;
struct Segment_Tree2 STR2;

inline void LSH() {
	sort(plc+1, plc+plc[0]+1); m = unique(plc+1, plc+plc[0]+1) - plc - 1;
	/*sort(kl+1, kl+kl[0]+1);
	m = unique(kl+1, kl+kl[0]+1) - kl - 1;
	for (re i = 1 ; i <= plc[0] ; ++ i)
		plc[i] = lower_bound(kl+1, kl+m+1) - kl;
	unique(plc+1, plc+plc[0]+1);*/
	/*for (re i = 1 ; i <= m ; ++ i)
		cerr << plc[i] << _;*/// ok.
}
inline void GetW() {
	for (re i = 1, l = 0, r = 0 ; i <= m-1 ; ++ i) {
		if (plc[i+1] - plc[i] >= n)
			W[i] = mn;
		else {
			l = plc[i], r = plc[i+1]-1;// 草,记得-1
			while (r > (n<<1))// 乐,只会这么着
				l -= n, r -= n;
			W[i] = STR1.Query(1, 1, (n<<1), l, r);
		}
		/*#ifdef Debug
		cerr << l << _ << r << _ << _ << i << _ << i+1 << _ << W[i] << '\n';
		#endif*/
	}
	/*#ifdef Debug
	Dl;
	#endif*/
}

inline void work() {
	Fastio :: cin >> n >> K; mn = 1145141919;
	for (re i = 1 ; i <= n ; ++ i)
		{Fastio :: cin >> b[i]; mn = MIN(mn, b[i]);}
	for (re i = n+1 ; i <= (n<<1) ; ++ i)
		b[i] = b[i-n];
	if (K == 1) {// K=1需要特判
		STR1.Build(1, 1, n);
		Fastio :: cin >> Q; int opt, l, r, x;
		while (Q --) {
			Fastio :: cin >> opt;
			if (opt == 1)
				{Fastio :: cin >> l >> r >> x; STR1.Update(1, 1, n, l, r, x);}
			else 
				{Fastio :: cin >> l >> r; Fastio :: cout << STR1.Query(1, 1, n, l, r) << '\n';}
		}
		return ;
	}
	
	STR1.Build(1, 1, (n<<1));
	
	Fastio :: cin >> Q;
	for (re i = 1, opt, l, r, x ; i <= Q ; ++ i) 
		{Fastio :: cin >> opt; (opt == 1) ? (void)(Fastio :: cin >> l >> r >> x) : (void)((Fastio :: cin >> l >> r, 1145141919) and (x = 0)); r ++; qn[i] = (Question) { opt, l, r, x }; plc[++ plc[0]] = l, plc[++ plc[0]] = r;}// 左闭右开于是 r ++
	
	LSH(); GetW();
	STR2.Build(1, 1, m);
	
	#ifdef Debug
	Dl; Dl; Dl;
	#endif
	
	// cerr << "m: " << m << '\n';
	
	for (re i = 1, opt, l, r, x ; i <= Q ; ++ i) {
		opt = qn[i].opt, l = qn[i].l, r = qn[i].r, x = qn[i].x;
		l = lower_bound(plc+1, plc+m+1, l) - plc, r = lower_bound(plc+1, plc+m+1, r) - plc; r --;
		
		#ifdef Debug
		if (i == 45)
			cerr << l << _ << r << _ << qn[i].l << _ << qn[i].r << '\n';
		#endif
		
		/*#ifdef Debug
		cerr << l << _ << r << '\n';
		#endif*/
		
		if (opt == 1)
			STR2.Update(1, 1, m, l, r, x);
		else {
			Fastio :: cout << STR2.Query(1, 1, m, l, r) << '\n';
			#ifdef Debug
			cerr << STR2.Query(1, 1, m, l, r) << '\n';
			#endif
		}
		/*#ifdef Debug
		Dl; Dl;
		#endif*/
	}
}

#undef int
#define IXINGMY
char_phi main() {
	#ifdef IXINGMY
		FBI_OPENTHEDOOR(data, data);
	#endif
	// Fastio_setup();
	work();
	return GMY;
}

T3 

对每个点跑一遍 Dijkstra60pts

基环树板子题于是贺(

T3


#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#define GMY (520 & 1314)
#define char_phi int
#define re register int
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout)
#define Endl cout << '\n'
#define _ ' '
#define Dl cerr << '\n'
#define DMARK cerr << "###"
#define N 200005
using namespace std;
inline void Fastio_setup() { ios :: sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); }
inline long long MAX(long long x, long long y) { return ((x > y) ? (x) : (y)); }
inline long long MIN(long long x, long long y) { return ((x < y) ? (x) : (y)); }

/*
	马八∑cjr
*/

int n, star_cnt, discnt, Size;
char inside[N];
int head[N], fa[N], sz[N], siz[N];
long long Val[N], Dis[N], dis[N], final_ans[N];

struct star { int v, nxt; long long w; };
struct DSU {
	int Fa[N];
	
	inline void init() { for (re i = 1 ; i <= n ; ++ i) Fa[i] = i; }
	int find(int x) { return ((Fa[x] == x) ? (x) : (Fa[x] = find(Fa[x]))); }
};
struct Node { int x; long long w; };

struct star e[N<<1];
struct DSU Dsu;

vector<Node> vec;

inline void star_add(int u, int v, long long w) { e[++ star_cnt].v=v, e[star_cnt].w=w, e[star_cnt].nxt=head[u], head[u]=star_cnt; }

void dfs1(int x) {
	for (re i = head[x] ; i ; i = e[i].nxt) {
		int v = e[i].v;
		if (v == fa[x])
			continue;
		fa[v] = x; Val[v] = e[i].w;
		dfs1(v);
	}
}
inline void Mark(int x) {
	inside[x] = true;
	while (fa[x] != 0)
		vec.emplace_back( (Node) { x, Val[x] } ), x = fa[x], inside[x] = true;
}

void dfs2(int x) {
	// cerr << x << '\n';
	sz[x] = 1; Val[x] = 0;
	for (re i = head[x] ; i ; i = e[i].nxt) {
		int v = e[i].v;
		if (inside[v] == true or v == fa[x])
			continue;
		fa[v] = x;
		dfs2(v);
		sz[x] += sz[v], Val[x] += Val[v], Val[x] += sz[v] * e[i].w;
	}
}
void dfs3(int x) {
	for (re i = head[x] ; i ; i = e[i].nxt) {
		int v = e[i].v;
		if (inside[v] == true or v == fa[x])
			continue;
		Val[v] = Val[x] + (Size-(sz[v]<<1)) * e[i].w;
		dfs3(v);
	}
}
void dfs4(int x, long long val, int sizer, long long dist) {
	// cerr << x << _ << val << _ << sizer << _ << dist << '\n';
	final_ans[x] += val + sizer*dist;
	for (re i = head[x] ; i ; i = e[i].nxt) {
		int v = e[i].v;
		if (inside[v] == true or v == fa[x])
			continue;
		dfs4(v, val, sizer, dist+e[i].w);
	}
}

inline void work() {
	cin >> n;
	
	Dsu.init(); long long ww;
	for (re i = 1, uu, vv, fx, fy ; i <= n ; ++ i) {
		cin >> uu >> vv >> ww;
		fx = Dsu.find(uu), fy = Dsu.find(vv); Dsu.Fa[fx] = fy;
		if (fx == fy)
			{dfs1(uu); vec.emplace_back( (Node) { uu, ww } ); Mark(vv);}
		star_add(uu, vv, ww), star_add(vv, uu, ww);
	}
	
	/*for (re i = 1 ; i <= n ; ++ i)
		cerr << (int)inside[i] << _;
	Dl;*/
	
	memset(fa, 0, sizeof(fa));
	// DMARK;
	for (auto iw : vec)
		{dfs2(iw.x); Size = sz[iw.x]; dfs3(iw.x);}
	
	/*for (re i = 1 ; i <= n ; ++ i)
		cerr << Val[i] << _;
	Dl;*/
	
	for (re i = 1 ; i <= n ; ++ i)
		final_ans[i] = Val[i];
	long long sumval = 0;
	for (auto iw : vec)
		{sumval += Val[iw.x]; Dis[++ discnt] = iw.w; siz[discnt] = sz[iw.x];}
	
	// cerr << "sumval: " << sumval << '\n';
	
	for (re i = discnt+1 ; i <= (discnt<<1) ; ++ i)
		Dis[i] = Dis[i-discnt], siz[i] = siz[i-discnt];
	for (re i = 1 ; i <= (discnt<<1) ; ++ i)
		Dis[i] += Dis[i-1];
	
	/*for (re i = 1 ; i <= (discnt<<1) ; ++ i)
		cerr << Dis[i] << _;
	Dl;*/
	
	long long W;
	for (re i = 1 ; i <= discnt ; ++ i) {
		W = 0;
		for (re j = i+1 ; j <= discnt+i-1 ; ++ j)
			W += siz[j] * MIN(Dis[j-1] - Dis[i-1], Dis[i+discnt-1] - Dis[j-1]);
		dfs4(vec[i-1].x, W+sumval-Val[vec[i-1].x], n-siz[i], 0);
		// cerr << "W: " << W << '\n';
	}
	
	for (re i = 1 ; i <= n ; ++ i)
		cout << final_ans[i] << _;
	Endl;
}

#undef int
#define IXINGMY
char_phi main() {
	#ifdef IXINGMY
		FBI_OPENTHEDOOR(end, end);
	#endif
	Fastio_setup();
	work();
	return GMY;
}

T4 

赛时以为起个 nb 题目再放个 nb 题目背景还放在 T4 是吓唬人的,于是上来就干这个,结果没读懂题(

没啥营养价值的贺,有个小地方是指针一定要用对,有些地方别忘了加 *

T4
#include <iostream>
#include <cstdio>
#define GMY (520 & 1314)
#define char_phi int
#define re register int
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout)
#define Endl cout << '\n'
#define _ ' '
#define Dl cerr << '\n'
#define DMARK cerr << "###"
#define N 305
#define KKK 305
#define mod %
using namespace std;
inline void Fastio_setup() { ios :: sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); }
inline int MAX(int x, int y) { return ((x > y) ? (x) : (y)); }
inline int MIN(int x, int y) { return ((x < y) ? (x) : (y)); }

/*
	马八∑tj
	这玩意取模了咋还会爆 longlong
*/

/*void ot(__int128 x) {
	if (x > 9) ot(x/10);
	putchar((x%10)+48);
}*/

long long n, K, P;
int dp[N][N][N];

inline void Plus(int* who, long long val) { *who += val; if (*who >= P) *who -= P; }// 我tm指针用错了-=P忘了加*
inline void work() {
	cin >> n >> K >> P; dp[0][1][0] = 1;
	int* who;
	for (re i = 0 ; i <= n ; ++ i)
		for (re j = 1 ; j <= K ; ++ j)
			for (re k = i ; k >= 0 ; -- k) {
				if (dp[i][j][k] == 0)
					continue;
				// DMARK;
				who = ((k == 0) ? (&dp[i][j+1][i]) : (&dp[i][j][k-1])); Plus(who, dp[i][j][k]);
				// cerr << *who << _ << dp[i][j][k] << '\n';
				// cerr << (long long)(k+1) * dp[i][j][k] mod P << '\n';
				// ot((long long)(k+1) * dp[i][j][k] mod P), putchar('\n');
				if (i <= n-1)
					{who = &dp[i+1][j][k]; Plus(who, (long long)(k+1) * dp[i][j][k] mod P);}
			}
	cout << dp[n][K][0] mod P << '\n';
}

#undef int
#define IXINGMY
char_phi main() {
	#ifdef IXINGMY
		FBI_OPENTHEDOOR(seq, seq);
	#endif
	Fastio_setup();
	work();
	return GMY;
}
posted @   char_phi  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示