为什么不会 E????
A - B
模拟即可。
C
每一个大麻薯可以和所有小于等于自己 \(\frac12\) 的麻薯结合,二分即可。
时间复杂度 \(O(n \log n)\)。
点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define i128 __int128
#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first
#define scd second
#define dbg puts("IAKIOI")
using namespace std;
int read() {
int x=0,f=1; char c=getchar();
for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1);
for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }
const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }
#define maxn 500050
int n,a[maxn],b[maxn];
void work() {
in1(n);
For(i,1,n) in1(a[i]);
priority_queue<int,vector<int>,greater<int> > q;
For(i,1,n) {
while(q.size()&&q.top()<i) q.pop();
a[i]+=q.size();
b[i]=max(0,a[i]-(n-i));
q.push(a[i]+i);
}
For(i,1,n) cout<<b[i]<<' ';
}
signed main() {
// ios::sync_with_stdio(false);
// cin.tie(0); cout.tie(0);
int _=1;
// _=read();
For(i,1,_) {
work();
}
return 0;
}
D
可能是一个比较神秘的做法(?
首先我们知道每个人都只会收到别人爆的一次金币,所以我们可以维护一个小根堆,每一次把收到钱的人推入小根堆。
假设第 \(i\) 个人要爆出 \(i\) 分钱,所以每一次就把不符合条件的人给丢出小根堆。
把人推入堆中时要注意因为我们刚刚默认了每个人都已经报爆了 \(i\) 次金币,所以入队时推的是 \(a_i+i\)。
至于输出,因为每个人只会拿到一次金币,所以我们可以在知道他最多钱的时候就立马算出来他最后的金币有多少,即 \(\max(0,a_i-(n-i))\)。
点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define i128 __int128
#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first
#define scd second
#define dbg puts("IAKIOI")
using namespace std;
int read() {
int x=0,f=1; char c=getchar();
for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1);
for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }
const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }
#define maxn 500050
int n,a[maxn],b[maxn];
void work() {
in1(n);
For(i,1,n) in1(a[i]);
priority_queue<int,vector<int>,greater<int> > q;
For(i,1,n) {
while(q.size()&&q.top()<i) q.pop();
a[i]+=q.size();
b[i]=max(0,a[i]-(n-i));
q.push(a[i]+i);
}
For(i,1,n) cout<<b[i]<<' ';
}
signed main() {
// ios::sync_with_stdio(false);
// cin.tie(0); cout.tie(0);
int _=1;
// _=read();
For(i,1,_) {
work();
}
return 0;
}
E
傻福题,真的是冯了个福的。
二分最后的答案(单调性显然),每一次判定 \(x\) 是否可行只需要看前 \(x\) 个和后 \(x\) 个是否可以匹配。最小的和最小的匹配,最大的和最大的匹配(两个 最 分别指的是:前 \(x\) 个和后 \(x\) 个)即可,正确性显然。时间复杂度 \(O(n \log n)\)。
点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define i128 __int128
#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first
#define scd second
#define dbg puts("IAKIOI")
using namespace std;
int read() {
int x=0,f=1; char c=getchar();
for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1);
for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }
const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }
#define maxn 500050
int n,a[maxn];
bool check(int x) {
For(i,1,x) if(a[i]*2>a[n-x+i]) return 0;
return 1;
}
void work() {
in1(n);
For(i,1,n) in1(a[i]);
int l=0,r=n/2;
while(l<r) {
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
}
signed main() {
// ios::sync_with_stdio(false);
// cin.tie(0); cout.tie(0);
int _=1;
// _=read();
For(i,1,_) {
work();
}
return 0;
}