1. 程式人生 > >【LGR-048 五週年慶賀】洛谷6月月賽

【LGR-048 五週年慶賀】洛谷6月月賽

我居然忘了…忘了…20多分鐘後才開qaq
然後就寫不完啦!gg

A

水題直接算

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 200010
double v,a;
double const g=10;
int main(){
//  freopen("a.in","r",stdin);
    scanf("%lf%lf",&v,&a);
    double vx=v*sin(a),vy=v*cos(a);
    double
t=vy/g; printf("%.4lf %.4lf",vx*t,vy*0.5*t); return 0; }

B

大模擬!我居然改了半天…

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 110
int x=0,n;
char s[N];
inline int read(int l,int r){
    x=0;char ch=s[l];
    while((ch<'0'||ch>'9')&&l<=r) ch=s[++l];
    while
(ch>='0'&&ch<='9'&&l<=r) x=x*10+ch-'0',ch=s[++l]; return l; } double ans=0; inline double calc(int l,int r){ read(l,r);if(!x) x=1; if(s[l]=='H'){ if(s[l+1]=='f') return 178.5*x; if(s[l+1]=='g') return 201*x; return 1*x; }if(s[l]=='C'){ if
(s[l+1]=='a') return 40*x; if(s[l+1]=='l') return 35.5*x; if(s[l+1]=='u') return 64*x; return 12*x; }if(s[l]=='N'){ if(s[l+1]=='a') return 23*x; return 14*x; }if(s[l]=='O') return 16*x; if(s[l]=='F'){ if(s[l+1]=='e') return 56*x; return 19*x; }if(s[l]=='M'){ if(s[l+1]=='g') return 24*x; return 55*x; }if(s[l]=='A'){ if(s[l+1]=='l') return 27*x; if(s[l+1]=='g') return 108*x; return 197*x; }if(s[l]=='S'){ if(s[l+1]=='i') return 28*x; return 32*x; }if(s[l]=='P'){ if(s[l+1]=='t') return 195*x; return 31*x; }if(s[l]=='K') return 39*x; if(s[l]=='Z') return 65*x; if(s[l]=='I') return 127*x; if(s[l]=='B') return 137*x; } inline int solve(int l){ double res=0;l++; for(int i=l+1;i;++i){ if(s[i]==')'){ res+=calc(l,i-1);if(s[i+1]!='_'){ans+=res;return i+1;} int y=read(i+2,n);ans+=res*x;return y+1;} if(s[i]>='A'&&s[i]<='Z') res+=calc(l,i-1),l=i; } } int main(){ // freopen("a.in","r",stdin); scanf("%s",s+1);n=strlen(s+1);int l=1;double tmp=0;s[n+1]='A'; for(int i=2;i<=n+1;++i){ if(s[i]=='~'||s[i]=='('||s[i]>='A'&&s[i]<='Z'){ if(s[l]>='A'&&s[l]<='Z') ans+=calc(l,i-1);l=i; }if(s[i]=='~'){if(s[i+1]=='H') x=1;else read(i+1,n);ans+=18*x;break;} if(s[i]=='('){i=solve(i)-1;continue;} }printf("%.1lf\n",ans); return 0; }

C

貪心,肯定把能量劉前面的更好。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m,a[N];
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();int now=1;double res=m*0.2;
    for(int i=1;i<=n;++i){
        a[i]=read();int x=read();
        while(now<=x) res+=a[now]*0.2,++now;
        if(res<a[i]){puts("-1");return 0;}
        res-=a[i];
    }while(now<=n) res+=a[now]*0.2,++now;
    printf("%.9lf\n",res);
    return 0;
}

