2019 杭电多校第六场 题解

比赛记录

注意随机数据 ,1-n排列这种,一般都有啥暴力重构之类的方法,期望重构次数很少之类的

1005也是这样,因为n^2但只有n个值有数,所以就可以n^2logn

题解


1001 Salty Fish

unsolved.

1002 Nonsense Time 

 https://blog.csdn.net/liufengwei1/article/details/98785302

代码:

#include
#define maxl 50010
using namespace std;
 
int n,mxid,mxval;
int a[maxl],kk[maxl],dy[maxl],ans[maxl];
int b[maxl],dp[maxl],frm[maxl];
bool in[maxl],froz[maxl];
 
inline void prework()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]),dy[a[i]]=i;
    for(int i=1;i<=n;i++)
        scanf("%d",&kk[i]),froz[i]=false;
}
 
inline void upd(int i,int x)
{
    while(i<=n)
    {
        if(dp[b[i]]<dp[x])
            b[i]=x;
        i+=i&-i;
    }
}
 
inline int qry(int i)
{
    int res=0;
    while(i)
    {
        if(dp[res]<dp[b[i]])
            res=b[i];
        i-=i&-i;
    }
    return res;
}
 
inline void lis()
{
    for(int i=1;i<=n;i++)
        in[i]=false,frm[i]=0,b[i]=0,dp[i]=0;
    int id;mxval=0;mxid=0;
    for(int i=1;i<=n;i++)
    if(!froz[i])
    {
        id=qry(a[i]);
        dp[i]=dp[id]+1;frm[i]=id;
        if(dp[i]>mxval)
            mxval=dp[i],mxid=i;
        upd(a[i],i);
    }
    int u=mxid;
    while(u!=0)
        in[u]=true,u=frm[u];
}
 
inline void mainwork()
{
    lis();
    for(int i=n;i>=1;i--)
    {
        ans[i]=mxval;
        froz[kk[i]]=true;
        if(in[kk[i]])
            lis();
    }
}
 
inline void print()
{
    for(int i=1;i<=n;i++)
        printf("%d%c",ans[i],(i==n)?'\n':' ');
}
 
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        prework();
        mainwork();
        print();
    }
    return 0;
}
View Code

 

1003 Milk Candy

unsolved.

 1004 Speed Dog

unsolved.

1005 Snowy Smile

 https://blog.csdn.net/liufengwei1/article/details/98762357

代码:

#include
#define maxl 2010
using namespace std;
 
int n,totx,toty;
int ax[maxl],ay[maxl],w[maxl];
long long ans;
long long a[maxl];
int numx[maxl],numy[maxl];
struct node
{
    int l,r;
    long long sum,lrmx;
    long long rmx,lmx;
}tree[maxl*4];
vector <int> tmpy[maxl];
 
inline void prework()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&ax[i],&ay[i],&w[i]);
        numx[i]=ax[i];numy[i]=ay[i];
    }
    sort(numx+1,numx+1+n);
    totx=unique(numx+1,numx+1+n)-numx-1;
    for(int i=1;i<=totx;i++)
        tmpy[i].clear();
    for(int i=1;i<=n;i++)
    {    
        ax[i]=lower_bound(numx+1,numx+1+totx,ax[i])-numx;
        tmpy[ax[i]].push_back(i);
    }
    sort(numy+1,numy+1+n);
    toty=unique(numy+1,numy+1+n)-numy-1;
    for(int i=1;i<=n;i++)
        ay[i]=lower_bound(numy+1,numy+1+toty,ay[i])-numy;
}
 
inline void pushup(int k)
{
    int ls=k<<1,rs=k<<1|1;
    tree[k].sum=tree[ls].sum+tree[rs].sum;
    tree[k].lrmx=max(tree[ls].lrmx,tree[rs].lrmx);
    tree[k].lrmx=max(tree[k].lrmx,tree[ls].rmx+tree[rs].lmx);
    tree[k].lmx=max(tree[ls].lmx,tree[rs].lmx+tree[ls].sum);
    tree[k].rmx=max(tree[rs].rmx,tree[ls].rmx+tree[rs].sum);
}
 
inline void build(int k,int l,int r)
{
    tree[k].l=l;tree[k].r=r;
    if(l==r)
    {
        tree[k].sum=a[l];
        tree[k].lrmx=tree[k].lmx=tree[k].rmx=max(0ll,a[l]);
        return;
    }
    int mid=(l+r)>>1,ls=k<<1,rs=k<<1|1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(k);
}
 
inline void upd(int k,int l)
{
    if(tree[k].l==tree[k].r)
    {
        tree[k].sum=a[l];
        tree[k].lrmx=tree[k].lmx=tree[k].rmx=max(0ll,a[l]);
        return;        
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(l<=mid)
        upd(k<<1,l);
    else
        upd(k<<1|1,l);
    pushup(k);
}
 
inline void mainwork()
{
    ans=0;int l,id;
    for(int lowx=1;lowx<=totx;lowx++)
    {
        for(int i=1;i<=toty;i++)
            a[i]=0;
        build(1,1,toty);
        for(int upx=lowx;upx<=totx;upx++)
        {
            l=tmpy[upx].size();
            for(int i=0;i)
            {
                id=tmpy[upx][i];
                a[ay[id]]+=w[id];
                upd(1,ay[id]);
            }
            ans=max(tree[1].lrmx,ans);
        }
    }
}
 
inline void print()
{
    printf("%lld\n",ans);
}
 
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        prework();
        mainwork();
        print();
    }
    return 0;
}
View Code

 

1006 Faraway

unsolved.

 

1007 Support or Not

unsolved.

 

1008 TDL

 

#include
using namespace std;
typedef long long LL;
const int up=1005;
const LL INF=2e18;//!
int m;
bool check(long long n,long long kn)
{
    int cnt=0; 
    if(n==0)
        return false; 
    for(long long i=n+1;;i++)
    if(__gcd(n,i)==1)
    {
        cnt++;
        if(cnt==m) 
            return kn==i;
    }
    return false;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
         LL k,n;
         scanf("%lld%d",&k,&m);
         LL ans=INF;
         for(int i=1;i<=up;i++)
        {
            n=i^k;
            if(check(n,i+n)) 
                ans=min(ans,n);
        }
        if(ans==INF)
        {
            puts("-1");
        }
        else
        {
            printf("%lld\n",ans);
        }
    }
    return 0;
}
View Code

 

1009 Three Investigators

unsolved.

 

1010 Ridiculous Netizens

unsolved.

 

1011 11 Dimensions

unsolved.

 

1012 Stay real

#include
#define maxl 100010
#define mp make_pair
using namespace std;

int n;
int a[maxl];
long long ans1,ans2;
typedef pair<int,int> p;
priority_queue

q; bool in[maxl]; inline void prework() { while(!q.empty()) q.pop(); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]),in[i]=true; if(i*2>n) q.push(mp(a[i],i)); } } inline void mainwork() { p d;ans1=0,ans2=0; for(int i=1;i<=n;i++) { d=q.top();q.pop(); in[d.second]=false; if(!in[d.second] && !in[d.second^1]) q.push(mp(a[d.second/2],d.second/2)); if(i&1) ans1+=d.first; else ans2+=d.first; } } inline void print() { printf("%lld %lld\n",ans1,ans2); } int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++) { prework(); mainwork(); print(); } return 0; }

View Code

 


 

你可能感兴趣的:(2019 杭电多校第六场 题解)