NOI2022代码

本文提供了NOI2022竞赛两天的非官方标准代码实现,包括四个问题的C++源代码,涉及数据结构、算法优化等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里是liuzhangfeiabc的NOI2022代码。
包含两天t1、t2的非官方std代码(已在洛谷上提交通过)。
本来想在上一篇题解里放代码,但是这样文章就太长了,所以新开一篇文章放代码。
 
d1t1:

#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define li long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,li>
#define md int mid = l + r >> 1
#define ln ls[q],l,mid
#define rn rs[q],mid + 1,r
using namespace std;
inline li read(){
	li x = 0;
	int y = 0,c = gc;
	while(c < '0' || c > '9') y = c,c = gc;
	while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = gc;
	return y == '-' ? -x : x;
}
inline void prt(li x){
	if(x >= 10) prt(x / 10);
	pc(x % 10 + '0');
}
inline void print(li x){
	if(x < 0) pc('-'),x = -x;
	prt(x);
}
int n,q;
vector<int> a[500010];
inline pii operator + (pii x,pii y){
	if(x.fi == y.fi) return mp(x.fi,x.se + y.se);
	if(x.se > y.se) return mp(x.fi,x.se - y.se);
	return mp(y.fi,y.se - x.se);
}
int l[1000010],sl[1000010],fir[1000010],nw[1000010];
struct tree{
	int rt[1000010],ls[20000010],rs[20000010],cnt;
	pii mx[20000010];
	inline void ins(int &q,int l,int r,int x,int y){
		if(!q) q = ++cnt;
		if(l == r){
			mx[q] = mp(mx[q].fi + y,x);
			return;
		}
		md;
		if(mid >= x) ins(ln,x,y);
		else ins(rn,x,y);
		mx[q] = max(mx[ls[q]],mx[rs[q]]);
	}
	inline int mg(int p,int q,int l,int r){
		if(!p || !q) return p + q;
		if(l == r){
			mx[q].fi += mx[p].fi;
			return q;
		}
		md;
		ls[q] = mg(ls[p],ln);
		rs[q] = mg(rs[p],rn);
		mx[q] = max(mx[ls[q]],mx[rs[q]]);
		return q;
	}
	inline int cx(int q,int l,int r,int x){
		if(!q) return 0;
		if(l == r) return mx[q].fi;
		md;
		if(mid >= x) return cx(ln,x);
		return cx(rn,x);
	}
}t;
inline void ins(int x,int y){
	a[nw[x]].pb(y);
	t.ins(t.rt[x],1,n + q,y,1);
	++sl[x];
}
inline void del(int x){
	int &o = nw[x];
	while(!a[o].size() && o) o = l[o];
	if(!o){
		o = fir[x] = x;
		l[x] = 0;
		return;
	} 
	int y = a[o][a[o].size() - 1];
	a[o].pop_back();
	t.ins(t.rt[x],1,n + q,y,-1);
	--sl[x];
}
inline void mg(int x,int y,int w){
	nw[w] = nw[y];
	fir[w] = fir[x];
	l[fir[y]] = nw[x];
	t.rt[w] = t.mg(t.rt[x],t.rt[y],1,n + q);
	sl[w] = sl[x] + sl[y];
}
int qy[1000010],m;
inline pii fd(int x){
	pii nw = t.mx[t.rt[x]];
	if(!nw.fi || !nw.se) return mp(0,0);
	return mp(nw.se,max(sl[x] & 1,nw.fi * 2 - sl[x]));
}
inline int chk(){
	li a1 = 0,a2 = 0;
	int i;
	pii ans = mp(0,0);
	for(i = 1;i <= m;++i){
		a1 += sl[qy[i]];
		ans = ans + fd(qy[i]);
	}
	if(!ans.fi) return -1;
	for(i = 1;i <= m;++i) a2 += t.cx(t.rt[qy[i]],1,n + q,ans.fi);
	return a2 * 2 > a1 ? ans.fi : -1; 
}
int main(){
	int i,j,l,op,x,y,w;
	n = read();q = read();
	for(i = 1;i <= n + q;++i) nw[i] = fir[i] = i;
	for(i = 1;i <= n;++i){
		l = read();
		for(j = 1;j <= l;++j) ins(i,read());
	}
	for(i = 1;i <= q;++i){
		op = read();
		if(op == 1){
			x = read();y = read();
			ins(x,y);
		}
		else if(op == 2){
			x = read();
			del(x);
		}
		else if(op == 4){
			x = read();y = read();w = read();
			mg(x,y,w);
		}
		else{
			m = read();for(j = 1;j <= m;++j) qy[j] = read();
			print(chk());pc('\n');
		} 
	}
	return 0;
}

