知识 信息 爱恨 怒喜 融合为 由记忆 组成的新生命体
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
高精度逃逸了。

浙公网安备 33010602011771号