CF Round #632 div2

A

自己找规律就好了。。。

B

https://codeforces.ml/problemset/problem/1333/B

你会发现题目只需要 bi-ai 能用 前面的i-1个数表示就可以了

但是题目又说a只有0,-1,1

显然0对答案没有什么用,相当于占位,1~i 里面无论有几个1 其实都相当于1个1 的作用(-1同理)

bi-ai>0 则说明它要被1能得出 <==> 1~i-1 里面至少含有一个1

bi-ai<0 同理

bi==ai 直接跳过即可(因为a1~i-1系数全为0都可以满足)

要特判一下a1是否等于b1 

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,inf=0x3f3f3f3f;
int T,a[N],b[N],c[N],n,pos1,pos2,flag;// 1 B 0 W
int main()
{
    scanf("%d ",&T);
    while(T--)
    {
        scanf("%d",&n);
        flag=0;
        pos1=inf;
        pos2=inf;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==1&&pos1==inf)
                pos1=i;
            if(a[i]==-1&&pos2==inf)
                pos2=i;
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&b[i]);
            c[i]=b[i]-a[i];
            if((c[i]>0&&i>pos1)||(c[i]<0&&i>pos2)||(c[i]==0))
                continue;
            else
                flag=1;
        }
        if(flag)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;    
} 

C题

https://codeforces.ml/problemset/problem/1333/C

1. 因为tot [i~j] =0 <==> sum[i-1]==sum[j]  注意是i-1

2. tot i~j =0 对于任意pos1< i , pos2 > j ,[apos1 ... apos2 ] 这个集合都是not good

3. 假设 [ai ... aj] is good 如果set.count(sum[j+1])!=0 说明里面存在一个pos,sum[pos] = sum[j+1] 这时候对答案有的贡献是j-i(i~i,i~i+1,i~i+2 ...i~j)

4 .删去sum[i] ,如果仍有set.count(sum[j+1])!=0 说明 i~j+1 not good,继续删

否则 i+1~j good 回到

5. longlong不能忘

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
long long n,x[N],sum[N],pos1,pos2,ans;
set < long long > s;
int main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&x[i]);
        sum[i]=sum[i-1]+x[i];
    }
    //sum i =tot 1~i-1
    //从1开始枚举,直到发现一个不满足条件的位置pos 
    // 这时有1~2,1~3...1~pos个序列满足,ans+=pos-1
    //如果恰好是sum pos==sum 1 ,则去掉sum1后继续找一个pos,ans+=pos-2
    //如果 sum pos!=sum 1  
    pos1=1,pos2=1;
    s.insert(0);
    while(pos1<=n) 
    {
        while(pos2<=n)
        {
            if(s.count(sum[pos2])==0)
            {
                s.insert(sum[pos2]);
                pos2++;
            }
            else
                break;
        }
        ans+=pos2-pos1; 
        s.erase(sum[pos1-1]);
        pos1++;
    }
    printf("%lld\n",ans);
    return 0;
}

 

posted @ 2020-04-10 18:08  Sakura_Momoko  阅读(130)  评论(0编辑  收藏  举报