5-14 数据结构啊poi D.折叠纸片

来源:互联网 发布:windows多线程注意什么 编辑:程序博客网 时间:2024/04/29 05:45

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=78124#problem/D

//想看题目的@willinglive

直接暴力维护就可以了。。。然后折叠超过区间的时候用翻转标记维护一下。【大概直接做也可以过。。?并没有尝试】

#include<cstdio>using namespace std;int n;int tr[100001];inline int lowbit(int x){     return x&(-x);}inline void add(int x,int xx){     int i;     for(i=x;i<=n;i+=lowbit(i))          tr[i]+=xx;}inline int sum(int x){     int i;     int s=0;     for(i=x;i>=1;i-=lowbit(i))          s+=tr[i];     return s;}int main(){ int q; scanf("%d%d",&n,&q); int i,j; for(i=1;i<=n;i++)      add(i,1); int x; int s,t; int l=1,r=n; bool rev=false; for(i=1;i<=q;i++) {      scanf("%d",&x);      if(x==1)      {           scanf("%d",&s);           if(s+s+l-1>r)           {                rev=!rev;                s=(r-l+1)-s;           }           if(rev)           {               for(j=r-s+1;j<=r;j++)               {                int xx=sum(j)-sum(j-1);                int loc=r-s+1-(j-(r-s+1)+1);                    add(loc,xx);                    add(j,-xx);               }               r-=s;           }           else           {               for(j=l;j<=l+s-1;j++)               {                int xx=sum(j)-sum(j-1);                int loc=l+s-1+(l+s-j);                    add(loc,xx);                    add(j,-xx);               }                l+=s;                if(l>n)                {                     l-=n;                     r-=n;                }           }      }      else if(x==2)      {           scanf("%d%d",&s,&t);           if(!rev)           {                s=s+l-1;                t=t+l-1;           }           else           {               int tt=s;                s=r-t;                t=r-tt;           }           printf("%d\n",sum(t)-sum(s));      } }     return 0;}


0 0
原创粉丝点击