codeforce 224

好久没写csdn的博客了,自从今年的亚洲赛完就一直没有敲过有关算法方面的程序,发现现在都有点生疏了。昨天参加了场CF,惨败。。。

第一题,水贪心,没仔细读题,结果当成是博弈DP,敲完果断贡献了个WA。

第二题,水题,把数存数组里排序,左右扫一遍就OK了。

第三题,一直题意没弄明白,后来问了学妹题意,是个递归二分,开始敲代码,还算比较顺利,结果MLE了,数爆int了,结果就跪了。后来改long long 果断过了。

第四题,没看。

第五题,感觉是离线数据结构查询,不过没想太明白也没太多时间就没动,今天看了下,完全是可以做的。

开始没多久,中途断网近半小时,顿时好无语,加上不熟,果断时间不够,给跪了。

第三题,代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#define LL long long
using namespace std;
const int mm = 1e5+9;
//map<LL,LL>mp;
class ppp
{
public:
  LL l,r;
  LL typ;
  LL a,b;
}f[mm];
int n;
LL query(LL x)
{
  LL l = 0,r = n-1,mid;
  while(l<=r)
  {
    mid = (l+r)/2;
    if(f[mid].l<=x && f[mid].r>=x)
    {
      if(f[mid].typ == 1)
        return f[mid].a;//mp[x];
      else
      {
        int num = x-f[mid].l+1;
        num = num%f[mid].a;
        if(num == 0)
          num = f[mid].a;
        return query(num);
      }
    }
    else if(f[mid].l>x)
    {
      r = mid -1;
    }
    else if(f[mid].r<x)
    {
      l = mid + 1;
    }
  }
}
int main()
{
    while(~scanf("%d",&n))
    {
//      mp.clear();
      LL kai = 1;
      for(int i=0;i<n;++i)
      {
        int typ,a,b;
        scanf("%d",&typ);
        if(typ == 1)
        {
          scanf("%d",&a);
          f[i].l = kai; f[i].r = kai;
          f[i].a = a;
          f[i].typ = typ;
//          mp[kai] = a;
          ++kai;
        }
        else
        {
          scanf("%d%d",&a,&b);
          f[i].l = kai; f[i].r = kai + (LL)a*b-1;
          kai = f[i].r + 1;
          f[i].typ = typ;
          f[i].a = a; f[i].b = b;
        }
      }
//      for(int i=0;i<n;++i)
//      {
//        printf("%d %d %d %d\n",f[i].l,f[i].r,f[i].a,f[i].b);
//      }
      int m;
      LL qu;
      scanf("%d",&m);
      for(int i=0;i<m;++i)
      {
        scanf("%I64d",&qu);
        printf("%I64d ",query(qu));
      }
      printf("\n");
    }
    return 0;
}

第四题

#include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#define VI vector<int>
#define PB push_back
#define ll(x) (1<<x)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define DWN(i,a,b) for(int i=a;i>=b;--i)
#define clr(f,z) memset(f,z,sizeof(f))

using namespace std;

const int mm = 7009;

int d[mm*311],l[mm],r[mm],x[mm],vis[mm*311];
VI level[mm];
int main()
{
    d[0] = 0;
    FOR(i,1,111*mm-1)///i 对应右下一层的值
    {
        d[i] = d[i-1] + 1;
        if( (i&(i-1)) == 0)
            ++d[i];
    }
    int n,m;

    while(cin>>n>>m)
    {
        int res = 0,typ,id;
        clr(vis,0);
        FOR(i,0,mm-1)
        level[i].clear();
            FOR(i,1,m)
            {
                cin>>typ;
                if(typ == 1)
                {
                    cin>>id>>l[i]>>r[i]>>x[i];
                    level[id].PB(i);
                }
                else
                {
                    int t,v,ll,rr,ans;
                    cin>>t>>v;
//                    puts("uuu");
                    ++res; ans = 0;
                    ll = rr = v;
                    FOR(j,t,n)
                       {
                           int len = level[j].size()-1;
//                        FOR(k,0,level[j].size()-1) //BUG
                        FOR(k,0,len)
                        if(ll>r[ level[j][k] ] || rr < l[ level[j][k] ])
                             continue;
                        else
                        {
                            if(vis[ x[ level[j][k] ] ] != res)
                            {
                                vis[ x[ level[j][k] ] ] = res;
                                ++ans;
                            }
                        }
                         ll = d[ll-1] + 1;
                         rr = d[rr];
                       }
                    cout<<ans<<endl;
                }
            }
    }
    return 0;
}

