zoukankan      html  css  js  c++  java
  • 1087

     
    1087 - Diablo
    Time Limit: 2 second(s) Memory Limit: 64 MB

    All of you must have played the game 'Diablo'. It's an exclusive game to play. In this game the main opponent of you is Diablo. If you kill him the game finishes. But as usual, Diablo is smarter than you.

    Diablo has a large number of army. Diablo arranges them in a line in any arbitrary order and everyone is given an integer id. Each time Diablo either adds one army in the end or he calls for the kth army (from left) from the line. Then the army gets out and it attacks you.

    Since you are a great magician, you can read Diablo's mind. Now you want to find the id of the armies who are about to attack you.

    Input

    Input starts with an integer T (≤ 5), denoting the number of test cases.

    The first line of each case is a blank line. The next line contains two integers n (0 ≤ n ≤ 105), denoting the number of the initial army and q (1 ≤ q ≤ 50000) representing the number of queries. The next line contains n space separated integers. The ith integer of this line denotes the id of the ith person. Each of these integers will be positive and fits into a 32 bit signed integer. Each of the next q lines will contain a query, of the form:

    a p    (add a person at the end of the line whose id is p)

    c k    (call the kth person from the line (from left), k is a positive 32 bit signed integer)

    Output

    For each case of input, print the case number in a line. Then for all the queries 'c k' you have to print the id of the kth person or 'none' if there is none.

    Sample Input

    Output for Sample Input

    2

    5 5

    6 5 3 2 1

    c 1

    c 1

    a 20

    c 4

    c 4

    2 1

    18811 1991

    c 1

    Case 1:

    6

    5

    20

    none

    Case 2:

    18811

    Notes

    Dataset is huge, use faster i/o methods.


    PROBLEM SETTER: JANE ALAM JAN
    思路:线段数求第k大树,单点更新;
      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<string.h>
      5 #include<queue>
      6 #include<stack>
      7 #include<map>
      8 #include<math.h>
      9 using namespace std;
     10 typedef long long LL;
     11 int tree[5000000];
     12 int ans[160005];
     13 int id[160000];
     14 int flag[160000];
     15 void build(int l,int r,int k,int u);
     16 int ask(int l,int r,int k,int m);
     17 void up(int k);
     18 void in(int x);
     19 int main(void)
     20 {
     21         int i,j,k;
     22         scanf("%d",&k);
     23         int s;
     24         int n,m;
     25         int gg=0;
     26         for(s=1; s<=k; s++)
     27         {
     28                 scanf("%d %d",&n,&m);
     29                 for(i=1; i<=n; i++)
     30                 {
     31                         scanf("%d",&ans[i]);
     32                 }
     33                 memset(flag,0,sizeof(flag));
     34                 for(i=n+1; i<=160000; i++)
     35                 {
     36                         flag[i]=1;
     37                 }
     38                 build(1,160000,0,n);
     39                 gg=n;
     40                 int cn=n;
     41                 printf("Case %d:
    ",s);
     42                 while(m--)
     43                 {
     44                         char a[2];
     45                         int x;
     46                         scanf("%s %d",a,&x);
     47                         if(a[0]=='c')
     48                         {
     49                                 if(gg<x)
     50                                         printf("none
    ");
     51                                 else
     52                                 {
     53                                         int cc=ask(1,160000,0,x);
     54                                         printf("%d
    ",ans[cc]);
     55                                         gg--;
     56                                 }
     57                         }
     58                         else
     59                         {
     60                                 cn++;
     61                                 flag[cn]=0;
     62                                 ans[cn]=x;
     63                                 gg++;
     64                                 in(cn);
     65                         }
     66                 }
     67         }
     68         return 0;
     69 }
     70 void build(int l,int r,int k,int u)
     71 {
     72         if(l==r)
     73         {
     74                 if(r<=u)
     75                 {
     76                         id[l]=k;
     77                         tree[k]=1;
     78                 }
     79                 else
     80                 {
     81                         id[l]=k;
     82                         tree[k]=0;
     83                 }
     84                 return ;
     85         }
     86         else
     87         {
     88                 build(l,(l+r)/2,2*k+1,u);
     89                 build((l+r)/2+1,r,2*k+2,u);
     90                 tree[k]=tree[2*k+1]+tree[2*k+2];
     91         }
     92 }
     93 int ask(int l,int r,int k,int ans)
     94 {
     95         if(ans==tree[k])
     96         {
     97                 int c=id[r];
     98                 if(flag[r]==0)
     99                 {  flag[r]=1;
    100                         up(c);
    101                         return r;
    102                 }
    103                 else
    104                 {
    105                         if(tree[2*k+1]<ans)
    106                         {
    107                                 return ask((l+r)/2+1,r,2*k+2,ans-tree[2*k+1]);
    108                         }
    109                         else if(tree[2*k+1]==ans)
    110                         {
    111                                 return ask(l,(l+r)/2,2*k+1,ans);
    112                         }
    113                 }
    114         }
    115         else  if(ans<tree[k])
    116         {
    117                 if(tree[2*k+1]>=ans)
    118                 {
    119                         return ask(l,(l+r)/2,2*k+1,ans);
    120                 }
    121                 else if(tree[2*k+1]<ans)
    122                 {
    123                         return ask((l+r)/2+1,r,2*k+2,ans-tree[2*k+1]);
    124                 }
    125         }
    126 }
    127 void up(int k)
    128 {
    129         tree[k]=0;
    130         if(k==0)return ;
    131         k=(k-1)/2;
    132         while(k>=0)
    133         {
    134                 tree[k]=tree[2*k+1]+tree[2*k+2];
    135                 if(k==0)
    136                         return ;
    137                 k=(k-1)/2;
    138         }
    139 }
    140 void in(int x)
    141 {
    142         int cc=id[x];
    143         tree[cc]=1;
    144         if(cc==0)return ;
    145         cc=(cc-1)/2;
    146         while(cc>=0)
    147         {
    148                 tree[cc]=tree[2*cc+1]+tree[2*cc+2];
    149                 if(cc==0)
    150                         return ;
    151                 cc=(cc-1)/2;
    152         }
    153 }
    油!油!you@
  • 相关阅读:
    Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
    Cogs 376. [IOI2002]任务安排(后效性DP)
    Bzoj 1911: [Apio2010]特别行动队(斜率优化)
    Poj 2018 Best Cow Fences(分数规划+DP&&斜率优化)
    Bzoj 1212: [HNOI2004]L语言(AC自动机+DP)
    ZOJ 3228 Searching the String(AC自动机)
    Bzoj 3172: [Tjoi2013]单词(fail树)
    Hdu 3065 病毒侵袭持续中(AC自动机)
    Hdu 2896 病毒侵袭(AC自动机)
    Bzoj 2599: [IOI2011]Race(点分治)
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5506518.html
Copyright © 2011-2022 走看看