• BZOJ 1058 报表统计 (STL)


    题解:数据结构的基本操作,用STL可以完美实现,就是比较慢……

    #include <cstdio>  
    #include <map>  
    #include <set>  
    #include <vector>
    #include <algorithm>
    const int MAXN=500005;  
    const int INF=~0U>>1; 
    using namespace std;  
    int n,m;  
    sets,tr;  
    map<int, int>mp;  
    vectorg[MAXN];  
    int a[MAXN], b[MAXN];  
    int main(){  
        scanf("%d%d",&n,&m);  
        int mg=INF,ms=INF,pos,val;  
        for(int i=0;i<n;i++){  
            scanf("%d",&a[i]);  
            tr.insert(a[i]);  
            b[i]=a[i];  
            if(i){  
                int k=abs(a[i]-a[i - 1]);  
                s.insert(k); mp[k]++;  
            }  
        }  
        sort(b,b+n);  
        for(int i=1;i<n;i++)ms=min(ms,b[i]-b[i-1]);  
        mg=*s.begin();  
        char op[33];  
        while(m--){  
            scanf("%s",op);  
            if(op[4]=='R'){  
                scanf("%d%d",&pos,&val); pos--;  
                g[pos].push_back(val);  
                if(ms){
                    set::iterator it=tr.lower_bound(val);  
                    if(it!=tr.begin()){  
                        if(it==tr.end()){  
                            it--;  
                            ms=min(ms,abs(val-*it));  
                        }  
                        else{  
                            int x=*it; it--;  
                            int y=*it;  
                            ms=min(ms,abs(x-val));  
                            ms=min(ms,abs(y-val));  
                        }  
                    }  
                    else ms=min(ms,abs(val-*tr.begin()));  
                }  
                tr.insert(val);  
                int x,y=INF;  
                if(g[pos].size()==1)x=a[pos];  
                else x=g[pos][g[pos].size()-2];  
                if(pos+1<n){  
                    y=a[pos+1];  
                    int k=abs(x-y); mp[k]--;  
                    if(mp[k]==0)s.erase(k);  
                    k=abs(x-val); s.insert(k);  
                    mp[k]++;  
                    k=abs(y-val); s.insert(k);  
                    mp[k]++; mg=*s.begin();  
                }  
                else{  
                    int k=abs(x-val);  
                    s.insert(k);  
                    mp[k]++; mg=*s.begin();  
                }  
            }  
            else if(op[4]=='G') printf("%d
    ", mg);  
            else printf("%d
    ", ms);  
        }  
        return 0;  
    }  
    
  • 相关阅读:
    HTML5 drag拖动事件
    echarts 实现立体柱子图
    团队管理(七)
    echarts环比图实现
    父组件调用图表组件根据按钮切换展示数据
    echarts 折柱图绘制图表标注
    团队管理(六)
    团队管理(五)
    css 绘制圆角三角形
    团队管理(四)
  • 原文地址:https://www.cnblogs.com/forever97/p/bzoj1058.html
Copyright © 2020-2023  润新知