小红的单词整理
语法
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
void solve() {
string a,b;
cin >> a >> b;
cout<<b<<'\n';
cout<<a;
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t = 1;
// cin >> t;
while(t--){
solve();
}
}
小红煮汤圆
模拟
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
int ans[N];
int cnt=0;
void solve() {
int n,x,k;
cin >> n >> x >> k;
int sum=0;
int c=0;
for(int i=1;i<=n;i++){
sum+=x;
c+=1;
while(sum>=k){
ans[++cnt]=c;
c=0;
sum-=k;
}
}
cout<<cnt<<'\n';
for(int i=1;i<=cnt;i++){
cout<<ans[i]<<' ';
}
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t = 1;
// cin >> t;
while(t--){
solve();
}
}
小红的 01 串
贪心后缀和
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
int r[N];
int l[N];
void solve() {
string a;
cin >> a;
int len=a.length();
int sum=0;
int mx=0;
int mi=0;
int cnt=0;
int dd=0;
int ans=0;
r[len]=0;
for(int i=len-1;i>=0;i--){
if(a[i]=='1')sum++;
else sum--;
r[i]=sum;
}
ans=max(ans,r[0]);
// cout<<sum<<'\n';
int boo=0;
for(int i=0;i<len;i++){
if(a[i]=='1'&&cnt<1){
cnt++;
}
else if(cnt==1&&a[i]=='1') boo=1;
else if(cnt==1&&a[i]=='0') boo=0;
// cout<<dd<<'\n';
ans=max(ans,boo+r[i+1]+cnt);
}
cout<<ans;
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t = 1;
// cin >> t;
while(t--){
solve();
}
}
小红的数组清空
哈希贪心
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
void solve() {
map<int,int>mp;
map<int,int>mp1;
int n;
cin >> n;
for(int i=1;i<=n;i++){
int x;
cin >> x;
mp[x]+=1;
}
int ans=0;
for(auto[i,j]:mp){
int x=mp1[i-1];
int k=j;
ans+=max(0ll,k-x);
mp1[i]=j;
}
cout<<ans;
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t = 1;
// cin >> t;
while(t--){
solve();
}
}
小红勇闯地下城
题解dijsta
我写的spfa
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void solve() {
int n,m,c;
cin >> n >> m >> c;
string a[n];
int vis[n+2][m+2];
int x,y;
for(int i=0;i<n;i++){
cin >> a[i];
for(int j=0;j<m;j++){
if(a[i][j]=='S'){
x=i,y=j;
}
vis[i][j]=-1;
}
}
queue<pair<int,int>>q;
queue<int>p;
p.push(c);
q.push({x,y});
while(q.size()){
int i=q.front().first;
int j=q.front().second;
int h=p.front();
// cout<<i<<' '<<j<<' '<<h<<'\n';
q.pop();
p.pop();
if(a[i][j]=='T'){
cout<<"Yes"<<'\n';
return;
}
for(int k=0;k<4;k++){
int qx=i+dx[k];
int qy=j+dy[k];
if(qx<0||qy<0||qx>=n||qy>=m) continue;
int w=a[qx][qy]-'1'+1;
if(a[qx][qy]=='T'||a[qx][qy]=='S') w=0;
int now=h-w;
if(now<=vis[qx][qy]) continue;
vis[qx][qy]=now;
if(now){
q.push({qx,qy});
p.push(h-w);
}
}
}
cout<<"No"<<'\n';
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t = 1;
cin >> t;
while(t--){
solve();
}
}
小红的数组操作(已补
2300斜线优化dp(似乎用不到斜线优化,写个单调栈就可以通过了?
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e3+6;
int n;
int a[N],ans[N];
void solve() {
cin>>n;
int mn=LLONG_MAX;
for(int i=1;i<=n;i++){
cin>>a[i];a[i]-=i;
mn=min(mn,a[i]);
}
vector<pair<int,int>>st;
for(int i=1;i<=n;i++){
a[i]-=mn;
int sum=a[i],cnt=1;
while(st.size()&&st.back().first>sum/cnt){
sum+=st.back().first*st.back().second;
cnt+=st.back().second;
st.pop_back();
}
st.push_back({sum/cnt,cnt-sum%cnt});
if(sum%cnt)st.push_back({sum/cnt+1,sum%cnt});
}
int r=n;
while(st.size()){
// cout<<st.back().first<<' '<<st.back().second<<'\n';
for(int i=1;i<=st.back().second;i++){
ans[r--]=st.back().first;
}
st.pop_back();
}
int res=0;
// for(int j=1;j<=n;j++){
// cout<<a[j]<<' ';
// }
// cout<<'\n';
// for(int j=1;j<=n;j++){
// cout<<ans[j]<<' ';
// }
// cout<<'\n';
for(int i=1;i<=n-1;i++){
int need=a[i]-ans[i];
a[i]-=need;
a[i+1]+=need;
res+=need;
}
cout<<res<<"\n";
for(int i=1;i<=n;i++)cout<<ans[i]+i+mn<<" ";
cout<<"\n";
}
signed main(){
cin.tie(0);cout.tie(0);
ios::sync_with_stdio(0);
int t = 1;
// cin >> t;
while(t--){
solve();
}
}