zoukankan      html  css  js  c++  java
  • Codeforces 525B Pasha and String

    题意:给你一个字符串str ,从1 开始长度为s,每次给你一个 a[i]  ,然后将  [ a[i] , (s-a[i]+1) ]  翻转,问你经过n次操作以后整个字符串是什么样的。

    解题思路:

    1)根据负负得正的思路,我们只需要从内到外,看那些区域需要翻转,那些区域不需要就行了。

    解题代码:

     1 // File Name: b.cpp
     2 // Author: darkdream
     3 // Created Time: 2015年03月27日 星期五 00时33分41秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 #define LL long long
    25 #define maxn 200005
    26 using namespace std;
    27 char str[maxn];
    28 int a[maxn];
    29 int cmp(int a, int b)
    30 {
    31   return a > b; 
    32 }
    33 int n;
    34 void change(int l , int r)
    35 {
    36     for(int i = l ;i <= r ;i ++)
    37     {
    38         swap(str[i],str[n-i+1]);
    39     }
    40 }
    41 int main(){
    42      scanf("%s",&str[1]);
    43      int m ; 
    44      n = strlen(&str[1]);
    45      scanf("%d",&m);
    46      for(int i = 1;i <= m; i ++)
    47          scanf("%d",&a[i]);
    48      sort(a+1,a+1+m,cmp);
    49      int last = n/2; 
    50      for(int i = 1; i <= m;i ++)
    51      {
    52           if((m - i) % 2 == 0) 
    53           {
    54             change(a[i],last);
    55           }
    56           last = a[i] - 1; 
    57      }
    58      puts(&str[1]);
    59 return 0;
    60 }
    View Code

    2)splay  ,我们知道,splay翻转序列只需要logn  所以splay也可以解 .(想法来源是来自于湖大glqAC,被这天大的脑洞吓到了)

      1 // File Name: cf525b.cpp
      2 // Author: darkdream
      3 // Created Time: 2015年04月03日 星期五 22时48分43秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long
     25 
     26 using namespace std;
     27 const int maxn = 200005;
     28 struct SplayTree{
     29     int sz[maxn];
     30     int ch[maxn][2];
     31     int pre[maxn];
     32     int n ; 
     33     int rev[maxn];
     34     int root ,top1,top2;
     35     int ss[maxn],que[maxn];
     36     
     37     inline void Rotate(int x,int f){
     38         int y = pre[x];
     39         push_down(y);
     40         push_down(x);
     41         ch[y][!f] = ch[x][f];
     42         pre[ch[x][f]] = y ; 
     43         pre[x] = pre[y];
     44         if(pre[x]) ch[pre[y]][ch[pre[y]][1] == y] = x; 
     45         ch[x][f] = y ; 
     46         pre[y] = x ; 
     47         push_up(y);
     48     }
     49     inline void Splay(int x, int goal){
     50          push_down(x);
     51          while(pre[x] != goal){
     52             if(pre[pre[x]] == goal){
     53                 Rotate(x, ch[pre[x]][0] == x);
     54             }else{
     55                int y = pre[x],z = pre[y];
     56                int f = (ch[z][0] == y);
     57                if(ch[y][f] == x){
     58                     Rotate(x,!f) , Rotate(x,f);
     59                }else{
     60                     Rotate(y,f) , Rotate(x,f);
     61                }
     62             }
     63          }
     64          push_up(x);
     65          if(goal ==  0) root = x; 
     66     }
     67     inline void RotateTo(int k ,int goal){
     68         int x = root;
     69         push_down(x);
     70         while(sz[ch[x][0]] != k ){
     71             if(k < sz[ ch[x][0] ]){
     72                 x = ch[x][0];
     73             }else{
     74                 k -= (sz[ch[x][0]] + 1);
     75                 x = ch[x][1];
     76             }
     77             push_down(x);
     78         }
     79         Splay(x,goal);
     80     }
     81     inline void erase(int x){
     82         int father = pre[x];
     83         int head = 0 , tail = 0 ; 
     84         for(que[tail ++] = x ; head < tail ;head ++){
     85             ss[top2++] = que[head];
     86             if(ch[que[head] ][0]) que[tail ++] = ch[que[head]][0];
     87             if(ch[que[head] ][1]) que[tail ++] = ch[que[head]][1];
     88         }
     89         ch[father][ch[father][1] == x] = 0 ;
     90         push_up(father);
     91     }
     92     inline void NewNode(int &x,char c){
     93          if(top2) x = ss[--top2];
     94          else x = ++top1;
     95          ch[x][0] = ch[x][1] = pre[x] = 0 ; 
     96          sz[x] = 1; 
     97          rev[x] = 0; 
     98          val[x] = c;
     99     }
    100     inline void push_down(int x){
    101         if(rev[x])
    102         {
    103            swap(ch[x][0],ch[x][1]);
    104            rev[ch[x][0]] ^= 1 ;
    105            rev[ch[x][1]] ^= 1 ;
    106            rev[x] = 0 ; 
    107         }
    108     }
    109     inline void push_up(int x){
    110          sz[x] = 1 + sz[ch[x][0]] + sz[ch[x][1]];
    111     }
    112     inline void makeTree(int &x,int l ,int r,int f){
    113         if(l > r) return ; 
    114         int m = (l + r ) >> 1; 
    115         NewNode(x,str[m]);
    116         makeTree(ch[x][0],l,m-1,x);
    117         makeTree(ch[x][1],m+1,r,x);
    118         pre[x] = f;
    119         push_up(x);
    120     }
    121     inline void init(){
    122         ch[0][0] = ch[0][1] = pre[0] = sz[0] = 0 ; 
    123         mx[0] = 0 ; 
    124         root = top1 = 0 ; 
    125         NewNode(root,'');
    126         NewNode(ch[root][1],'');
    127         pre[top1] = root;
    128         sz[root] = 2; 
    129     //    printf("%d***
    ",mx[root]);
    130 
    131         scanf("%s",&str[1]);
    132         n = strlen(&str[1]);
    133         makeTree(ch[ch[root][1]][0],1,n,ch[root][1]);
    134         push_up(ch[root][1]);
    135         push_up(root); 
    136 
    137     }
    138     void print(int x)
    139     {
    140        if(x == 0 )
    141            return; 
    142        push_down(x);
    143        print(ch[x][0]);
    144        printf("%c",val[x]);
    145        print(ch[x][1]);
    146     }
    147     inline void update(int l ,int r){
    148        RotateTo(l-1,0);
    149        RotateTo(r+1,root);
    150        rev[ch[ch[root][1]][0]] ^= 1;
    151        //Splay(ch[ch[root][1]][0],0);
    152     }
    153     inline void query(){
    154        RotateTo(0,0);
    155        RotateTo(n+1,root);
    156        //print(ch[ch[root][1]][0]);
    157        print(ch[ch[root][1]][0]);
    158     } 
    159     char str[maxn];
    160     char val[maxn];
    161     int mx[maxn];
    162 }spt;
    163 int ta,tb;
    164 int n , q; 
    165 int main(){
    166         spt.init();
    167         //spt.query();
    168         scanf("%d",&q);
    169         for(int i = 1;i <= q; i++)
    170         {
    171             scanf("%d",&ta);
    172             spt.update(ta,spt.n-ta+1) ;
    173         }
    174         spt.query();
    175 return 0;
    176 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    python
    python 随机数生成
    PowerShell学习笔记二_变量、Select、Foreach、where
    PowerShell学习笔记一_cmdlet、管道、如何入门
    vscode 配置
    mvn 命令
    Microsoft 365:如何在Word文件中插入另一个不同文档内容或者链接
    Microsoft 365:如何使用Tag来管理在Teams中提到的组
    Microsoft 365:Microsoft Teams 实时字幕助力您打破语言沟通障碍
    2020年SharePoint Saturday _ China, 精彩回顾
  • 原文地址:https://www.cnblogs.com/zyue/p/4372782.html
Copyright © 2011-2022 走看看