d1t2:

#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define li long long
using namespace std;
const int mo = 1000000007;
inline li read(){
	li x = 0;
	int y = 0,c = gc;
	while(c < '0' || c > '9') y = c,c = gc;
	while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = gc;
	return y == '-' ? -x : x;
}
inline void prt(li x){
	if(x >= 10) prt(x / 10);
	pc(x % 10 + '0');
}
inline void print(li x){
	if(x < 0) pc('-'),x = -x;
	prt(x);
}
int t,n,k,l[1010],r[1010];
li dy[1000010]; 
int to[1000010][10],tot;
unordered_map<li,int> ff;
li f[2][1000010];
inline int getzy(li i){
	if(ff.find(i) != ff.end()) return ff[i];
	int x = ++tot;ff[i] = x;dy[x] = i;
	int j,g,h,p,q;
	for(j = 0;j <= 7;++j){
		li zy = 0;
		for(g = 0;g <= 2;++g) for(h = 0;h <= 2;++h){
			if(g == 2 && h == 2) continue;
			int nw = (i >> (g * 3 + h) * 7) & 127;
			if(!nw) continue;
			--nw;
			for(p = 0;p <= 2;++p){
				for(q = g;q <= 2 && q <= g + h;++q){
					if(p == 2 && q == 2) continue;
					int o = (p * 3 + q) * 7;
					li pre = (zy >> o) & 127;
					int pr = (pre + 127) % 128; 
					pr = min(pr,101);
					int sl = g + h + p;
					int nxt = nw + max(0,sl - j) + (sl == j - 1);
					if(nxt < pr) (zy ^= pre << o) ^= (nxt + 1ll) << o;
				}
			}
		}
		to[x][j] = getzy(zy);
	}
	return x;
}
int main(){
	int i,j,g,h;
	getzy(1);
	t = read();
	while(t--){
		memset(f,0,sizeof(f));
		n = read();k = read();
		for(i = 1;i <= n;++i) l[i] = read(),r[i] = read();
		f[0][1] = 1;
		for(i = 1;i <= n;++i){
			int ql = l[i],qr = r[i];
			bool o = i & 1; 
			memset(f[o],0,tot * 8 + 8);
			for(j = 1;j <= tot;++j) if(f[o ^ 1][j]){
				li val = f[o ^ 1][j] % mo;
				for(g = min(ql,7);g <= 7 && g <= qr;++g){
					h = to[j][g];
					if(g == 7) f[o][h] += val * (qr - max(ql,7) + 1) % mo;
					else f[o][h] += val;
				}
			}
		}
		li as = 0;
		for(i = 1;i <= tot;++i) if((dy[i] & 127) && (dy[i] & 127) - 1 <= k) as += f[n & 1][i] % mo;
		if(k == 1){
			int fg1 = 1,fg2 = (n == 3);
			for(i = 1;i <= n;++i){
				if(l[i]) fg1 = 0;
				if(l[i] > 1 || r[i] < 1) fg2 = 0;
			} 
			as -= fg1 + fg2;
		}
		print((as + mo) % mo);pc('\n');
	}
	return 0;
}

d2t1:

