今天补了UVA上的三道题,emmme这三道题也没什么好说的,都是一些比较简单的题,不过想题的时候感觉还是有什么东西在挡着自己的思维,明明很简单的想法题有时候就是A不掉,还是要多做经典题才是,刚又想了一下UVA-1312,想了想之后感觉可写,但是又落实不到代码上,自己的水平还是有些差,不过比起以前来好太多了,以前刷紫书只能粘代码,看人家的思路,现在的话有的题自己想出来的想法和题解一个思路了。还是要多刷题才是。因为一会22:35要去CF打打比赛,所以想去做做CF的题找找感觉。故先把今天的UVA总结一下。
UVA 1618
我自己的思路是中途相遇法,但是读题的时候读错了,所以就导致想法是对的但是一直WA,差点心态崩盘。看网上题解还有用RMQ算法写的,还没见过这个算法,明天可以涉猎一下。
Time limit:n * n * logn
附上AC代码
#include <bits/stdc++.h>
#define FOPI freopen("INPUT.TXT", "r", stdin)
#define DOPI freopen("OUTPUT.TXT", "w", stdout)
#define FOR(i, x, y) for(int i = x; i <= y; i ++)
#define ROF(i, x, y) for(int i = x; i >= y; i --)
using namespace std;
typedef long long int ll;
const int ind=100010,N=1e6+10;
int n;
vector<int> l[N],r[N];
int a[N];
int getans()
{
for(int i=1;i<=n;i++){
l[i].clear();r[i].clear();
for(int j=1;j<i;j++){
if(a[j]>a[i])l[i].push_back(a[j]);
}
for(int j=i+1;j<=n;j++){
if(a[j]<a[i])r[i].push_back(a[j]);
}
sort(l[i].begin(),l[i].end());
sort(r[i].begin(),r[i].end());
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(a[i]<a[j]&&l[i].size()&&r[j].size()){
int t1=lower_bound(l[i].begin(),l[i].end(),a[j])-l[i].begin();
int t2=lower_bound(r[j].begin(),r[j].end(),a[i])-r[j].begin();
if(t1==0||t2==r[j].size())continue;
if(l[i][t1-1]>r[j][t2])return true;
}
}
}
return false;
}
const ll inlld=0x3f3f3f3f3f3f3f3f,mod=998244353;
int main()
{
ios::sync_with_stdio(false);
int t;cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
if(getans()){cout << "YES" << endl;continue;}
// for(int i=1;i<=n;i++)cout << a[i] << ' ';cout << endl;
reverse(a+1,a+1+n);
if(getans()){cout << "YES" << endl;continue;}
cout << "NO" << endl;
}
return 0;
}
/*
3
6
10 30 60 40 20 50
8
30 40 10 20 80 50 60 70
4
1 2 20 9
*/
UVA 11536
知识点:类似于滑动窗口,在保证得到解的情况下尽可能的缩短长度。
这应该不是最优解,卡着时间过的,如果被hack可能就T了。
附上AC代码:
#include <bits/stdc++.h>
#define FOPI freopen("INPUT.TXT", "r", stdin)
#define DOPI freopen("OUTPUT.TXT", "w", stdout)
#define FOR(i, x, y) for(int i = x; i <= y; i ++)
#define ROF(i, x, y) for(int i = x; i >= y; i --)
using namespace std;
typedef long long int ll;
const int ind=0x3f3f3f3f,N=1e6+10;
int f[N];
const ll inlld=0x3f3f3f3f3f3f3f3f,mod=998244353;
int main()
{
ios::sync_with_stdio(false);
map<int,int> mp;
int num=1;
f[1]=1;f[2]=2;f[3]=3;
int t,n,m,k;cin>>t;
while(t--){
cout << "Case " << num++ << ": ";
mp.clear();
cin>>n>>m>>k;
for(int i=4;i<=n;i++)f[i]=(f[i-3]+f[i-2]+f[i-1])%m+1;
int cnt=0,ans=ind,l=1;
for(int i=1;i<=n;i++){
if(f[i]>=1&&f[i]<=k&&mp[f[i]]++==0)cnt++;
if(cnt==k){
while(f[l]<1||f[l]>k||mp[f[l]]>1){
mp[f[l++]]--;
}
ans=min(ans,i-l+1);
}
}
if(ans==ind)cout << "sequence nai\n";
else cout << ans << endl;
}
return 0;
}
/*
2
20 12 4
20 12 8
*/
UVA 1619
思路:让数组中的每一个数都当做自己min,然后向左向右尽可能延伸的更长,从而贪心得到最优解。
注意向左向右延伸的时候类似于一种链式关系,从而可以减少代码跑的时间,要不然n * n就T了。
附上AC代码
#include <bits/stdc++.h>
#define FOPI freopen("INPUT.TXT", "r", stdin)
#define DOPI freopen("OUTPUT.TXT", "w", stdout)
#define FOR(i, x, y) for(int i = x; i <= y; i ++)
#define ROF(i, x, y) for(int i = x; i >= y; i --)
using namespace std;
typedef long long int ll;
const int ind=0x3f3f3f3f,N=1e6+10;
int a[N];
int l[N],r[N];ll sum[N];
const ll inlld=0x3f3f3f3f3f3f3f3f,mod=998244353;
int main()
{
ios::sync_with_stdio(false);
int n;
int fg=1;
while(cin>>n){
if(fg)fg=0;
else cout << endl;
memset(sum,0,sizeof(sum));
memset(a,-1,sizeof(a));
for(int i=1;i<=n;i++){cin>>a[i];l[i]=r[i]=i;}
sum[1]=a[1];
for(int i=2;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=n;i++){
while(a[i]<=a[l[i]-1])l[i]=l[l[i]-1];
}
for(int i=n;i>=1;i--){
while(a[i]<=a[r[i]+1])r[i]=r[r[i]+1];
}
ll ans=(ll)a[1]*(ll)a[1],L=1,R=1;
for(int i=1;i<=n;i++){
ll cnt=(sum[r[i]]-sum[l[i]-1])*a[i];
if(cnt>ans||(cnt==ans&&R-L>r[i]-l[i])){
ans=cnt;
L=l[i];R=r[i];
}
}
cout << ans << endl;
cout << L << ' ' << R << endl;
}
return 0;
}
/*
6
3 1 6 4 5 2
*/
准备准备该去打CF去喽,溜了。