Acwing第 43 场周赛完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing第 43 场周赛完结相关的知识,希望对你有一定的参考价值。

上了一点分。题目难度偏思考性。

目录

4314. 三元组【暴力】

#include<bits/stdc++.h>
using namespace std;
int ans;
int main(void)

    int n; cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
            for(int z=j;z<=n;z++)
                if(i+j>z&&(i^j^z)==0) ans++;
    cout<<ans;
    return 0;

4315. 两个数列【思维】


就是找上下边界,当时想了好久后来写了个暴力才发现了上下边界。

//暴力写法
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
LL a[N],s[N],n,m;
int main(void)

    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
    for(int i=1;i<=n;i++)
    
        int cnt=0;
        LL temp=s[n]-a[i];
        for(int j=1;j<=a[i];j++)
        
            if(temp+j>=m&&(m-j)>=(n-1)) cnt++;
        
        cout<<a[i]-cnt<<" ";
    
    return 0;

通过上面的暴力写法你会发现,可以直接的确定上下边界。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
LL a[N],s[N],n,m;
int main(void)

    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
    for(int i=1;i<=n;i++)
    
        LL temp=s[n]-a[i];
        LL l=max(1ll,m-temp);
        LL r=min(a[i],m-(n-1));
        cout<<a[i]-(r-l+1)<<" ";
    
    return 0;

4316. 合适数对【树状数组 离散化 二分】


思路比较清晰,问题就是加速。然后你会发现用树状数组即可。但是数据范围很大需要离散化。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
LL a[N],s[N],tr[N],n,t;
set<LL>st;
vector<LL>ve;
unordered_map<LL,int>mp;
int lowbit(int x)return x&(-x);
void add(int u,int c)

    for(int i=u;i<=n;i+=lowbit(i)) tr[i]+=c;

LL query(LL x)

	LL res=0;
	for(int i=x;i;i-=lowbit(i)) res+=tr[i];
	return res;

int main(void)

    cin>>n>>t;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]),s[i]=s[i-1]+a[i];
    for(int i=1;i<=n;i++) st.insert(s[i]);
    for(auto i=st.begin();i!=st.end();i++) ve.push_back(*i);
    for(int i=0;i<ve.size();i++) mp[ve[i]]=i+1;//离散化
    LL ans=0;
    for(int i=1;i<=n;i++)
    
        if(s[i]<t) ans++;
        int l=upper_bound(ve.begin(),ve.end(),s[i]-t)-ve.begin();
        if(l==ve.size()) add(mp[s[i]],1);continue;
        ans+=query(n)-query(mp[ve[l]]-1);
        add(mp[s[i]],1);
    
    cout<<ans;
    return 0;

以上是关于Acwing第 43 场周赛完结的主要内容,如果未能解决你的问题,请参考以下文章

Acwing第 56 场周赛完结

Acwing第 36 场周赛完结

Acwing第 53 场周赛完结

Acwing第 32 场周赛完结

Acwing第 59 场周赛完结

Acwing第 50 场周赛完结