#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define li long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<li,li>
using namespace std;
inline li read(){
	li x = 0;
	int y = 0,c = gc;
	while(c < '0' || c > '9') y = c,c = gc;
	while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = gc;
	return y == '-' ? -x : x;
}
inline void prt(li x){
	if(x >= 10) prt(x / 10);
	pc(x % 10 + '0');
}
inline void print(li x){
	if(x < 0) pc('-'),x = -x;
	prt(x);
}
int t,k,cnt;
const int mo1 = 998244853,mo2 = 1004353809,ds = 19491001;
unordered_map<li,int> hsb;
int ft1,ft2,ft3;
pii st1[100010],st2[100010],st3[100010];
struct tree{
	int n,rt,fa[100010],fsts[100010],nxt[100010],sz[100010],ez[100010];
	int zl[100010];
	inline void dfs(int q){
		sz[q] = 1;
		for(int i = fsts[q];i;i = nxt[i]){
			dfs(i);
			sz[q] += sz[i];++ez[q];
		} 
		ft3 = 0;for(int i = fsts[q];i;i = nxt[i]) st3[++ft3] = mp(zl[i],i);
		sort(st3 + 1,st3 + ft3 + 1);
		fsts[q] = 0;
		for(int i = ft3;i;--i) nxt[st3[i].se] = fsts[q],fsts[q] = st3[i].se;
		li hs1 = 0,hs2 = 0;
		for(int i = 1;i <= ft3;++i){
			hs1 = (hs1 * ds + st3[i].fi) % mo1;
			hs2 = (hs2 * ds + st3[i].fi) % mo2;
		} 
		li hs = hs1 * mo2 + hs2;
		if(hsb.find(hs) == hsb.end()) hsb[hs] = ++cnt;
		zl[q] = hsb[hs];
	}
	inline void init(){
		memset(fa,0,n * 4 + 16);memset(fsts,0,n * 4 + 16);
		memset(nxt,0,n * 4 + 16);memset(sz,0,n * 4 + 16);
		memset(ez,0,n * 4 + 16);memset(zl,0,n * 4 + 16);
		n = read();
		rt = 0;
		for(int i = 1;i <= n;++i){
			if(i == 1) fa[i] = -1;
			else fa[i] = i >> 1;
			fa[i] = read();
			if(fa[i] == -1) rt = i;
			else nxt[i] = fsts[fa[i]],fsts[fa[i]] = i;
		}
		dfs(rt);
	}
}t1,t2;
bool vis1[100010],vis2[100010];
int wei[50];
inline bool ck(vector<int> biao){
	int m = biao.size();
	for(int i = 0;i < (1 << m);++i){
		int o = 0;
		for(int j = 0;j < m;++j) if(i & (1 << j)) o |= biao[j];
		if(wei[i] > wei[o]) return 0;
	}
	return 1;
}
inline bool chk(int p1,int p2,int k){
	if(!p1) return !p2;
	if(!p2) return t1.sz[p1] <= k; 
	if(t1.sz[p1] < t2.sz[p2] || t1.sz[p1] > t2.sz[p2] + k || t1.ez[p1] < t2.ez[p2]) return 0;
	if(t1.zl[p1] == t2.zl[p2]) return 1;
	if(!k) return 0;
	ft1 = ft2 = 0;
	for(int i = t1.fsts[p1];i;i = t1.nxt[i]) st1[++ft1] = mp(t1.zl[i],i),vis1[ft1] = 0;
	for(int i = t2.fsts[p2];i;i = t2.nxt[i]) st2[++ft2] = mp(t2.zl[i],i),vis2[ft2] = 0;
	int i = 1,j = 1,tot = 0;
	while(i <= ft1){
		while(j <= ft2 && st1[i].fi > st2[j].fi) ++j;
		if(j <= ft2 && st1[i].fi == st2[j].fi) ++tot,vis1[i++] = 1,vis2[j++] = 1;
		else ++i;
	}
	if(tot == ft1) return 1;
	int mm = ft1 - tot;
	if(mm > k) return 0;
	vector<int> q1,q2,q3;q1.clear();q2.clear();q3.clear();
	for(i = 1;i <= ft1;++i) if(!vis1[i]) q1.pb(st1[i].se);
	for(i = 1;i <= ft2;++i) if(!vis2[i]) q2.pb(st2[i].se);
	while(q2.size() < mm) q2.pb(0);
	q3.resize(mm);
	for(i = 0;i < mm;++i)
		for(j = 0;j < mm;++j) 
			if(chk(q1[i],q2[j],k - mm + 1)) q3[i] |= 1 << j;
	return ck(q3);
}
int main(){
	int i,j;
	for(i = 1;i < 32;++i) wei[i] = wei[i >> 1] + (i & 1);
	read();t = read();k = read();
	while(t--){
		hsb.clear();cnt = 0;
		t1.init();t2.init();
		puts(chk(t1.rt,t2.rt,k) ? "Yes" : "No");
	}
	return 0;
}

d2d2:

