关于卡unordered_map和map的一个题

C. Zero-Sum Prefixes

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

The score of an array v1,v2,…,vnv1,v2,…,vn is defined as the number of indices ii (1≤i≤n1≤i≤n) such that v1+v2+…+vi=0v1+v2+…+vi=0.

You are given an array a1,a2,…,ana1,a2,…,an of length nn. You can perform the following operation multiple times:

  • select an index ii (1≤i≤n1≤i≤n) such that ai=0ai=0;
  • then replace aiai by an arbitrary integer.

What is the maximum possible score of aa that can be obtained by performing a sequence of such operations?

Input

Each test contains multiple test cases. The first line contains a single integer tt (1≤t≤1041≤t≤104) — the number of test cases.

The first line of each test case contains one integer nn (1≤n≤2⋅1051≤n≤2⋅105) — the length of the array aa.

The second line of each test case contains nn integers a1,a2,…,ana1,a2,…,an (−109≤ai≤109−109≤ai≤109) — array aa.

It is guaranteed that the sum of nn over all test cases does not exceed 2⋅1052⋅105.

Output

For each test case, print the maximum possible score of the array aa after performing a sequence of operations.

Example

input

Copy

 

5

5

2 0 1 -1 0

3

1000000000 1000000000 0

4

0 0 0 0

8

3 0 2 -10 10 -30 30 0

9

1 0 0 1 -1 0 1 0 -1

output

Copy

3
1
4
4
5

Note

In the first test case, it is optimal to change the value of a2a2 to −2−2 in one operation.

The resulting array aa will be [2,−2,1,−1,0][2,−2,1,−1,0], with a score of 33:

  • a1+a2=2−2=0a1+a2=2−2=0;
  • a1+a2+a3+a4=2−2+1−1=0a1+a2+a3+a4=2−2+1−1=0;
  • a1+a2+a3+a4+a5=2−2+1−1+0=0a1+a2+a3+a4+a5=2−2+1−1+0=0.

In the second test case, it is optimal to change the value of a3a3 to −2000000000−2000000000, giving us an array with a score of 11.

In the third test case, it is not necessary to perform any operations.

TLE解:


#pragma once//只编译一次
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC target("avx")
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define puts(res) cout<<res<<'\n'
#define mem1(a) memset(a,-1,sizeof(a))
#define mem0(a) memset(a,0,sizeof(a))
#define fup(o,a,b) for(int o=a;o<=b;o++)
#define cmin(a, b) a = min(a, b)
#define cmax(a, b) a = max(a, b)
#define up(a,b) for(int o=a;o<=b;o++)
#define dn(a,b) for(int o=a;o>=b;o--)
#define fdn(o,a,b) for(int o=a;o>=b;o--)
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define endl '\n'
#define ends ' '
// #define x first
// #define y second
#define db double
#define MAX 0x7ffffff
#define INF 0x3f3f3f3f
typedef pair<int,int>PII;
typedef priority_queue<int,vector<int>,greater<int>>pri_int;
const int N=500010;
int rd(){//快读
    int x=0,f=1;//记录数和符号
    char c=getchar();//读入字符
    while(c<'0'||c>'9'){//只要不是数
        if(c=='-') f=-1;//是负号就记录
        c=getchar();
    }
    while(c>='0'&&c<='9'){//只要是数
        x=x*10+c-'0';//挪位再加
        c=getchar();
    }
    return x*f;//返回数乘符号
}
int a[200005];
int s[200005];
void solve(){
    int n;cin>>n;
    up(1,n)cin>>a[o],s[o]=s[o-1]+a[o];
    unordered_map<int,int>m;
    int maaax=0,ans=0,minnn=0;
    fdn(i,n,1){
        m[s[i]]++;
        if(s[i]==0)minnn++;
        maaax=max(maaax,m[s[i]]);
        if(a[i]==0){m.clear();ans+=max(maaax,minnn);maaax=0;minnn=0;}
    }
    cout<<ans+minnn<<endl;
}
signed main() {
    IOS;
    int __;
    cin>>__;
    while(__--)
        solve();
    return 0;
}

 AC解:
#pragma once//只编译一次
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC target("avx")
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define puts(res) cout<<res<<'\n'
#define mem1(a) memset(a,-1,sizeof(a))
#define mem0(a) memset(a,0,sizeof(a))
#define fup(o,a,b) for(int o=a;o<=b;o++)
#define cmin(a, b) a = min(a, b)
#define cmax(a, b) a = max(a, b)
#define up(a,b) for(int o=a;o<=b;o++)
#define dn(a,b) for(int o=a;o>=b;o--)
#define fdn(o,a,b) for(int o=a;o>=b;o--)
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define endl '\n'
#define ends ' '
// #define x first
// #define y second
#define db double
#define MAX 0x7ffffff
#define INF 0x3f3f3f3f
typedef pair<int,int>PII;
typedef priority_queue<int,vector<int>,greater<int>>pri_int;
int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};
const int N=500010;
int rd(){//快读
    int x=0,f=1;//记录数和符号
    char c=getchar();//读入字符
    while(c<'0'||c>'9'){//只要不是数
        if(c=='-') f=-1;//是负号就记录
        c=getchar();
    }
    while(c>='0'&&c<='9'){//只要是数
        x=x*10+c-'0';//挪位再加
        c=getchar();
    }
    return x*f;//返回数乘符号
}
int a[200005];
int s[200005];
void solve(){
    int n;cin>>n;
    up(1,n)cin>>a[o],s[o]=s[o-1]+a[o];
    map<int,int>m;
    int maaax=0,ans=0,minnn=0;
    fdn(i,n,1){
        m[s[i]]++;
        if(s[i]==0)minnn++;
        maaax=max(maaax,m[s[i]]);
        if(a[i]==0){m.clear();ans+=max(maaax,minnn);maaax=0;minnn=0;}
    }
    cout<<ans+minnn<<endl;
}
signed main() {
    IOS;
    int __;
    cin>>__;
    while(__--)
        solve();
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值