Codeforces Round #695 (Div. 2)B. Hills And Valleys
*1700,这题直接暴力,不需要dp,判断的时候注意下标
#include
using namespace std;
const int N = 3e5+10,M=2e5+10;
typedef long long ll;
int a[N];
bool judge(int left,int right,int now)
{
if(now>left&&now>right||now<left&&now<right)
return 1;
return 0;
}
int main()
{
int t;
cin>>t;
int n;
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int ans=0;
for(int i=1;i<n-1;i++)
{
if(judge(a[i-1],a[i+1],a[i]))
ans++;
}
int tmp=ans;
for(int i=0;i<n;i++)
{
int x=max(a[i-1],a[i+1]);
int pre=0,now=0;
if(i>0&&i<n-1&&judge(a[i-1],a[i+1],a[i]))
pre++;
if(i<n-2&&judge(a[i],a[i+2],a[i+1]))
pre++;
if(i>1&&judge(a[i-2],a[i],a[i-1]))
pre++;
if(i>0&&i<n-1&&judge(a[i-1],a[i+1],x))
now++;
if(i<n-2&&judge(x,a[i+2],a[i+1]))
now++;
if(i>1&&judge(a[i-2],x,a[i-1]))
now++;
ans=min(ans,tmp-(pre-now));
x=min(a[i-1],a[i+1]);
now=0;
if(i>0&&i<n-1&&judge(a[i-1],a[i+1],x))
now++;
if(i<n-2&&judge(x,a[i+2],a[i+1]))
now++;
if(i>1&&judge(a[i-2],x,a[i-1]))
now++;
ans=min(ans,tmp-(pre-now));
}
printf("%d\n",ans);
}
return 0;
}
Codeforces Round #696 (Div. 2)C. Array Destruction
*1700
这题主要是卡时间,memset的时间复杂度是O(N),map的时间复杂度是O(logn),也有超时的可能,所以用到一个桶标记的小技巧,怎么标记的就怎么清除即可。
#include
using namespace std;
const int N = 2e3+10,M=2e5+10;
typedef long long ll;
int a[N];
int flag,ans,n;
int ans_index;
int ans_array[N];
int vis[1000005];
bool cmp(int x,int y)
{
return x>y;
}
void clear()
{
for(int i=0;i<2*n;i++)
vis[a[i]]=0;
}
void Init()
{
for(int i=0;i<2*n;i++)
vis[a[i]]++;
}
void dfs(int index,int val,int step)
{
//printf("step=%d index=%d val=%d\n",step,index,val);
if(flag==0)return ;
if(step==n){
ans=1;return ;}
int next=index+1;
while(vis[a[next]]<=0)next++;
vis[a[next]]--;
ans_array[ans_index++]=next;
for(int i=next+1;;i++)
{
if(a[next]+a[i]==val&&vis[a[i]]>0)
{
ans_array[ans_index++]=i;
vis[a[i]]--;
break;
}
if(i>=2*n)
{
flag=0;
return ;
}
}
dfs(next,a[next],step+1);
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=0;i<2*n;i++)
scanf("%d",&a[i]);
sort(a,a+2*n,cmp);
int fl=0;
for(int i=1;i<2*n;i++)
{
flag=1;
ans=0;
ans_index=0;
Init();
//mp[a[i]]=1;
dfs(-1,a[0]+a[i],0);
if(ans==1)
{
fl=1;
printf("YES\n");
printf("%d\n",a[0]+a[i]);
for(int i=0;i<n;i++)
{
printf("%d %d\n",a[ans_array[2*i]],a[ans_array[2*i+1]]);
}
break;
}
clear();
}
if(fl==0)
printf("NO\n");
}
return 0;
}
Codeforces Round #693 (Div. 3)E. Correct Placement
*1700
这题是没有将初始数据进行处理,导致处理复杂。
这题用到了双指针的思想,比赛时做题没有一下想到,导致处理复杂。
#include
using namespace std;
const int N=2e5+10;
struct node
{
int h,w,num,pre;
}a[N];
bool cmp(node x,node y)
{
if(x.w!=y.w)
return x.w<y.w;
else return x.h<y.h;
}
bool cmp2(node x,node y)
{
return x.num<y.num;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].w,&a[i].h);
if(a[i].w<a[i].h)swap(a[i].w,a[i].h);
a[i].num=i;
a[i].pre=-1;
}
sort(a+1,a+n+1,cmp);
int j=1;
int min_h=0x3f3f3f3f,min_id=1;
for(int i=1;i<=n;i++)
{
while(a[i].w>a[j].w&&j<i)
{
if(a[j].h<min_h)
{
min_h=a[j].h;
min_id=j;
}
j++;
}
if(a[i].w==a[min_id].w)
{
continue;
}
if(a[i].h>min_h)
a[i].pre=a[min_id].num;
}
sort(a+1,a+1+n,cmp2);
for(int i=1;i<=n;i++)
{
printf("%d ",a[i].pre);
}
cout<<endl;
}
return 0;
}