Codeforces Round #353 (Div. 2) ABCD

传送门:http://codeforces.com/contest/675


A:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=30;
int T,n;
int a,b,c;

int main(){
	while(~scanf("%d%d%d",&a,&b,&c)){
		if(c==0){
			puts(a==b?"YES":"NO");
			continue;
		}
		if((b-a)%c==0&&(b-a==0||(b-a)/abs(b-a)==c/abs(c))) puts("YES");
		else puts("NO");
	}
	return 0;
}


B:

暴力枚举

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;

#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r

typedef __int64 ll;
const int INF=0x3f3f3f3f;
const int maxn=111111;
int n,a,b,c,d;
int x[10];


int main(){
    while(~scanf("%d%d%d%d%d",&n,&a,&b,&c,&d)){
    	ll res=0;
    	int num1=b-c;
    	int num2=a-d;
    	int num3=a+b-c-d;
    	for(x[1]=1;x[1]<=n;x[1]++){
    		x[2]=x[1]+num1;
    		x[4]=x[1]+num2;
    		x[5]=x[1]+num3;
    		if(x[2]<=0||x[4]<=0||x[5]<=0) continue;
    		if(x[2]>n||x[4]>n||x[5]>n) continue;
    		res++;
    	}
    	printf("%I64d\n",res*n);
    }
    return 0;
}


C:

标记前缀和,任意两个相等的前缀和之间不需要移动,找出最多不需要移动的点的个数ans,n-ans即为结果

#include <bits/stdc++.h>
using namespace std;

typedef __int64 ll;
const int INF=0x3f3f3f3f;
const int maxn=111111;
int n,a[maxn];

int main(){
    while(~scanf("%d",&n)){
    	map<ll,int>mp;
    	ll sum=0;
    	int ans=0;
    	for(int i=1;i<=n;i++) {
    		scanf("%d",a+i);
    		sum+=a[i];
    		mp[sum]++;
    		ans=max(ans,mp[sum]);
    	}
    	printf("%d\n",n-ans);
    }
    return 0;
}


D:

STL大法!

#include <bits/stdc++.h>
using namespace std;

typedef __int64 ll;
const int INF=0x3f3f3f3f;
const int maxn=111111;
int n,a[maxn];
int depth[maxn];

int main(){
    while(~scanf("%d",&n)){
    	for(int i=1;i<=n;i++) {
    		scanf("%d",a+i);
    	}
    	memset(depth,0,sizeof(depth));
    	set<pair<int,int> > st;
    	st.insert(make_pair(a[1],1));
    	for(int i=2;i<=n;i++){
    		auto it=st.lower_bound(make_pair(a[i],-1));
    		int id=-1;
    		if(it!=st.end()){
    			id=it->second;
    		}
    		if(it!=st.begin()){
    			it--;
    			if(id==-1||depth[id]<depth[it->second]){
    				id=it->second;
    			}
    		}
    		depth[i]=depth[id]+1;
    		printf("%d ",a[id]);
    		st.insert(make_pair(a[i],i));
    	}
    	putchar(10);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值