UVA-1618 UVA-11536 UVA-1619(汇总)(好久没更新博客了,,罪过)

今天补了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去喽,溜了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值