CF B.Kind Anton(4月8号)

------------恢复内容开始------------

 

 翻译如下

 

 (我看了半天没明白)然后大佬一眼就看出来了(手动膜拜大佬);

就思路当上面一个数组的某一位和下面一个数组的那一位有不同的时候,上减下如果差小于0就看前面有没有1;

大于0看前面有没有-1;

做法:

用map存第一次出现-1的位置和第一次出现1的位置,然后遍历一遍,看是否可行;大佬的做法↓↓↓↓↓

 1 #include<bits/stdc++.h>
 2 const int maxn=1e5+50;
 3 const int INF=0x3f3f3f3f;
 4 using namespace std;
 5 int a[maxn],b[maxn];
 6 int  main(){ 
 7     int t;
 8     cin>>t;
 9     while(t--) {
10         int n;
11         int flag=0,flag1=0,flag2=0;
12         map<int,int> m;
13         m[1]=INF,m[-1]=INF;
14         cin>>n;
15         for(int i=1;i<=n;i++)
16             cin>>a[i];
17         for(int i=1;i<=n;i++)
18             cin>>b[i];
19         for(int i=1;i<=n;i++){
20             if(a[i]==1&&!flag1) {//记录1第一次出现的位置
21                 flag1=1;
22                 m[1]=i;
23             }
24             if(a[i]==-1&&!flag2) {//记录-1第一次出现的位置
25                 flag2=1;
26                 m[-1]=i;
27             }
28         }
29         for(int i=1;i<=n;i++){
30             if(a[i]>b[i]) {
31                 if(m[-1]>=i) {//比较当上下有元素不同的时候,前面是否出现过该出现的
32                     flag=1;
33                     break;
34                 }
35             }
36             else if(a[i]<b[i]) {
37                 if(m[1]>=i) {
38                     flag=1;
39                     break;
40                 }
41             }
42         }
43         if(flag)
44             cout<<"NO"<<'\n';
45         else
46             cout<<"YES"<<'\n';
47     }
48     return 0;
49 }

猜你喜欢

转载自www.cnblogs.com/ahijing/p/12682890.html