• 暑假第十七测


    题解:

    第一题

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int M = 1e5 + 10;
    ll a[M], b[M], ans;
    priority_queue <ll, vector<ll> , greater<ll> > Q;
    int main(){
        freopen("buy.in","r",stdin);
        freopen("buy.out","w",stdout);
        int n;
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)scanf("%I64d", &a[i]);
        for(int i = 1; i <= n; i++)scanf("%I64d", &b[i]);
        for(int i = 1; i <= n; i++){
            Q.push(a[i]);
            if(!Q.empty()){
                int u = Q.top();
                if(u < b[i]) {
                    ans += b[i] - u;
                    Q.pop();
                    Q.push(b[i]);    
                }
            }
        }
        printf("%I64d
    ",ans);
    }
    View Code

    第二题:

    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long;
    const int M = 1e5 + 10;
    int n, a[M], sum[M];
    struct Node{
        int mx, tag;
        Node *ls, * rs;
        void up(){
            mx = max(ls->mx, rs->mx);
        }
        void down(){
            if(tag){
                ls->tag += tag; rs->tag += tag;
                ls->mx += tag; rs->mx += tag;
            }
            tag = 0;
        }
    }pool[M << 2], *tail = pool, *root;
    Node * build(int lf = 1, int rg = n){
        Node * nd = ++tail;
        if(lf == rg);
        else {
            int mid = (lf + rg) >> 1;
            nd->ls = build(lf, mid);
            nd->rs = build(mid + 1, rg);
        }
        return nd;
    }
    #define Ls nd->ls, lf, mid
    #define Rs nd->rs, mid+1, rg
    void insert(int pos, int val, Node * nd = root, int lf = 1, int rg = n){
        if(lf == rg)nd->mx = val;
        else {
            int mid = (lf + rg) >> 1;
            if(pos <= mid)insert(pos, val, Ls);
            else insert(pos, val, Rs);
            nd->up();
        }
    }
    void modify(int L, int R, int val, Node * nd = root, int lf = 1, int rg = n){
        if(L <= lf && rg <= R){
            nd->mx += val;
            nd->tag += val;
        }
        else {
            nd->down();
            int mid = (lf + rg) >> 1;
            if(L <= mid)modify(L, R, val, Ls);
            if(R > mid) modify(L, R, val, Rs);
            nd->up();
        }
    }
    int query(int L, int R, Node * nd = root, int lf = 1, int rg = n){
        if(L <= lf && rg <= R)return nd->mx;
        else {
            nd->down();
            int mid = (lf + rg) >> 1;
            int ans = -2e9;
            if(L <= mid)ans = query(L, R, Ls);
            if(R > mid) ans = max(ans, query(L, R, Rs));
            return ans;
        }
        
    }
    
    int main(){
        freopen("invest.in","r",stdin);
        freopen("invest.out","w",stdout);
        int s, e;
        int ans = -2e9;
        scanf("%d%d%d", &n, &s, &e);
        root = build();
        for(int i = 1; i <= e; i++){
            scanf("%d", a + i);
            sum[i] = sum[i - 1] + a[i];
            insert(i, sum[i]);
        }
        int llf = 1, lf = s, rg = e, now = 1;
        ans = max(ans, query(lf, rg));
        //cout<<ans<<endl;
        for(int i = e+1; i <= n; i++){
            scanf("%d", a + i);
            sum[i] = sum[i - 1] + a[i];
            lf++, rg++;
            insert(rg, sum[i] - sum[i - e]);
            modify(llf+1, rg - 1, -a[now]);
            llf++;
            now++;
            int p = query(lf, rg);
            ans = max(ans, p);
            //cout<<ans<<endl;
        }
        for(int i = llf; i + s - 1 <= n; i++){
        
            modify(llf+1, n, -a[llf]);
            llf++;     
            ans = max(ans, query(i+s-1, n));
        }
        
        printf("%d
    ",ans);
        return 0;
    }
    View Code
    #include<stdio.h>
    int a[100002],k[100002];
    int max(int x,int y)
    {
        return x>y?x:y; 
    }
    int qin()
    {
        char ch;
        int in=0;
        bool flag=0;
        while(ch!='-'&&!(ch>='0'&&ch<='9')) 
          ch=getchar();
        if(ch=='-')
        {
          flag=1;
          ch=getchar();
        }
        do
        {
          in=in*10+ch-'0';
          ch=getchar();
        }
        while(ch>='0'&&ch<='9');
        if(flag)
          in*=-1;
        return in;
    }
    int co()
    {
        freopen("invest.in","r",stdin);
        freopen("invest.out","w",stdout);
        int n,i,t,head,tail,s,ans=-10000000,j;
        scanf("%d%d%d",&n,&s,&t);
        for(i=1;i<=n;i++)
          a[i]=a[i-1]+qin();
        head=tail=1;
        for(i=s;i<=n;i++)
        {
            while(head<tail&&i-k[head]>t) head++;
            while(head<tail&&a[i-s]<a[k[tail-1]]) tail--;//k[a[i]]?????
            k[tail++]=i-s;
            ans=max(ans,a[i]-a[k[head]]);
        }
        printf("%d
    ",ans); 
    }
    int ccc=co();
    int main(){;
    }
    View Code

     第三题:

    #include<bits/stdc++.h>
    using namespace std;
    const int M = 1e6 + 10;
    #define ll long long
    const ll mod = 19930726;
    char c[M], s[ M << 1 ];
    ll cnt[M]; 
    int len, pal[M << 1];
    ll ksm(ll a, ll b){
        ll ret = 1;
        for( ; b; b >>= 1, a = a * a % mod){
            if(b & 1) ret = ret * a % mod;
        }
        return ret;
    }
    
    void init(){
        len = strlen(c);
        s[0] = '$';
        for(int i = 0; i < len; i++){
            s[i * 2 + 1] = '#';
            s[i * 2 + 2] = c[i];
        }
        s[len * 2 + 1] ='#';
        s[len * 2 + 2] ='@';
        int L = len * 2 + 1;
        
        
        int id = 1, Maxid = 0;
        for(int i = 1; i <= L; i++){
            if(Maxid >= i)pal[i] = min(Maxid - i + 1, pal[2 * id - i]);
            else pal[i] = 1;
            while(s[i - pal[i]] == s[i + pal[i]])pal[i]++;
            if(i + pal[i] - 1 > Maxid) id = i, Maxid = i + pal[i] - 1;
            if((i&1) == 0)cnt[(pal[i] * 2 - 1) / 2]++;
        }
        
    }
    
    int main(){
        freopen("rehearse.in","r",stdin);
        freopen("rehearse.out","w",stdout);
        int n; ll k, ans = 1, sum = 0;
        cin>>n>>k;
        scanf("%s", c);
        init();
        int limit = n & 1 ? n : n - 1;
        for(int i = limit; i > 0; i -= 2){
            
            if(i != 1)cnt[i - 2] += cnt[i];
            if(sum + cnt[i] <= k)ans = (ans * ksm(i, cnt[i])) % mod;
            else ans = (ans * ksm(i, k - sum)) % mod;
            sum += cnt[i];
            if(sum >= k)break;
        } 
        if(sum >= k)cout<<ans<<endl;
        else printf("-1
    ");
    }
    View Code

    今天复制freopen, 两个stdin, 惨痛教训

  • 相关阅读:
    中介者模式(Mediator Pattern)
    状态模式
    命令模式(Command Pattern)
    迭代器模式(Iterator Pattern)
    解释器模式
    备忘录模式
    访问者模式(Visitor Patten)
    责任链模式(chainOfResponsibility)
    .net下安装 ZooKeeper.Net
    Zookeeper .Net客户端代码
  • 原文地址:https://www.cnblogs.com/EdSheeran/p/9483161.html
Copyright © 2020-2023  润新知