D

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 210
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(T==S){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m,L,K,S,C,a[N],s[N][N];
namespace sol1{
    int b[N],ans=0;
    inline void dfs(int x,int y,int z){
        z+=a[x];y+=z/L;z%=L;if(!z) --y,z=L;
        if(x==n){
            int res=0;if(y<m) res-=C*(m-y);
            for(int i=1;i<=K;++i) res+=b[i];ans=max(ans,res);return;
        }int tmp[N];memcpy(tmp,b,sizeof(b));
        for(int i=1;i<=K;++i){
            if(s[x][i]<0){b[i]+=s[x][i];if(b[i]<0) b[i]=0;}
        }dfs(x+1,y,z);memcpy(b,tmp,sizeof(b));
        for(int i=1;i<=K;++i){
            if(s[x][i]>0){b[i]-=s[x][i];if(b[i]<0) b[i]=0;}
        }dfs(x+1,y+1,2);
    }
    inline void gao(){
        for(int i=1;i<=K;++i) b[i]=S;
        dfs(1,1,2);printf("%d\n",ans);
    }
}
namespace sol2{
    int dp[N][N],w[N][N],c[N][N],b[N];//dp[i][j],前i句話,填了>=j行的最大得分  w[i][j],i~j句話一段多少行 c[i][j],i~j句話一段減多少分
    inline void gao(){
        for(int i=1;i<=n;++i) a[i]+=a[i-1],b[i]=b[i-1]+(s[i][1]<0?-s[i][1]:0);
        for(int i=1;i<=n;++i)
            for(int j=i;j<=n;++j) w[i][j]=(a[j]-a[i-1]+2-1)/L+1,c[i][j]=b[j-1]-b[i-1];
        dp[0][0]=S;
        for(int i=1;i<=n;++i){
            for(int j=0;j<=m;++j)
                for(int k=0;k<i;++k)
                    dp[i][j]=max(dp[i][j],dp[k][max(j-w[k+1][i],0)]-c[k+1][i]-(s[k][1]>0?s[k][1]:0));
            for(int j=m-1;j>=0;--j) dp[i][j]=max(dp[i][j],dp[i][j+1]);
        }int ans=0;
        for(int i=0;i<=m;++i) ans=max(ans,dp[n][i]-C*(m-i));
        printf("%d\n",ans);
    }
}
int main(){
    //freopen("a.in","r",stdin);
    n=read();m=read();L=read();K=read();S=read();C=read();
    for(int i=1;i<=n;++i) a[i]=read();
    for(int i=1;i<n;++i)
        for(int j=1;j<=K;++j) s[i][j]=read();
    if(n<=10) sol1::gao();
    else if(K==1) sol2::gao();
    return 0;
}

E

F

賽後A題美滋滋x
看出正解了但是寫不完gg
splay維護一下hash值即可,這個hash值是按權值排序後,第i大的位置的hash。
複雜度O((n+q)logn)

#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define inf 0x3f3f3f3f
#define N 100003
#define k1 11117
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m,q,a[N],b[N],aa[N],fa[N],c[N][2],v[N],w[N],sz[N],h[N],num=0,rt=0;
ull bin[N],hs[N],S=0;
struct Hash_table{
    ull key;int val,next;
}data[N];
inline void Hash_ins(ull key){
    int x=key%N;
    for(int i=h[x];i;i=data[i].next)
        if(data[i].key==key){data[i].val++;return;}
    data[++num].key=key;data[num].val=1;data[num].next=h[x];h[x]=num;
}
inline int findhs(ull key){
    int x=key%N;
    for(int i=h[x];i;i=data[i].next)
        if(data[i].key==key) return data[i].val;
    return 0;
}
inline void update(int x){
    int l=c[x][0],r=c[x][1];
    sz[x]=sz[l]+sz[r]+1;
    hs[x]=hs[l]+bin[sz[l]+1]*(w[x]+hs[r]);
}
inline void rotate(int x,int &k){
    int y=fa[x],z=fa[y],l=x==c[y][1],r=l^1;
    if(y==k) k=x;
    else c[z][y==c[z][1]]=x;
    fa[c[x][r]]=y;fa[y]=x;fa[x]=z;
    c[y][l]=c[x][r];c[x][r]=y;update(y);update(x);
}
inline void splay(int x,int &k){
    while(x!=k){
        int y=fa[x],z=fa[y];
        if(y!=k){
            if(x==c[y][1]^y==c[z][1]) rotate(x,k);
            else rotate(y,k);
        }rotate(x,k);
    }
}
inline void ins(int &p,int x,int Fa){
    if(!p){p=x;fa[p]=Fa;update(p);splay(p,rt);return;}
    if(v[x]<v[p]) ins(c[p][0],x,p);
    else ins(c[p][1],x,p);
}
inline void del(int x){
    splay(x,rt);
    if(!c[x][0]||!c[x][1]){
        rt=c[x][0]+c[x][1];fa[rt]=0;c[x][0]=c[x][1]=0;return;
    }int succ=c[x][1],pre=c[x][0];
    while(c[pre][1]) pre=c[pre][1];
    while(c[succ][0]) succ=c[succ][0];
    splay(pre,rt);splay(succ,c[rt][1]);c[succ][0]=0;fa[x]=0;update(succ);update(rt);
}
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();q=read();bin[0]=1;
    for(int i=1;i<=n;++i) v[i]=read(),w[i]=i;
    for(int i=1;i<=m;++i) b[i]=read(),bin[i]=bin[i-1]*k1,S+=bin[i],ins(rt,i,0);
    for(int i=m;i<=n;++i){
        Hash_ins(hs[rt]-(i-m)*S);if(i==n) break;
        del(i-m+1);ins(rt,i+1,0);
    }memset(fa,0,sizeof(fa));memset(c,0,sizeof(c));rt=0;
    for(int i=1;i<=m;++i) v[i]=b[i],ins(rt,i,0);
    while(q--){
        int x=read(),y=read();del(x);v[x]=y;ins(rt,x,0);
        printf("%d\n",findhs(hs[rt]));
    }return 0;
}