2012网赛成都赛区

来源:互联网 发布:淘宝警察钱包 编辑:程序博客网 时间:2024/04/29 21:20

a题是cf 85d原题, 

纯数组模拟o(n^2)就过了, zzc的o(n*sqrt(n))的分块都tle了,无力吐槽

int a[100005];char ss[55];int main(void) {  int n;  while (~scanf("%d", &n)){  int l = 0;  for (int i=0; i<n; i++) {    scanf("%s", ss);    if (ss[0] == 's') {      long long res = 0;      for (int i=2; i<l; i+=5)        res += a[i];      printf ("%I64d\n", res);    }else {      int x;      scanf("%d", &x);      int t = lower_bound(a, a+l, x) - a;      if (ss[0] == 'a') {        for (int j=l; j>t; j--)          a[j] = a[j-1];        a[t] = x;        l++;      } else {        for (int j=t; j<l; j++)          a[j] = a[j+1];        l--;      }    }  }  }  return 0;}




比赛的时候就水过去2道。

b题 Control 拆点网络流。

int w[N];void init(){    memset (head, -1, sizeof(head));    cnt=0;}int main(){    int n, m;     while (~scanf("%d%d", &n, &m))    {        init();        int t=n*2+2;        int si, d; scanf("%d%d", &si, &d);        addedge(0, si<<1, inf);        addedge(d<<1|1, t, inf);        for (int i=1; i<=n; ++i)        {            scanf("%d", w+i);            addedge(i<<1, i<<1|1, w[i]);        }        for (int i=1; i<=m; ++i)        {            int a, b; scanf("%d%d", &a, &b);            addedge(a<<1|1, b<<1, inf);            addedge(b<<1|1, a<<1, inf);        }        int ans=sap(0, t);        printf("%d\n", ans);    }}

e题  Food 类似二分图 也要建立额外的原汇店

int main(){    int n, f, d;     while (~scanf("%d%d%d", &n, &f, &d))    {        init();        int sink=f+d+2*n+2;        for (int i=0; i<f; ++i)        {            int x; scanf("%d", &x);            add(0, i+1, x);        }        for (int i=0; i<d; ++i)        {            int x; scanf("%d", &x);            //puts("@@");            add(i+1+f, sink, x);        }        for (int i=1; i<=n; ++i)        {            add(f+d+(i<<1), f+d+(i<<1|1), 1);        }        for (int i=1; i<=n; ++i)        {            scanf("%s", good);            for (int j=0; j<f; ++j)                if(good[j]=='Y')add(j+1, f+d+(i<<1), inf);        }        for (int i=1; i<=n; ++i)        {            scanf("%s", good);            for (int j=0; j<d; ++j)                if(good[j]=='Y')add(f+d+(i<<1|1), j+f+1, inf);        }        int ans=sap(0, sink);        printf("%d\n", ans);    }}

f题, Groups  dp
g题, Multiple dp 和之前浙大月赛的题目很类似。存余数,枚举数字出现的状态

h题, 4 substrings problem dp+枚举状态合并

i题  Buildings 贪心



原创粉丝点击