2018年4月1日训练日记

时间:2022-03-05 00:25:27

昨天的比赛,可以说打的非常烂。这场比赛去年打了,当时出了四道题,现在还是四道。所以可以说这次打的非常烂了。

三个人状态都不是很好。本来能轻松搞定的数位dp最后怎么测答案都对1e9都秒出结果,结果居然是TLE。这让我很不解。

赛后换了思路,学习了16进制的输入方法,从头开始重新打一遍,一下就A了。

ZOJ 3962 D.Seven Segment Display / The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple D.数位dp,AC代码如下:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cmath>
#include<map>
#include<string.h>
#define ll long long
using namespace std;
const int maxn=20;
ll dp[maxn][510];
ll a[maxn];
ll n,m,k,x,y,ans,tmp,cnt,sum,len,l,r,d;
ll mp[]={6,2,5,5,4,5,6,3,7,6,6,5,4,5,5,4};
ll dfs(int pos,ll sum,bool limit)
{
    if(pos==-1) return sum;
    if(!limit&&dp[pos][sum]!=-1) return dp[pos][sum];
    int end=limit?a[pos]:15;
    ll ans=0;
    for(int i=0;i<=end;i++)
    {
        ans+=dfs(pos-1,sum+mp[i],limit&&i==end);
    }
    if(!limit) dp[pos][sum]=ans;
    return ans;
}
ll solve(ll x)
{
    if(x<0) return 0;
    memset(a,0,sizeof(a));
    int pos=0;
    while(x)
    {
        a[pos++]=x%16;
        x/=16;
    }
    return dfs(7,0,1);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(dp,-1,sizeof(dp));
        scanf("%lld%llx",&d,&x);//十六进制输入
        d--;
        if(x+d>=4294967296) printf("%lld\n",solve(x+d-4294967296)+solve(4294967295)-solve(x-1));
        else printf("%lld\n",solve(x+d)-solve(x-1));
    }
    return 0;
}

还有一题就是E题 ZOJ 3963 Heap Partition(贪心+set)

自己写的不是TLE就是WA,赛后看了AC的代码。。。真的很妙,弄懂了以后自己赶紧去敲了一发AC:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
typedef long long ll;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
const int mo=1e9+7;
map<int,int>mp;
int n,m,k,nn,mm;
int mmp[maxn];
int c[maxn],f,g;
int a[maxn];
int ans[2000010],num[maxn];
vector<int>vc[maxn];
struct node
{
    int id;
    int v;
    bool operator<(node aa)const
    {
        return a[id]<a[aa.id]||a[id]==a[aa.id]&&id<aa.id;
    }
}q;
int d[maxn];
set<node>st;
set<node>::iterator it;
int main()
{
    int T,t;
    scanf("%d",&T);
    {
        while(T--)
        {
        f=0;st.clear();
        scanf("%d",&n);
       for(int i=1;i<=n;i++)
       {
           mmp[i]=0;
           scanf("%d",&a[i]);
           q.id=i;
           it=st.upper_bound(q);
           if(it==st.begin())
           {
           vc[++f].clear();
           vc[f].push_back(i);
           q.v=f;
           st.insert(q);
           }
           else
           {
               it--;
               node vv=*it;
               mmp[vv.id]--;
               if(mmp[vv.id]==-2) st.erase(it);
               vv.id=i;
               st.insert(vv);
               vc[vv.v].push_back(i);
           }
       }
       printf("%d\n",f);
       int j=0;
       for(int i=1;i<=f;i++)
       {
           int x=vc[i].size();
           printf("%d",x);
           for(int j=0;j<x;j++)
           printf(" %d",vc[i][j]);
           puts("");
       }
       //printf("%d\n",ans);
    }
    }
    return 0;
}
离省赛越来越近了,加油!!!