传送门: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;
}