• ccpc 2019网络选拔赛


    先存一下几个较难题的AC代码:

    1002:

    #include<bits/stdc++.h>
    
    using namespace std;
    #define fi first
    #define se second
    const int maxn=15000000;
    const int N=110000;
    int T;
    int n,m;
    int sum[maxn],pos,a[N];
    struct node
    {
        int ll,rr;
    }tr[maxn];
    pair<int,int> b[N];
    map<int,int> idx;
    set<int> del_nums; 
    set<int>::iterator it;
    int f[N];
    inline int lowbit(int x)
    {
        return x&-x;
    }
    int root1[N],root2[N],pp[N];
    int copy(int x)
    {
        ++pos;
        sum[pos]=sum[x];
        tr[pos].ll=tr[x].ll;
        tr[pos].rr=tr[x].rr;
        return pos;
    }
    void add(int k,int l,int r,int x)
    {
        sum[k]++;
        if (l==r) return;
        int mid=(l+r)/2;
        if (x<=mid)
        {
            tr[k].ll=copy(tr[k].ll);
            add(tr[k].ll,l,mid,x);
        }
        else
        {
            tr[k].rr=copy(tr[k].rr);
            add(tr[k].rr,mid+1,r,x);
        }
    }
    int ask(int k,int l,int r,int x)
    {
        if (sum[k]==0) return n+1;
        if (l==r) return l;
        int mid=(l+r)/2;
        if (l>=x)
        {
            if (sum[tr[k].ll]) return ask(tr[k].ll,l,mid,x);
            else return ask(tr[k].rr,mid+1,r,x);
        }
        else
        {
            int res;
            if (mid<x) res=n+1;
            else res=ask(tr[k].ll,l,mid,x);
            if (res==n+1) return ask(tr[k].rr,mid+1,r,x);
            else return res;
        }
    }
    int main()
    {
        scanf("%d",&T);
        while (T--)
        {
            scanf("%d %d",&n,&m);
            for (int i=1;i<=n;i++)
                scanf("%d",&a[i]),b[i].fi=a[i],b[i].se=i,pp[i]=0;
            sort(b+1,b+1+n);
            reverse(b+1,b+1+n);
            idx.clear();
            for (int i=1;i<=n;i++)
                idx[a[i]]=i;
            for (int i=1;i<=n;i++)
            {
                if (i>1&&b[i].fi+1==b[i-1].fi) f[b[i].se]=f[b[i-1].se];
                else f[b[i].se]=b[i].fi;
            }
            pos=0;
            root2[n+1]=copy(0);
            for (int i=n;i>=1;i--)
            {
                root2[i]=copy(root2[i+1]);
                add(root2[i],1,n,a[i]);
            }
            int lastans=0;
            del_nums.clear();
            del_nums.insert(n+1);
            while (m--)
            {
                int op,x,r,k;
                scanf("%d",&op);
                if (op==1)
                {
                    scanf("%d",&x);
                    x=x^lastans;
                    if (!pp[x])
                    {
                        int tmp=x;
                        pp[x]=1;
                        del_nums.insert(a[x]);
                        idx.erase(a[x]);
                    }
                }
                else
                {
                    scanf("%d %d",&r,&k);
                    r=r^lastans;
                    k=k^lastans;
                    if (!idx.count(k)||idx[k]>r) printf("%d
    ",k),lastans=k;
                    else
                    {
                        int pos=idx[k];
                        int x=f[pos];
                        int y;
                        if (r==n) y=n+1;
                        else y=ask(root2[r+1],1,n,k);
                        it=del_nums.lower_bound(k);
                        int z=*it;
                        lastans=min(x,min(y-1,z-1))+1;
                        printf("%d
    ",lastans);
                    }
                }
            }
        }
            
        return 0;
    }
    

    1003:

    #include<bits/stdc++.h>
    #define ll long long
    #define endl '
    '
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #define ull unsigned long long
    #define fi first
    #define se second
    #define mp make_pair
    #define pii pair<ll,ll>
    #define all(x) x.begin(),x.end()
    #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
    #define per(ii,a,b) for(int ii=b;ii>=a;--ii)
    using namespace std;//head
    const int maxn=1e6+10,maxm=3e5+10;
    const ll INF=0x3f3f3f3f,mod=1e9+7;
    int casn,n,m,k;
    const int csize=128;
    char s[maxn];
    namespace suffix{
      int sa[maxn],h[maxn],rank[maxn];
      int x[maxn],y[maxn],c[maxn];
       void geth(int n){
        int j,k=0;
        rep(i,1,n)rank[sa[i]]=i;
        rep(i,1,n){
          if(k)k--;
          j=sa[rank[i]-1];
          while(s[i+k]==s[j+k])k++;
          h[rank[i]]=k;
        }
      }
      void getsa(int n,int m){
        rep(i,1,m)c[i]=0;
        rep(i,1,n)c[x[i]=s[i]]++;
        rep(i,1,m)c[i]+=c[i-1];
        per(i,1,n)sa[c[x[i]]--]=i;
        for(int k=1;k<=n;k<<=1){
          int p=1;
          rep(i,n-k+1,n)y[p++]=i;
          rep(i,1,n) if(sa[i]>=k+1)y[p++]=sa[i]-k;
          rep(i,1,m)c[i]=0;
          rep(i,1,n)c[x[y[i]]]++;
          rep(i,1,m)c[i]+=c[i-1];
          per(i,1,n)sa[c[x[y[i]]]--]=y[i];
          swap(x,y);
          p=1;x[sa[1]]=1;
          rep(i,2,n)
            x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p:++p;
          if(p>=n)break;
          m=p;
        }
        geth(n);
      }
    }
    const int maxp=20;
    class stable{public:
      int logn[maxn],dp[maxp][maxn];
      void init(int n=maxn-1){
        logn[2]=1;
        rep(i,3,n) logn[i]=logn[i>>1]+1;
      }
      void cal(int *a,int n){//init(n)
        rep(i,1,n) dp[0][i]=a[i];
        rep(j,1,maxp) for(int i=1;i+(1<<j)-1<=n;++i)
          dp[j][i]=min(dp[j-1][i],dp[j-1][i+(1<<(j-1))]);
      }
      inline int query(int l,int r){
        int lg=logn[r-l+1];
        return min(dp[lg][l],dp[lg][r-(1<<lg)+1]);
      }
    }st;
    namespace tree{
    #define nd seg[now]
    #define ndp seg[pre]
    #define mid ((s+t)>>1)
      int rt[maxn],size;
      struct node{int l,r,sum;}seg[maxn*30];
      void init(){
        size=0;fill_n(rt,n+1,0);
      }
      void maketree(int s=1,int t=n,int &now=rt[0]){
          now=++size;nd={s,t,0};
          if(s==t) return ;
          maketree(s,mid,nd.l);maketree(mid+1,t,nd.r);
      }
      void update(int &now,int pre,int k,int s=1,int t=n){
          now=++size;nd=ndp,nd.sum++;
          if(s==t) return ;
          if(k<=mid)update(nd.l,ndp.l,k,s,mid);
          else update(nd.r,ndp.r,k,mid+1,t);
      }
      int query(int now,int pre,int k,int s=1,int t=n){
          if(s==t) return s;
          int sum=seg[ndp.l].sum-seg[nd.l].sum;
          if(k<=sum) return query(nd.l,ndp.l,k,s,mid);
          else return query(nd.r,ndp.r,k-sum,mid+1,t);
      }
      inline int kth(int l,int r,int k){
        return query(rt[l-1],rt[r],k);
      }
      inline void up(int a,int x){
        update(rt[a],rt[a-1],x);
      }
    #undef mid
    };
    int query(int s,int t,int k){
      int pos=suffix::rank[s];
      int l=1,r=pos-1,len=t-s+1;
      int s0=pos,t0=pos;
      while(l<=r){
        int mid=(l+r)>>1;
        if(st.query(mid+1,pos)>=len) s0=mid,r=mid-1;
        else l=mid+1;
      }
      l=pos+1,r=n;
      while(l<=r){
        int mid=(l+r)>>1;
        if(st.query(pos+1,mid)>=len) t0=mid,l=mid+1;
        else r=mid-1;
      }
      if(t0-s0+1<k) return -1;
      else return tree::kth(s0,t0,k);
    }
    int main() {IO;
      cin>>casn;
      st.init();
      while(casn--){
        cin>>n>>m>>(s+1);
        suffix::getsa(n,128);
        st.cal(suffix::h,n);
        tree::init();
        tree::maketree(1,n);
        rep(i,1,n) tree::up(i,suffix::sa[i]);
        while(m--) {
          int l,r,k;cin>>l>>r>>k;
          cout<<query(l,r,k)<<endl;
        }
      }
    }
    

    1005:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn = 1e6+10;
    const ll mod = 1e9+7;
    const ll inv2 = 5e8+4;
    const ll inv6 = 166666668;
    
    int prime[maxn], phi[maxn];
    ll sum[maxn];
    bool vis[maxn];
    int cnt = 0;
    
    void init() {
        phi[1] = 1;
        for(int i = 2; i < maxn; i++) {
            if(!vis[i])  prime[++cnt] = i, phi[i] = i-1;;
            for(int j = 1; j <= cnt && i*prime[j] < maxn; j++) {
                vis[i*prime[j]] = true;
                if(i%prime[j] == 0)  {
                    phi[i*prime[j]] = phi[i]*prime[j];
                    break;
                }
                else phi[i*prime[j]] = phi[i]*(prime[j]-1);
            }
        }
        sum[0] = 0;
        for(int i = 1; i < maxn; i++) {
            sum[i] = (sum[i-1]+1ll*i*phi[i])%mod;
        }
    }
    
    unordered_map<ll, ll> mp;
    
    ll one(ll n) {
        n %= mod;
        return n*(n+1)%mod*inv2%mod;
    }
    
    ll squ(ll n) {
        n %= mod;
        return n*(n+1)%mod*((2*n+1)%mod)%mod*inv6%mod;
    }
    
    ll F(ll n) {
        if(n < maxn)  return sum[n];
        if(mp.count(n))  return mp[n];
        ll res = squ(n);
        for(ll l = 2, r; l <= n; l = r+1) {
            r = n/(n/l);
            ll tmp = (one(r)-one(l-1)+mod)%mod;
            res -= tmp*F(n/l)%mod;
            if(res < 0)  res += mod;
        }
        return mp[n] = res;
    }
    
    int main() {
        init();
        int T;
        scanf("%d", &T);
        while(T--) {
            ll n, a, b;
            scanf("%lld%lld%lld", &n, &a, &b);
            ll tmp = F(n);
            ll ans = (tmp+1)*inv2%mod;
            ans = (ans-1+mod)%mod;
            printf("%lld
    ", (ans%mod+mod)%mod);
        }
        return 0;
    }
    

     1008:

    #pragma GCC optimize("Ofast")
    #include<bits/stdc++.h>
    #define ll long long
    #define ull unsigned long long
    #define fi first
    #define se second
    #define mp make_pair
    #define pii pair<ll,ll>
    #define all(x) x.begin(),x.end()
    #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
    #define per(ii,a,b) for(int ii=b;ii>=a;--ii)
    #define forn(i,x,g,e) for(int i=g[x];i;i=e[i].next)
    #define show(x) cout<<#x<<"="<<x<<endl
    #define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
    #define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
    #define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
    #define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
    #define show5(v,w,x,y,z) cout<<#v<<"="<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
    #define showmm(x,a,b) rep(i,0,a) rep(j,0,b) cout<<#x<<'['<<i<<']'<<'['<<j<<"]="<<x[i][j]<<(" 
    "[j==b])
    #define showm(x,a,b) rep(i,0,a) rep(j,0,b) cout<<x[i][j]<<(" 
    "[j==b])
    #define showa1(x,a,b) rep(i,a,b) showa(x,i);cout<<endl
    #define showa2(x,a,b) rep(i,a,b) cout<<x[i]<<' ';cout<<endl
    using namespace std;
    const int maxn=1e5+10,maxm=3e5+10;
    const ll INF=0x3f3f3f3f,mod=1e9+7;
    int casn,n,m,k,cnt = 1;
    priority_queue<int> que;
    int main() {
        IO;
        cin>>casn;
        while (casn--) {
            cin >>n>>k;
            cnt=1;
            ll sum=k;
            while(!que.empty()) que.pop();
            rep(i,1,n){
                ll tmp=0;
                cin>>tmp;
                cnt+=tmp/k;
                sum+=tmp;
                if (tmp%k)que.push(tmp%k);
            }
            rep(i,cnt,n-1) {
                sum+=k-que.top();
                que.pop();
            }
            cout<<sum<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    C 应用
    C 基本语法
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
  • 原文地址:https://www.cnblogs.com/nervendnig/p/11403247.html
Copyright © 2020-2023  润新知