1. 程式人生 > >2018.08.21【2018提高組】模擬A組 & B組小結

2018.08.21【2018提高組】模擬A組 & B組小結

今天看起來有兩個A組,實際上一個也沒有

8:20 看完題目(哇,三道題都好可做啊)
T1打了 n 4 做法(stupid++)(雖然 n

4 本來就能過)
8:40打完
T2打了個splay(常數爆炸)(stupid++)
9:20打完
T3打80分暴力
9:30打完
(開始無所事事)
10:00 ( ⊙ o ⊙ )啊!T1好像有 n 3 做法(碼碼碼)
10:20碼完
10:30 誒Σ(⊙▽⊙”)T2會不會常數太大了(想想想)
10:35 不是可以用二分嗎,
n l o g 2 2 而已(splay的log和二分快排的log是完全不一樣的)
繼續想想想
10:40 先一開始排序一下就好了(碼碼碼)
10:57 碼完(無所事事)
估分100+100+80=280
11:30 比賽結束
估分=得分


T1題解
列舉左上頂點和右上頂點,二維字首和維護
列舉左邊界右邊界,再掃一遍
題目連結http://172.16.0.132/senior/#main/show/5838
T2題解
1:常數十分優美的資料結構加O3
2:二分ans再O(n)判斷
T3題解
還沒切,待填
大概就是DP用樹狀陣列優化一下


T1程式碼來自石家莊的O3

%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <cstdio>
#define ll long long
using namespace std;
__attribute__((optimize("-O3")))
int n,m;
ll ans;
ll a[201][201],f[201][201];
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
        scanf("%lld",&a[i][j]);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++) 
        f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
    ans=0;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++) 
            for (int k=i;k<=n;k++)
                for (int l=j;l<=m;l++) 
                ans=max(ans,f[k][l]-f[k][j-1]-f[i-1][l]+f[i-1][j-1]);
    printf("%lld",ans);
    return 0;
}

T1正經程式碼

#include<bits/stdc++.h>
#define fo(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
long long n,m,a[201][201],qz[201][201],q,ans,sum;
inline void max(long long &x,long long y){x=x>y?x:y;}
int main()
{
    scanf("%lld%lld",&n,&m);
    fo(i,1,n)fo(j,1,m)scanf("%lld",&a[i][j]);
    fo(i,1,n)fo(j,1,m)qz[i][j]=a[i][j]+qz[i][j-1];
    fo(i,1,m)fo(j,i,m){sum=0;fo(k,1,n)sum+=(qz[k][j]-qz[k][i-1]),max(ans,sum),sum=(sum<0?0:sum);}
    printf("%lld",ans);
}

T2各種被卡常的程式碼(來自597大爺)

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 600000
#define LIMIT 1000000000
int n;
long long d;
int ox[MAXN+1],oy[MAXN+1];
int nx[MAXN+1],ny[MAXN+1],maxx,maxy; 
int tmp[MAXN+1];
inline bool cmpx(int a,int b){return ox[a]<ox[b];}
inline bool cmpy(int a,int b){return oy[a]<oy[b];}
struct Tree_array{
#define lowbit(x) ((x)&-(x))
    int n;
    long long t[MAXN+1];
    inline void change(int x,long long c){
        while (x<=n){
            t[x]+=c;
            x+=lowbit(x);
        }
    }
    inline long long query(int x){
        long long res=0;
        while (x){
            res+=t[x];
            x-=lowbit(x);
        }
        return res;
    }
} numx,sumx,numy,sumy;
int main(){
    scanf("%d%lld",&n,&d);
    for (int i=1;i<=n;++i)
        scanf("%d%d",&ox[i],&oy[i]); 
    for (int i=1;i<=n;++i)
        tmp[i]=i;
    sort(tmp+1,tmp+n+1,cmpx);
    maxx=0;
    for (int i=1;i<=n;++i){
        if (ox[tmp[i]]!=ox[tmp[i-1]])
            ++maxx;
        nx[tmp[i]]=maxx;
    }
    for (int i=1;i<=n;++i)
        tmp[i]=i;
    sort(tmp+1,tmp+n+1,cmpy);
    maxy=0;
    for (int i=1;i<=n;++i){
        if (oy[tmp[i]]!=oy[tmp[i-1]])
            ++maxy;
        ny[tmp[i]]=maxy;
    }
    numx.n=sumx.n=maxx;
    numy.n=sumy.n=maxy;
    for (int i=1;i<=n;++i){
        d-=ox[i]*(numx.query(nx[i])*2-numx.query(maxx))-(sumx.query(nx[i])*2-sumx.query(maxx))+ oy[i]*(numy.query(ny[i])*2-numy.query(maxy))-(sumy.query(ny[i])*2-sumy.query(maxy));
        if (d<0){
            printf("%d\n",i);
            return 0;
        }
        numx.change(nx[i],1);
        sumx.change(nx[i],ox[i]);
        numy.change(ny[i],1);
        sumy.change(ny[i],oy[i]); 
    }
    printf("-1\n");
    return 0;
}

