题解:P15018 [UOI 2020 II Stage] 日历
先读原题在食用喔。
我一开始的想法(暴力枚举 TLE)
我第一反应:直接枚举
优化
把
日.月.年:
日.年.月:
月.日.年:
月.年.日:
年.月.日:
年.日.月:
按
- 关于
x 的条件:x\le a_y 且x\le a_z →x\le \min(a_y,a_z) - 关于
y 的条件:y\le a_x 且y\le a_z →y\le \min(a_x,a_z) - 关于
z 的条件:z\le a_x 且z\le a_y →z\le \min(a_x,a_y)
直接固定两个数,快速算第三个数。
试一下固定
从
从
从
另外
怎么快速统计 z 的个数?
可以想到预处理
。
定义
code
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
cin>>n;
vector<int> a(n + 1);
for (int i=1; i<=n; i++) cin>>a[i];
vector<vector<int>> pref(n+2,vector<int>(n+1,0));
for (int t=1; t<=n; t++){
for(int i=1; i<=n; i++) pref[t][i] = pref[t][i-1]+(a[i]>=t?1:0);
}
long long ans=0;
for (int X=1; X<=n; X++) {
for (int Y=1; Y<=n; Y++) {
if X>a[Y]||Y>a[X]) continue;
int low=max(X,Y);
int up=min(a[X],a[Y]);
if(up>=1) ans+=pref[low][up];
}
}
cout<<ans<<endl;
return 0;
}
坑点
- 开 long long:答案可能很大,要用 long long。
- 数组大小:
n \le 5000 ,数组要开5005 。 -
萌新第一篇题解 求过QAQ。