A
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 105;
int n,a[N],b[N],p;
signed main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) a[i]-=b[i];
int sum=0;
for(int i=1;i<=n;i++) sum+=a[i];
int tot=0;
for(int i=1;i<=n;i++) if(a[i]>0) tot+=a[i];
if(sum>0) {
cout<<1<<endl;
}
else {
if(tot==0) cout<<-1<<endl;
else {
int ans=1;
while(sum<=0) {
sum+=tot;
++ans;
}
cout<<ans<<endl;
}
}
}
B
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int O = 5e5;
const int N = 1e6;
int n,a[N],s[N];
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) s[a[i]-i+O]+=a[i];
cout<<*max_element(s,s+N);
}
C
对字母组合从大到小贪心无后效
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1005;
int n;
string s;
signed main() {
cin>>n>>s;
while(true) {
int fg=0;
for(char c='z'-1;c>='a';c--) {
for(int i=0;i<s.length()-1;i++) {
if(s[i]==c&&s[i+1]==c+1) s.erase(i+1,1), fg=1;
if(fg) goto E;
if(s[i]==c+1&&s[i+1]==c) s.erase(i,1), fg=1;
if(fg) goto E;
}
}
E:if(fg==0) break;
}
cout<<n-s.length()<<endl;
}
D
反图上跑 DFS
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 500005;
int n,m,q,p[N],d[N],v[N],ans;
vector <int> g[N],ng[N];
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++) {
int t1,t2;
cin>>t1>>t2;
g[t1].push_back(t2);
ng[t2].push_back(t1);
}
cin>>q;
for(int i=1;i<=q;i++) {
cin>>p[i];
}
memset(d,0x3f,sizeof d);
d[p[q]]=0;
queue <int> que;
que.push(p[q]);
while(que.size()) {
int p=que.front(); que.pop();
for(int q:ng[p]) {
if(d[q]>d[p]+1) {
d[q]=d[p]+1;
if(!v[q]) que.push(q), v[q]=1;
}
}
}
for(int i=1;i<q;i++) {
if(d[p[i]]!=d[p[i+1]]+1) ++ans;
}
cout<<ans<<" ";
for(int i=1;i<q;i++) {
if(d[p[i]]==d[p[i+1]]+1) {
int fg=0;
for(int q:g[p[i]]) if(q!=p[i+1]) {
if(d[p[i]]==d[q]+1) fg=1;
}
if(fg) ++ans;
}
}
cout<<ans;
}
E
放到二维平面上,扫描线+线段树维护
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4000005;
const int M = 1000001;
int n,m,p,a[N],b[N],val[N],tag[N],t1,t2,t3;
struct mon {
int x,y,z;
bool operator < (const mon &b) const {
return y<b.y;
}
} c[N];
void pushup(int p) {
val[p]=max(val[p*2],val[p*2+1]);
}
void pushdown(int p) {
if(tag[p]) {
tag[p*2]+=tag[p];
tag[p*2+1]+=tag[p];
val[p*2]+=tag[p];
val[p*2+1]+=tag[p];
tag[p]=0;
}
}
void build(int p,int l,int r) {
if(l==r) {
val[p]=-b[l];
}
else {
build(p*2,l,(l+r)/2);
build(p*2+1,(l+r)/2+1,r);
pushup(p);
}
}
void modify(int p,int l,int r,int ql,int qr,int x) {
if(l>qr||r<ql) return;
if(l>=ql&&r<=qr) {
tag[p]+=x;
val[p]+=x;
}
else {
pushdown(p);
modify(p*2,l,(l+r)/2,ql,qr,x);
modify(p*2+1,(l+r)/2+1,r,ql,qr,x);
pushup(p);
}
}
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m>>p;
memset(a,0x3f,sizeof a);
for(int i=1;i<=n;i++) {
cin>>t1>>t2;
a[t1]=min(a[t1],t2);
}
for(int i=M;i>=1;--i) a[i]=min(a[i],a[i+1]);
memset(b,0x3f,sizeof b);
for(int i=1;i<=m;i++) {
cin>>t1>>t2;
b[t1]=min(b[t1],t2);
}
for(int i=M;i>=1;--i) b[i]=min(b[i],b[i+1]);
for(int i=1;i<=p;i++) {
cin>>t1>>t2>>t3;
c[i]={t2+1,t1+1,t3};
}
sort(c+1,c+p+1);
build(1,1,M);
int pos=1;
int ans=-1e18;
for(int i=1;i<=M;i++) {
while(c[pos].y<=i && pos<=p) {
modify(1,1,M,c[pos].x,M,c[pos].z);
++pos;
}
ans=max(ans,val[1]-a[i]);
}
cout<<ans;
}
F
将 (0) 的位置哈希起来即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e6+5;
int mod=1e9+7,bas=31;
int h[2][N],pw[N],cnt[N];
char c[N];
int n,q;
int query(int l,int r,int op) {
return ((h[op][r]-h[op][l-1]*pw[cnt[r]-cnt[l-1]])%mod+mod)%mod;
}
signed main() {
ios::sync_with_stdio(false);
cin>>n>>c+1;
for(int i=1;i<=n;i++) {
h[0][i]=h[0][i-1]; h[1][i]=h[1][i-1]; cnt[i]=cnt[i-1];
if(c[i]=='0') {
h[0][i]=(h[0][i]*bas+i%2+1)%mod;
h[1][i]=(h[1][i]*bas+(i+1)%2+1)%mod;
++cnt[i];
}
}
pw[0]=1;
for(int i=1;i<=n;i++) pw[i]=pw[i-1]*bas%mod;
cin>>q;
for(int i=1;i<=q;i++) {
int t1,t2,len;
cin>>t1>>t2>>len;
if(query(t1,t1+len-1,t1&1)==query(t2,t2+len-1,t2&1))
puts("Yes");
else puts("No");
}
}