T2優美二分程式碼

#include<bits/stdc++.h>
using namespace std;
struct ymq{long long x;long long y;};
ymq a[700001],b[700001];
long long c[700001],tot,n,d,i,l,r,mid;
bool cmp(ymq x,ymq y){return x.x<y.x;}
bool check(long long x)
{
    tot=0;
    long long ans=0,j=0;
    for(long long i=1;i<=n;i++)if(a[i].y<=x)tot++,c[tot]=a[i].x;
    for(long long i=1;i<=tot;i++)ans=ans+c[i]*(i-1)-j,j+=c[i];
    j=0,tot=0;
    for(long long i=1;i<=n;i++)if(b[i].y<=x)tot++,c[tot]=b[i].x;
    for(long long i=1;i<=tot;i++)ans=ans+c[i]*(i-1)-j,j+=c[i];
    if(ans>d)return true;
    return false;
}
int main()
{
    scanf("%lld%lld",&n,&d);
    for(i=1;i<=n;i++)scanf("%lld%lld",&a[i].x,&b[i].x),a[i].y=b[i].y=i;
    sort(a+1,a+n+1,cmp);
    sort(b+1,b+n+1,cmp);
    l=0,r=n+1,mid=(l+r+1)>>1;
    while(l<r-1)
    {
        if(check(mid)==true)
        {
            r=mid,mid=(l+r+1)>>1;
        }
        else
        {
            l=mid,mid=(l+r+1)>>1;
        }
    }
    if(r==n+1)printf("-1");else printf("%lld",r);
}

T380分暴力

#include<bits/stdc++.h>
#define mo 1000000007
using namespace std;
long long f[100005],a[100005],qz[100005],i,j,n,m,ans;
long long ksm(long long a,long long b){return(b)?ksm(a*a%mo,b>>1)*((b&1)?a:1)%mo:1;}
int main()
{
    scanf("%lld%lld",&n,&m);
    for(i=1;i<=n;i++)scanf("%lld",&a[i]),a[i]=(!a[i]?-1:1),qz[i]=qz[i-1]+a[i];
    if(n<=8000)
    {
        f[0]=1;
        for(i=1;i<=n;i++)for(j=0;j<=i-1;j++)if(abs(qz[i]-qz[j])<=m)f[i]=f[i]+f[j],f[i]=(f[i]>mo?f[i]-mo:f[i]);
        printf("%lld",f[n]);
        return 0;
    }
    if(m==0)
    {
        for(i=1;i<=n-1;i++)if(qz[i]==0)ans++;
        if(qz[n]!=0)
        {
            printf("0");
            return 0;
        }
        printf("%lld",ksm(2,ans));
        return 0;
    }
    f[0]=1,j=1;
    for(i=1;i<=n;i++)
    {
        f[i]=j,j=j+f[i];
        if(i-m>=0)j-=f[i-m];
        j=(j+mo)%mo;
    }
    printf("%lld\n",f[n]);
}