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


差分搞一下,或者区间合并都可以。

#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

Codeforces Round #501 (Div. 3) A Points in Segments

Codeforces Round #501 (Div. 3) D Walking Between Houses