A | B | C | D | Sum | Rank |
---|---|---|---|---|---|
100 | 9 | 54 | - | 163 | 11/24 |
A. 算术
列个表格:
\(a_i\to\) \(a_j\downarrow\) |
\(\le0\) | \(1\) | \(>1\) |
---|---|---|---|
\(\le0\) | ❎ | ✅ | ✅ |
\(1\) | ✅ | ✅ | ✅ |
\(>1\) | ✅ | ✅ | ❎ |
记录当前 \(=1\)、\(>1\)、\(\ge1\) 的数量即可。
Code
#include<bits/stdc++.h>
#define ll long long
#define il inline
using namespace std;
namespace asbt{
const int maxn=1e6+5;
int n,cntge1,cnte1,cntg1;
ll a[maxn];
int main(){ios::sync_with_stdio(0),cin.tie(0);cin>>n;ll ans=0;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]<=0){ans+=cntge1;}else if(a[i]==1){ans+=i-1;cnte1++,cntge1++;}else{ans+=i-1-cntg1;cntg1++,cntge1++;}
// cout<<ans<<'\n';}cout<<ans;return 0;
}
}
int main(){return asbt::main();}
B. 刷墙
区间 DP。设 \(f_{l,r}\) 表示区间 \([l,r]\) 的最大颜色数量。枚举 \(k\in[l,r)\),考虑优先染一个包含了 \([k,k+1]\) 的颜色,然后再递归 \([l,k]\) 和 \([k+1,r]\) 的子问题。二维前缀和查一下即可。
Code
#include<bits/stdc++.h>
#define il inline
#define lwrb lower_bound
using namespace std;
namespace asbt{
int n,ll[305],rr[305],lsh[605],tot,f[605][605],s[605][605];
il int get(int l1,int l2,int r1,int r2){return s[l2][r2]-s[l1-1][r2]-s[l2][r1-1]+s[l1-1][r1-1];
}
int main(){ios::sync_with_stdio(0),cin.tie(0);cin>>n;for(int i=1;i<=n;i++){cin>>ll[i]>>rr[i];lsh[++tot]=ll[i];lsh[++tot]=rr[i];}sort(lsh+1,lsh+tot+1);tot=unique(lsh+1,lsh+tot+1)-lsh-1;for(int i=1;i<=n;i++){s[lwrb(lsh+1,lsh+tot+1,ll[i])-lsh][lwrb(lsh+1,lsh+tot+1,rr[i])-lsh]++;}for(int i=1;i<=tot;i++){for(int j=1;j<=tot;j++){s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];}}for(int len=2;len<=tot;len++){for(int l=1,r=len;r<=tot;l++,r++){for(int p=l;p<r;p++){f[l][r]=max(f[l][r],f[l][p]+f[p+1][r]+(get(l,p,p+1,r)>0));}}}cout<<f[1][tot];return 0;
}
}
int main(){return asbt::main();}