zoukankan      html  css  js  c++  java
  • bzoj1136: [POI2009]Arc

    Description

    给定一个序列{ai | 1 <= ai <= 1000000000 且 1 <= i <= n 且 n <= 15000000}和一个整数 k (k <= n 且 k <= 1000000),求出a的一个长度为k的子序列{a[bi]}满足: (1) 1 <= b1 <= b2 <= ... <= bk (2) 在满足(1)的情况下 {a[b1], a[b2], ... , a[bk]} 字典序最大。

    Input

    第一行一个数k,以下一行,为序列ai。以一个单独的0结束

    Output

    k行,每行一个数,其中第i行为a[bi]。

    Sample Input

    12
    5 8 3 15 8 0

    Sample Output

    12
    15
    8

     

    题解:

    http://blog.csdn.net/popoqqq/article/details/44812723

    code:

      1 #include <stdlib.h>
      2 #include <stdio.h>
      3 #include <time.h>
      4  
      5 #define MAGIC_BEGIN -435634223
      6 #define MAGIC_END -324556462
      7  
      8 #define MIN_K 1
      9 #define MAX_K 1000000
     10 #define MAX_N 15000000
     11 #define MIN_A 1
     12 #define MAX_A 1000000000
     13 #define MIN_TYP 1
     14 #define MAX_TYP 3
     15 #define MIN_PAR 0
     16 #define MAX_PAR 1000000000
     17  
     18 #define ERROR 0
     19 #define CORRECT 1
     20  
     21 #define unlikely(x) __builtin_expect(!!(x), 0)
     22  
     23 static int init = 0; // czy zostala juz wywolana funkcja inicjuj()
     24 static int lib_n; // ile biblioteka podala juz liczb
     25 static int con_k; // ile zawodnik podal liczb
     26  
     27 static int N, K, A, TYP, PAR; // parametry testu wczytywane z pliku
     28 static int bre, len_sub, bou, is_end; // zmienne pomocnicze
     29  
     30 static int rand2_status = 198402041;
     31  
     32 static inline int rand2(int a, int b){
     33   rand2_status = rand2_status * 1103515245 + 12345;
     34   int x = rand2_status;
     35   if (x < 0) x = -x; // -2^31 sie nie zdarza :D
     36   x >>= 1;
     37   x = a + x % (b - a + 1);
     38   return x;
     39 }
     40  
     41 /* test losowy */
     42 static inline int random_test()
     43 {
     44     return rand2(1, A);
     45 }
     46  
     47 /* test z dlugim podciagiem nierosnacym */
     48 static inline int decreasing_test()
     49 {
     50     int tmp;
     51     if(bre == 0) {
     52         bre = rand2(0, (N - lib_n + 1 - len_sub));
     53         tmp = A;
     54         A -= rand2(0, (A - 1) / len_sub);
     55         len_sub--;
     56     }
     57     else {
     58         bre--;
     59         tmp = rand2(1, A);
     60     }
     61     return tmp;
     62 }
     63  
     64 /* test z dlugim podciagiem niemalejacym */
     65 static inline int increasing_test()
     66 {
     67     return bou - decreasing_test();
     68 }
     69  
     70 static void finish(int res, char *com)
     71 {
     72     if(res == ERROR)
     73         printf("%s
    ", com);
     74     exit(0);
     75 }
     76  
     77 /* Inicjuje dane wejsciowe i zwraca liczbe projektow */
     78 int inicjuj()
     79 {
     80     if(init == 1)
     81         finish(ERROR, "Program zawodnika moze wywolac funkcje inicjuj tylko raz!!!");
     82     init = 1;
     83     scanf("%d", &K);
     84     if (K > 0){
     85       TYP = 0;
     86       N = MAX_N + 2;
     87       return K;
     88     }
     89     int magic_begin, magic_end;
     90     scanf("%d%d", &magic_begin, &TYP);
     91     if(magic_begin != MAGIC_BEGIN || TYP < MIN_TYP || TYP > MAX_TYP)
     92         finish(ERROR, "Program zawodnika nie moze korzystac z stdin!!!");
     93     scanf("%d%d%d%d", &N, &K, &A, &PAR);
     94     if(N < 1 || N > MAX_N || N < K || K > MAX_K || A < MIN_A || A > MAX_A 
     95         || PAR < MIN_PAR || PAR > MAX_PAR)
     96         finish(ERROR, "Program zawodnika nie moze korzystac z stdin!!!");
     97     scanf("%d", &magic_end);
     98     if(magic_end != MAGIC_END)
     99         finish(ERROR, "Program zawodnika nie moze korzystac z stdin!!!");
    100     con_k = 0;
    101     lib_n = 0;
    102     is_end = 0;
    103     if(TYP == 2 || TYP == 3) {
    104         len_sub = PAR;
    105         bre = 0;
    106     }
    107     if(TYP == 2)
    108         bou = A--;
    109     return K;
    110 }
    111  
    112 /* Sluzy do wczytania ciagu reprezentujacego jakosci projektow */
    113 int wczytaj()
    114 {
    115     if(unlikely(init == 0))
    116         finish(ERROR, "Program zawodnika nie wywolal funkcji inicjuj!!!");
    117     if(unlikely(lib_n > N || is_end == 1))
    118         finish(ERROR, "Program zawodnika wywolal funkcje wczytaj po otrzymaniu informacji o koncu ciagu!!!");
    119     if(unlikely(lib_n == N))
    120         return 0;
    121     lib_n++;
    122     switch (TYP) {
    123       case 0:
    124         scanf("%d", &A);
    125         if(A == 0)
    126           is_end = 1;
    127         return A;
    128         break;
    129       case 1: return random_test(); break;
    130       case 2: return increasing_test(); break;
    131       case 3: return decreasing_test(); break;
    132       default:
    133               finish(ERROR, "Nieznany typ testu");
    134     }
    135     return -1;
    136 }
    137  
    138 /* Sluzy do wypisania wyznaczonego podciagu */
    139 void wypisz(int jakoscProjektu)
    140 {
    141     if(init == 0)
    142         finish(ERROR, "Program zawodnika nie wywolal funkcji inicjuj!!!");
    143     printf("%d
    ", jakoscProjektu);
    144     if(++con_k == K)
    145         finish(CORRECT, "");
    146 }
    147 #include<cstdio>
    148 #include<iostream>
    149 #include<cmath>
    150 #include<cstring>
    151 #include<algorithm>
    152 using namespace std;
    153 char ch;
    154 bool ok;
    155 void read(int &x){
    156     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1;
    157     for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
    158     if (ok) x=-x;
    159 }
    160 const int maxk=1000010;
    161 int k,n,x,a[maxk];
    162 struct Data{
    163     int head,tail,val[maxk];
    164     void init(){head=1,tail=0;}
    165     void push(int v){
    166         while (head<=tail&&val[tail%maxk]<v) tail--;
    167         if (tail-head+1<k) val[(++tail)%maxk]=v;
    168     }
    169     void pop(){head++;}
    170     int front(){return val[head%maxk];}
    171 }que;
    172 int main(){
    173     que.init(),k=inicjuj();
    174     for (n=0;n<k;n++) a[n]=wczytaj(); n--;
    175     while (x=wczytaj(),x){
    176         a[(++n)%maxk]=x;
    177         que.push(a[(n-k)%maxk]);
    178     }
    179     for (int i=k-1;i>=0;i--) que.push(a[(n-i)%maxk]),wypisz(que.front()),que.pop();
    180     return 0;
    181 }
  • 相关阅读:
    Navicat 创建mysql存过、定时执行存过
    windows 系统 MySQL_5.6.21安装教程
    ldf和mdf文件怎么还原到sqlserver数据库
    免安装的tomcat转服务
    关掉IE提示“当前安全设置会使计算机有风险”
    U盘制作系统启动盘方法
    Tomcat窗口标题,中文乱码解决方法
    MyEclipse10安装SVN插件
    IE浏览器的卸载操作
    739. Daily Temperatures 每日温度
  • 原文地址:https://www.cnblogs.com/chenyushuo/p/5257290.html
Copyright © 2011-2022 走看看