QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#569967 | #9313. Make Max | yuannn | WA | 50ms | 5284kb | C++14 | 1.8kb | 2024-09-17 12:56:28 | 2024-09-17 12:56:29 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
//赛时想破脑袋都没有出的题目(现在思路一下就打开了)
//最大化操作次数(那么每一次最多选择两个不一样的去操作,而且还是选择最小的去)--》解题核心
//发现只要去数比他大的,没被挡住的数的个数(就是我的贡献),但是实现不了
//1.按着上面那个思路去想,发现一个数能变成什么,最初是由他相邻的数决定的---》解题关键
//2.很多重复的,由于是算贡献,记录数的个数可以有效解决
//按照1的思路只需要考虑从左往右推举行了,但是因为一点问题放弃了
//结果推着推着,又退回来了,就是思路1(只看左边的三个)
//现在是哪一个数,有几个(下标有),先减后增,把样的放在一起,不能分开,否则贡献会少算(会出现这样的性质:与左右两边的数的大小有关)
int n;cin>>n;
vector<int>a(n+5);
for(int i=1;i<=n;i++) cin>>a[i];
a[n+1]=1e9;
int ans=0;
for(int i=1,j,k;i<n;){
j=i;
while(j+1<=n&&a[j]>=a[j+1]) j++;
k=j;
while(k+1<=n&&a[k]<=a[k+1]) k++;
map<int,int>ct;
vector<int>b;
ct[a[i]]=i-1;
for(int x=i;x<=k;x++) ct[a[x]]++,b.push_back(a[x]);
sort(b.begin(),b.end());
b.erase(unique(b.begin(),b.end()),b.end());
for(int x=0;x<b.size();x++) ans+=ct[b[x]]*(b.size()-x-1);
// cout<<i<<" "<<j<<" "<<k<<endl;
i=k;
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--) solve();
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3564kb
input:
4 2 1 2 2 2 2 7 1 1 1 2 2 2 2 3 1 2 3
output:
1 0 3 3
result:
ok 4 number(s): "1 0 3 3"
Test #2:
score: -100
Wrong Answer
time: 50ms
memory: 5284kb
input:
2 198018 875421126 585870339 471894633 383529988 625397685 944061047 704695631 105113224 459022561 760848605 980735314 847376362 980571959 329939331 644635272 326439858 752879510 837384394 175179068 182094523 397239381 1199016 185143405 279638454 252374970 822030887 860312140 137248166 993229443 164...
output:
3954842023 3683192650
result:
wrong answer 1st numbers differ - expected: '4084978', found: '3954842023'