C
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
struct nd{
int x,a;
}y[200005];
int qzh;
int ans;
bool cmp(nd l,nd r){
return l.x < r.x;
}
signed main(){
cin >> n >> m;
for(int i = 1;i <= m;++ i)
cin >> y[i].x;
for(int i = 1;i <= m;++ i)
cin >> y[i].a,qzh = qzh+y[i].a;
sort(y+1,y+1+m,cmp);
y[m+1].x = n+1;
if(qzh != n){
cout << -1;
return 0;
}
if(y[1].x != 1){
cout << -1;
return 0;
}
for(int i = 1;i <= m;++ i){
int gs = y[i+1].x-1-y[i].x;
ans += (1+gs)*gs/2;
gs = y[i].a-gs-1;
if(gs < 0){
cout << -1;
return 0;
}
ans += gs*(y[i+1].x-y[i].x);
y[i+1].a += gs;
}
cout << ans;
return 0;
}
D
link
其实\(10^{100}\)个花瓶并没有用,只是告诉你花瓶够用。
对于每一个花瓶,我们记录是在哪一个时刻种上的并用小根堆维护种上的时刻并记录当前时间即可做这三种操作。
第一种操作:新增一个时刻。
第二种操作:时间戳增加。
第三种操作:因为是小根堆,所以可以取出时间最小的(但由于一定是按时间顺序加入的,所以其实数组也行),判断一下时间最小的是否够了高度,即和当前时间的差是否大于要求高度,如果符合,收获这个,弹出,再找最小的。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int q,t;
priority_queue<int,vector<int>,greater<int> > h;
signed main(){
cin >> q;
while(q--){
int op,x;
cin >> op;
if(op == 1) h.push(t);
else if(op == 2){
cin >> x;
t += x;
}
else if(op == 3){
cin >> x;
int g = t-x,ans = 0;
while(!h.empty()){
int w = h.top();
if(w <= g) h.pop(),ans++;
else break;
}
cout << ans << endl;
}
}
return 0;
}
E
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
char s[200005];
long long qzh;
long long x[3000005],cn;
signed main(){
cin >> n >> s+1;
for(int i = 1;i <= n;++ i)
qzh += (s[i]-'0')*i;
for(int i = n;i >= 1;-- i){
x[++cn] = qzh;
x[cn] += x[cn-1]/10;
x[cn-1] %= 10;
qzh -= (s[i]-'0')*i;
}
while(x[cn] >= 10){
cn++;
x[cn] += x[cn-1]/10;
x[cn-1] %= 10;
}
for(int i = cn;i >= 1;-- i)
cout << x[i];
return 0;
}