#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define li long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define md int mid = l + r >> 1
#define ls q << 1
#define rs q << 1 | 1
#define ln ls,l,mid
#define rn rs,mid + 1,r
using namespace std;
inline li read(){
	li x = 0;
	int y = 0,c = gc;
	while(c < '0' || c > '9') y = c,c = gc;
	while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = gc;
	return y == '-' ? -x : x;
}
inline void prt(li x){
	if(x >= 10) prt(x / 10);
	pc(x % 10 + '0');
}
inline void print(li x){
	if(x < 0) pc('-'),x = -x;
	prt(x);
}
int T,n,m,cnt;
struct node{
	int l,r,q,v;
}a[1000010];
inline bool operator < (node q,node w){
	if(q.v != w.v) return q.v < w.v;
	if(q.q != w.q) return q.q < w.q;
	if(q.l != w.l) return q.l < w.l;
	return q.r < w.r;
}
pii t[4000010];
int c[4000010];
inline void init(int q,int l,int r){
	c[q] = 0;
	if(l == r){
		t[q] = mp(1,l);
		return;
	}
	md;
	init(ln);init(rn);
	t[q] = min(t[ls],t[rs]);
}
inline void ud(int q,int l,int r,int x){
	if(!x) return;
	t[q].fi = x;t[q].se = l;
	c[q] = x;
}
inline void ps(int q,int l,int r){
	md;
	ud(ln,c[q]);ud(rn,c[q]);
	c[q] = 0;
}
inline void xg(int q,int l,int r,int al,int ar,int x){
	if(al > ar) return;
	if(l >= al && r <= ar){
		ud(q,l,r,x);
		return;
	}
	ps(q,l,r);md;
	if(mid >= al) xg(ln,al,ar,x);
	if(mid < ar) xg(rn,al,ar,x);
	t[q] = min(t[ls],t[rs]);
}
inline pii cx(int q,int l,int r,int al,int ar){
	if(al > ar) return mp(-1,-1);
	if(l >= al && r <= ar) return t[q];
	ps(q,l,r);md;
	if(mid < al) return cx(rn,al,ar);
	if(mid >= ar) return cx(ln,al,ar);
	return min(cx(ln,al,ar),cx(rn,al,ar));
}
int as[1000010];
inline void dfs(int q,int l,int r){
	if(l == r){
		as[l] = t[q].fi;
		t[q] = mp(0,l);c[q] = 0;
		return;
	}
	ps(q,l,r);t[q] = mp(0,l);c[q] = 0;
	md;dfs(ln);dfs(rn);
}
inline pii operator + (pii q,pii w){
	return q.fi < w.fi ? q : w;
}
inline void ps2(int q){
	t[ls].fi += c[q];c[ls] += c[q];
	t[rs].fi += c[q];c[rs] += c[q];
	c[q] = 0;
}
inline void xg2(int q,int l,int r,int al,int ar,int x){
	if(al > ar) return;
	if(l >= al && r <= ar){
		t[q].fi += x;c[q] += x;
		return;
	}
	ps2(q);md;
	if(mid >= al) xg2(ln,al,ar,x);
	if(mid < ar) xg2(rn,al,ar,x);
	t[q] = t[ls] + t[rs];
}
inline pii cx2(int q,int l,int r,int al,int ar){
	if(al > ar) return mp(-1,-1);
	if(l >= al && r <= ar) return t[q];
	ps2(q);md;
	if(mid < al) return cx2(rn,al,ar);
	if(mid >= ar) return cx2(ln,al,ar);
	return cx2(ln,al,ar) + cx2(rn,al,ar);
}
int p[1000010];
inline void xg(int q){
	for(int i = q;i <= n;i += i & -i) ++p[i];
}
inline int cx(int q){
	int as = 0;
	for(int i = q;i;i -= i & -i) as += p[i];
	return as; 
}
inline li chk(){
	li ans = 0;
	memset(p,0,n * 4 + 8);
	for(int i = 1;i <= n;++i){
		ans += i - 1 - cx(as[i]);
		xg(as[i]);
	}
	return ans;
}
vector<node> b[1000010];
int mn[1000010];
int main(){
	int i,j;
	T = read();
	while(T--){
		n = read();m = read();
		for(i = 1;i <= m;++i){
			a[i].l = read();a[i].r = read();a[i].v = read();a[i].q = 0;
		}
		sort(a + 1,a + m + 1);
		int lst = -1;cnt = 0;
		for(i = 1;i <= m;++i){
			if(a[i].v != lst) ++cnt;
			lst = a[i].v;a[i].v = cnt;
		}
		init(1,1,n);
		for(i = 1;i <= m;++i) xg(1,1,n,a[i].l,a[i].r,a[i].v);
		bool fg = 0;
		for(i = 1;i <= m;++i){
			pii o = cx(1,1,n,a[i].l,a[i].r);
			if(o.fi != a[i].v){
				fg = 1;break;
			}
			a[i].q = o.se;
		}
		if(fg){
			puts("-1");
			continue;
		}
		dfs(1,1,n);
		for(i = 1;i <= n;++i) b[i].clear();
		for(i = 1;i <= m;++i) b[a[i].r].pb(a[i]);
		for(i = 1;i <= cnt;++i) mn[i] = 0;
		for(i = 1;i <= n;++i) xg2(1,1,n,1,as[i] - 1,1);
		for(i = n;i;--i){
			xg2(1,1,n,1,as[i] - 1,-1);
			for(j = 0;j < b[i].size();++j) mn[b[i][j].v] = max(mn[b[i][j].v],b[i][j].q);
			int o = as[i];
			if(i != mn[as[i]]) as[i] = cx2(1,1,n,as[i],n).se;
			if(as[i] == o) mn[as[i]] = 0; 
			xg2(1,1,n,as[i] + 1,n,1);
		}
		print(chk());pc('\n');
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值