知识 信息 爱恨 怒喜 融合为 由记忆 组成的新生命体

test17

品茶大会tea

\(i\) 会被 \(i,\dots\) 品尝,一段喝满,可能有一个人只能喝完剩下的,前缀和然后二分这个段,差分上标记,前缀和还原贡献即可。

#include<bits/stdc++.h>
#define int long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)
#define pb push_back

using namespace std;

const int N=200005; 

int T, n, a[N], b[N], L[N], R[N];

void mian() {
	memset(L,0,sizeof(L));
	memset(R,0,sizeof(R));
	cin >> n;
	up(i,1,n) cin >> a[i];
	up(i,1,n) cin >> b[i];
	up(i,2,n) b[i]+=b[i-1];
	up(i,1,n) {
		int j=upper_bound(b+1,b+1+n,a[i]+b[i-1])-b-1;
		L[i]+=1, L[j+1]-=1, R[j+1]+=a[i]-b[j]+b[i-1];
	}
	up(i,1,n) L[i]+=L[i-1], cout << L[i]*(b[i]-b[i-1])+R[i] << ' ';
	cout << '\n';
}

signed main() {
	freopen("tea.in","r",stdin); 
	freopen("tea.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> T;
	while(T--) mian();
	return 0;
}

水滴Drop

首先最后一个有水的肯定只能是题目钦定唯一终点。答案大到需要取模,我们不妨考虑计算终点流进过的总水量和空闲次数。流进总水量是直接拓扑排序往后面加就可以了,注意到初始状态的一个 \(a_i\)\(a_T\) 的贡献连续(放这里是能上就上马上就上的意思),且至多 \(m\) 时刻开始贡献,不妨暴力扫前 \(m\) 轮来做空隙/提前结束的情况 qwq

#include<bits/stdc++.h>
#define int long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)
#define pb push_back 

using namespace std;

const int N=5005, P=998244353;

int T, n, m, a[N], sum[N], in[N], p[N], tag[N], Ans, ran, tot;
vector<int> to[N];
queue<int> q;

void mian() {
	memset(in,0,sizeof(in));
	cin >> n >> m, tot=Ans=0;
	up(i,1,n) to[i].clear();
	up(i,1,n) cin >> a[i], sum[i]=a[i];
	up(i,1,m) {
		int u, v;
		cin >> u >> v;
		to[u].pb(v), ++in[v];
	}
	up(i,1,n) if(!in[i]) q.push(i);
	up(i,1,n) if(!to[i].size()) ran=i;
	
	
	up(i,1,n) sum[i]=a[i];
	while(q.size()) {
		int x=q.front(); q.pop(), p[++tot]=x;
		for(int y:to[x]) {
			(sum[y]+=sum[x])%=P;
			if(!--in[y]) q.push(y);
		}
	}
	
//	cout << "hate " << ran << ' ' << sum[ran] << '\n';
	
	up(u,1,m) {
		
		Ans+=(!a[ran]); 
		
		dn(o,n,1) {
			int i=p[o];
			if(!a[i]) continue;
			--a[i];
			for(int j:to[i]) ++a[j];
		}
		
//		cout << "Round " << u << '\n';
//		up(i,1,n) cout << a[i] << ' '; cout << '\n';
		
		bool flag=1;
		up(i,1,n) if(a[i]) flag=0;
		if(flag) { cout << u << '\n'; return; }
		
	}
	cout << (sum[ran]+Ans)%P << '\n';
}

signed main() {
//	freopen("1.txt","r",stdin);
	freopen("drop.in","r",stdin);
	freopen("drop.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> T;
	while(T--) mian();
	return 0;
}

构造体constant

做过。

首先不难发现,我们要构造最小表示最大,我们求这个最小表示最大(

考虑三个字符串 \(s_1\leq s_2\leq s_3\),那么肯定要放成 \(s_1s_3s_2\)(逃。

然后如果有一个 \(s_3\leq s_4\)\(s_4\) 直接接在 \(s_1\) 后面即可,然后可以归纳 qwq

开一个 multiset,考虑每次取出最小最大的进行合并,最后即为答案。

#define _CRT_SECURE_NO_WARNINGS
#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<bits/stdc++.h>
#define int long long
#define ldb long double
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)
#define mp m
#define pb push_back

using namespace std;

const int N=100005;

int T, x, y, z;
multiset<string> qwq;

signed main() {
	freopen("construct.in","r",stdin); 
	freopen("construct.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> T;
	while(T--) {
		qwq.clear();
		cin >> x >> y >> z;
		while(x--) qwq.insert("a");
		while(y--) qwq.insert("b");
		while(z--) qwq.insert("c");
		while(qwq.size()>1) {
			auto L=qwq.begin(), R=--qwq.end();
			string nefer=*L+*R;
			qwq.erase(R), qwq.erase(L), qwq.insert(nefer); 
		}
		cout << *qwq.begin() << '\n';
	}
	return 0;
}

金币coin

高精度逃逸了。

posted @ 2025-10-14 16:16  Hypoxia571  阅读(6)  评论(0)    收藏  举报