/**
4 5
1 4 4 7 1
1 3 1 2 2
2 1 1
2 4 1
2 3 3
*/


第五题:

//在线线段树 265 MS
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<set>
#include<vector>
#include<string>
#include<algorithm>
#define lson (t<<1)
#define rson (t<<1|1)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define DWN(i,a,b) for(int i=a;i>=b;--i)
#define clr(f,z) memset(f,z,sizeof(f))
#define ll(x) (1<<x)

using namespace std;
const int mm = 1e6+9;
char bracket[mm];
class Segment
{
public:
  int l,r,len,lbracket,rbracket;
}rt[mm*4];
void push(int t)
{
  int num = min(rt[lson].lbracket,rt[rson].rbracket);
  rt[t].len = rt[lson].len + rt[rson].len + num;
  rt[t].lbracket = rt[lson].lbracket + rt[rson].lbracket - num;
  rt[t].rbracket = rt[lson].rbracket + rt[rson].rbracket - num;
}
void build(int t,int l,int r)
{
  rt[t].l = l; rt[t].r = r;
  if(l == r)
  {
    rt[t].len = 0;
    rt[t].lbracket = rt[t].rbracket = 0;
    if(bracket[l-1] == '(')
        rt[t].lbracket++;
    else rt[t].rbracket++;
    return ;
  }
  int mid = (l+r)/2;
  build(lson,l,mid); build(rson,mid+1,r);
  push(t);
}
Segment query(int t,int l,int r)
{
    if(rt[t].l >= l && rt[t].r <= r)
      {
        return rt[t];
      }
    Segment ret = rt[t];
    ret.lbracket = 0;
    ret.rbracket = 0;
    ret.len = 0;
    if(rt[t].r < l || rt[t].l > r)
      return ret;
    else
    {
      Segment la = query(lson,l,r);
      Segment ra = query(rson,l,r);
      int num = min(la.lbracket,ra.rbracket);
      ret.len = la.len + ra.len + num;
      ret.lbracket = la.lbracket + ra.lbracket - num;
      ret.rbracket = la.rbracket + ra.rbracket - num;
      return ret;
    }

}
int main()
{

    while(~scanf("%s",bracket))
    {
        int len = strlen(bracket);
        build(1,1,len);
        int m,a,b;
        scanf("%d",&m);
        FOR(i,1,m)
        {
          scanf("%d%d",&a,&b);
          printf("%d\n",query(1,a,b).len*2);
        }
    }
  return 0;
}

/////右离线版 93MS
//#include<cstdio>
//#include<cstring>
//#include<iostream>
//#include<cmath>
//#include<queue>
//#include<set>
//#include<vector>
//#include<string>
//#include<stack>
//#include<algorithm>
//#define PII pair<int,int>
//#define FOR(i,a,b) for(int i=a;i<=b;++i)
//#define DWN(i,a,b) for(int i=a;i>=b;--i)
//#define clr(f,z) memset(f,z,sizeof(f))
//#define ll(x) (1<<x)
//
//using namespace std;
//const int mm = 1e6+9;
//char bracket[mm];
//int sum[mm];
//
//int lowbit(const int x)
//{
//  return x&(-x);
//}
//
//void add(int*sum,int pos,const int num)
//{
//    for(int i=pos;i<mm;i+=lowbit(i))
//    {
//      sum[i] += num;
//    }
//}
//
//int query(int*sum,const int pos)
//{
//    int ans = 0;
//    for(int i=pos;i>0;i-=lowbit(i))
//      ans += sum[i];
//    return ans;
//}
//stack<int>st;
//vector<PII>q[mm];
//int ans[mm];
//int main()
//{
//
//    while(~scanf("%s",bracket))
//    {
//        int m,a,b;
//        scanf("%d",&m);
//        FOR(i,1,m)
//        {
//          scanf("%d%d",&a,&b);
//          --a; --b;
//          q[a].push_back(PII(b,i));
//        }
//        int len = strlen(bracket);
//        clr(sum,0);
//        DWN(i,len-1,0)
//        {
//          if(bracket[i] == ')')
//            st.push(i);
//          else
//          {
//            if(!st.empty())
//            {
//              add(sum,st.top(),1);
//              st.pop();
//            }
//          }
//          for(int j = 0;j<q[i].size();++j)
//          {
//            ans[ q[i][j].second ] = query(sum,q[i][j].first);
//          }
//        }
//      FOR(i,1,m)
//      printf("%d\n",ans[i]+ans[i]);
//    }
//  return 0;
//}



posted @ 2014-01-13 12:39  剑不飞  阅读(440)  评论(0编辑  收藏  举报