Codeforces Round #501 (Div. 3)未完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #501 (Div. 3)未完结相关的知识,希望对你有一定的参考价值。
2022.3.7
题单地址:https://codeforces.com/contest/1015
目录
- A. Points in Segments
- B. Obtaining the String【模拟】
- C. Songs Compression【贪心】
- D. Walking Between Houses【贪心】
- E1. Stars Drawing (Easy Edition)【暴力 前缀和】
- E2. Stars Drawing (Hard Edition)【前缀和】
- F. Bracket Substring【DP未完结】
A. Points in Segments
差分搞一下,或者区间合并都可以。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N],n,m;
void add(int l,int r,int c)
a[l]+=c;
a[r+1]-=c;
void init()
for(int i=1;i<=n;i++) a[i]+=a[i-1];
int main(void)
cin>>m>>n;
while(m--)
int l,r; cin>>l>>r;
add(l,r,1);
init();
int cnt=0;
for(int i=1;i<=n;i++) if(!a[i]) cnt++;
cout<<cnt<<endl;
for(int i=1;i<=n;i++) if(!a[i]) cout<<i<<" ";
return 0;
B. Obtaining the String【模拟】
#include<bits/stdc++.h>
using namespace std;
int n;
string a,b,s1,s2;
int main(void)
cin>>n>>a>>b;
s1=a,s2=b;
sort(s1.begin(),s1.end());
sort(s2.begin(),s2.end());
if(s1==s2)
vector<int>ve;
for(int i=0;i<a.size();i++)
if(a[i]==b[i]) continue;
else
int pos=0;
for(int j=i+1;j<a.size();j++)
if(a[j]==b[i])
pos=j;
break;
while(a[i]!=b[i])
swap(a[pos],a[pos-1]),ve.push_back(pos),pos--;
cout<<ve.size()<<endl;
for(int i=0;i<ve.size();i++) cout<<ve[i]<<" ";
else puts("-1");
return 0;
C. Songs Compression【贪心】
贪心,将按最大的减价,排序。然后枚举选几个降价的可以,注意用前缀和来快速的计算。
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
typedef long long int LL;
const int N=1e5+10;
PII ve[N];
LL n,m,s1[N],s2[N];
bool cmp(PII a,PII b)return a.x-a.y>b.x-b.y;
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++)
int a,b; cin>>a>>b;
ve[i]=a,b;
sort(ve+1,ve+n+1,cmp);
for(int i=1;i<=n;i++)
s1[i]=s1[i-1]+ve[i].x;
s2[i]=s2[i-1]+ve[i].y;
for(int i=0;i<=n;i++)
LL sum=s1[n]-s1[i]+s2[i];
if(sum<=m)
cout<<i<<endl;
return 0;
puts("-1");
return 0;
D. Walking Between Houses【贪心】
先给k天每人选择1步,然后再看剩余的前几天分,使得最大步数不会大于(n-1)
选好天数后尽可能的平分。剩余的前几天每一天加1。
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
LL n,k,s;
int main(void)
cin>>n>>k>>s;
if(s<k || (n-1)*k<s) puts("NO");
else
LL sum=s-k,pos=1;
for(int i=1;i<=k;i++)
LL temp=sum/i+1;
if(sum%i) temp++;
if(temp<=(n-1))//平分后最大天数小于n-1
pos=i;
break;
vector<int>ve;
for(int i=0;i<k;i++) ve.push_back(1);
LL temp=sum/pos;
for(int i=0;i<pos;i++)
ve[i]+=temp;//每一天加
if((i+1)<=(sum%pos)) ve[i]++;//说明有剩余的,那么前面的几天都加1
pos=1;
puts("YES");
for(int i=0;i<ve.size();i++)
if(pos+ve[i]<=n) pos=ve[i]+pos,cout<<pos<<" ";
else pos=pos-ve[i],cout<<pos<<" ";
return 0;
E1. Stars Drawing (Easy Edition)【暴力 前缀和】
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char a[N][N];
int s1[N][N],s2[N][N],n,m;
struct nodeint x,y,z;;
vector<node>ve;
void solve(int x,int y)
int maxv=0;
for(int len=min(n,m);len>=1;len--)//从大到小枚举尺寸
int l1=x-len,r1=x+len;
int l2=y-len,r2=y+len;
if(l1<1||r1>n||l2<1||r2>m) continue;
int sum1=s1[x][r2]-s1[x][l2-1];
int sum2=s2[y][r1]-s2[y][l1-1];
int temp=len*2+1;
if(sum1==temp&&sum2==temp)
maxv=max(maxv,len);
break;
if(maxv) ve.push_back(x,y,maxv);
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
s1[i][j]=s1[i][j-1];
if(a[i][j]=='*') s1[i][j]++;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
s2[i][j]=s2[i][j-1];
if(a[j][i]=='*') s2[i][j]++;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]=='*') solve(i,j);
bool flag=0;
for(int i=0;i<ve.size();i++)
int x=ve[i].x,y=ve[i].y,len=ve[i].z;
for(int j=x-len;j<=x+len;j++) a[j][y]='.';
for(int j=y-len;j<=y+len;j++) a[x][j]='.';
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) if(a[i][j]=='*') flag=1;
if(!flag)
cout<<ve.size()<<endl;
for(int i=0;i<ve.size();i++)
printf("%d %d %d\\n",ve[i].x,ve[i].y,ve[i].z);
else puts("-1");
return 0;
E2. Stars Drawing (Hard Edition)【前缀和】
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char a[N][N];
int s1[N][N],s2[N][N],n,m;
struct nodeint x,y,z;;
vector<node>ve;
void solve(int x,int y)
int maxv=0;
for(int len=min(n,m);len>=1;len--)
int l1=x-len,r1=x+len;
int l2=y-len,r2=y+len;
if(l1<1||r1>n||l2<1||r2>m) continue;
int sum1=s1[x][r2]-s1[x][l2-1];
int sum2=s2[y][r1]-s2[y][l1-1];
int temp=len*2+1;
if(sum1==temp&&sum2==temp)
maxv=max(maxv,len);
break;
if(maxv) ve.push_back(x,y,maxv);
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
s1[i][j]=s1[i][j-1];
if(a[i][j]=='*') s1[i][j]++;
for(int i=1;i<=m;i++)
for(int j=1;j<=以上是关于Codeforces Round #501 (Div. 3)未完结的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #501 (Div. 3) F. Bracket Substring
Codeforces Round #501 (Div. 3) ABDE1E2
Codeforces Round #501 (Div. 3) 翻船记
Codeforces Round #501 (Div. 3) B Obtaining the String