传送门 题意:要求较左边的数对 3 取余的结果小于等于较右边的数对 3 取余的结果(所以必须是左边数的在x,右边的数在y)
思路:暴力可以过一部分案列。使用后缀和,记录每个元素的价值。
如果前缀和是递增的话,后缀和是逆向递增。
using namespace std;
const ll maxn = 1e6 + 7;
const ll mod = 1e8;
ll a[maxn], suf[maxn][3];
int main()
{
ll n;
cin>>n;
ll ans=0;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=n-1;i>0;i--)
{
for(int j=0;j<3;j++)
suf[i][j]=suf[i+1][j];
suf[i][a[i]%3]++;//储存每个元素的价值
}
for(int i=0;i<n;i++)
{
for(int j=a[i]%3;j<3;j++)
ans+=suf[i+1][j];//元素
}
cout<<ans<<endl;
return 0;
}