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 场周赛完结的主要内容,如果未能解决你的问题,请参考以下文章