URAL - 1959 GOV-internship 3

来源:互联网 发布:江南大学软件下载 编辑:程序博客网 时间:2024/04/28 02:17
算是区间统计吧,画出图形,枚举出小数据来确定端点,然后用任何一种数据结构来维护都可以。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <vector>#include <set>using namespace std;typedef long long ll;/*     define      */#define sf(a) scanf("%d",&a)#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define clr(num) memset(num,0,sizeof(num))/*     define      */struct point{    int x,val;    bool operator <(const point& t) const{        if(val!=t.val)            return val>t.val;        return x<t.x;    }    point(){}    point(int _x,int _val):x(_x),val(_val){};};set<point> p;set<point>::iterator it;int num[100100],a[100100],b[100100];/* 0 is add 1 is sub*/void up(int x,int flag){    p.erase(point(x,num[x]));    if(flag==0)        num[x]++;    else        num[x]--;    p.insert(point(x,num[x]));}int main(){    int n,m;    while(~sf(n)){        bool f1=false,f2=false;        rep(i,1,n){            sf(a[i]);            if(a[i]==0) f1=true;        }        sf(m);        rep(i,1,m){            sf(b[i]);            if(b[i]==0) f2=true;        }        if(f1){            clr(num);            p.clear();            rep(i,1,n){                if(i<=m) up(b[i],0);                if(i>n-m+1)                    up(b[i-(n-m+1)],1);                if(a[i]==0){                    it=p.begin();                    a[i]=(*it).x;                }            }        }        if(f2){            clr(num);            p.clear();            rep(i,1,n){                up(a[i],0);                if(i>n-m+1) up(a[i-(n-m+1)],1);                if(i>=n-m+1){                    if(b[i-(n-m+1)+1]==0){                        it=p.begin();                        b[i-(n-m+1)+1]=(*it).x;                    }                }            }        }        rep(i,1,n) printf("%d%c",a[i],i==n?'\n':' ');        rep(i,1,m) printf("%d%c",b[i],i==m?'\n':' ');    }    return 0;}

原创粉丝点击