zoukankan      html  css  js  c++  java
  • 【NOIP2011提高组】选择客栈

      题目不附了,是一个单纯的ST模型,但是考验各种常数优化。

      最大的优化是对于同颜色的客栈来说,如果1号和2号成功配对了,那么1和3,1和4都可以成功配对,那么只要找到一对成功配对的,我们就直接加上剩下的对数就好了。

      代码之中使用了一些特殊的存储方式做了点查询枚举的优化,可能有点难看……我找个时间敲一个比较易懂的代码,在那之前就麻烦客官看看这个丑的要死的代码了OYZ

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <fstream>
     4 #include <cstring>
     5 #include <cstdlib>
     6 #include <cmath>
     7 using namespace std;
     8 ifstream fin("hotel.in");
     9 ofstream fout("hotel.out");
    10 int Beiz[200005][20][2]={0},Hote[200005][2]={0};//0为颜色,1为价格
    11 int Color[52][200005]={0};//第i种颜色的顺序排列客栈
    12 int gs[52]={0};//
    13 int C2[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288};
    14 int bh[200005]={0};//在Color数组中的编号
    15 int Colors=0,Hots=0,Most=0;
    16 void Bz(int cs);//倍增预处理
    17 int ST(int ks,int js);//ST算法查询最小值 
    18 int main(void)
    19 {
    20  fin>>Hots>>Colors>>Most;
    21  for(int i=1;i<=Hots;i++)
    22     {
    23      fin>>Hote[i][0]>>Hote[i][1];
    24      Color[Hote[i][0]][++gs[Hote[i][0]]]=i;
    25      bh[i]=gs[Hote[i][0]];
    26      Beiz[i][0][1]=Hote[i][1];
    27      Beiz[i][0][0]=i+1;
    28     }
    29  Bz(1);
    30  long long int Least=0ll,Fas=0ll,Zz=0ll,Gs=0ll;
    31  for(int i=1;i<=Hots;i++)
    32     {
    33      for(int j=bh[i]+1;j<=gs[Hote[i][0]];j++)
    34         {
    35          Zz=Color[Hote[i][0]][j];
    36          Least=ST(i,Zz);
    37          if(Least<=Most)
    38            {
    39             Fas+=gs[Hote[i][0]]-j+1;
    40             break;
    41            }
    42         }
    43     }
    44  fout<<Fas<<"
    ";
    45  return 0;
    46 }
    47 
    48 void Bz(int cs)
    49 {
    50  if(cs==20)return;
    51  for(int i=1;i<=Hots;i++)
    52     {
    53      Beiz[i][cs][1]=min(Beiz[Beiz[i][cs-1][0]][cs-1][1],Beiz[i][cs-1][1]);
    54      Beiz[i][cs][0]=Beiz[Beiz[i][cs-1][0]][cs-1][0];
    55     }
    56  Bz(cs+1);
    57  return;
    58 }
    59 
    60 int ST(int ks,int js)
    61 {
    62  int L1=0,L2=0,Mid=0;
    63  double K=log((double)(js-ks))/log((double)2);
    64  Mid=(int)K;
    65  L1=Beiz[ks][Mid][1];
    66  L2=Beiz[js-C2[Mid]+1][Mid][1];
    67  return min(L1,L2);
    68 }
  • 相关阅读:
    实现Java中的ArrayList
    官方下拉刷新控件SwipeRefreshLayout的使用
    SpannableString的基本用法
    AlarmManager的使用
    在Android上使用Socket
    HttpURLConnection、HttpClient和Session
    Cocos2d入门及第一次运行时遇到的问题
    Thread的start和run的区别
    《重构》心得
    startActivityForResult()的用法(超好用啊)
  • 原文地址:https://www.cnblogs.com/CYWer/p/4801213.html
Copyright © 2011-2022 走看看