zoukankan      html  css  js  c++  java
  • Beta Round #9 (酱油杯noi考后欢乐赛)乌鸦喝水

    题目:http://www.contesthunter.org/contest/Beta%20Round%20%EF%BC%839%20%28%E9%85%B1%E6%B2%B9%E6%9D%AFnoi%E8%80%83%E5%90%8E%E6%AC%A2%E4%B9%90%E8%B5%9B%29/%E4%B9%8C%E9%B8%A6%E5%96%9D%E6%B0%B4

    题解:真是一道神题!考场上绝对想不到标算orz!

    题解写在代码注释里

    代码:

      1 #include<cstdio>
      2 
      3 #include<cstdlib>
      4 
      5 #include<cmath>
      6 
      7 #include<cstring>
      8 
      9 #include<algorithm>
     10 
     11 #include<iostream>
     12 
     13 #include<vector>
     14 
     15 #include<map>
     16 
     17 #include<set>
     18 
     19 #include<queue>
     20 
     21 #include<string>
     22 
     23 #define inf 1000000000
     24 
     25 #define maxn 100000+5
     26 
     27 #define maxm 500+100
     28 
     29 #define eps 1e-10
     30 
     31 #define ll long long
     32 
     33 #define pa pair<int,int>
     34 
     35 #define for0(i,n) for(int i=0;i<=(n);i++)
     36 
     37 #define for1(i,n) for(int i=1;i<=(n);i++)
     38 
     39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
     40 
     41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
     42 
     43 #define mod 1000000007
     44 
     45 using namespace std;
     46 
     47 inline int read()
     48 
     49 {
     50 
     51     int x=0,f=1;char ch=getchar();
     52 
     53     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     54 
     55     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
     56 
     57     return x*f;
     58 
     59 }
     60 int n,m,h,s[maxn],a[maxn],b[maxn],id[maxn];
     61 inline void add(int x,int y){for(;x<=n;x+=x&(-x))s[x]+=y;}
     62 inline int sum(int x){int t=0;for(;x;x-=x&(-x))t+=s[x];return t;}
     63 inline bool cmp(int x,int y){return b[x]==b[y]?x<y:b[x]<b[y];}
     64 
     65 int main()
     66 
     67 {
     68 
     69     freopen("input","r",stdin);
     70 
     71     freopen("output.txt","w",stdout);
     72 
     73     n=read();m=read();h=read();
     74     for1(i,n)a[i]=read();
     75     for1(i,n)
     76     {
     77         int x=read();
     78         if(a[i]<=h)b[i]=(h-a[i])/x+1;//b[i]表示该点最多可以被饮几次水
     79         if(b[i]>0)add(i,1);id[i]=i;
     80     }
     81     //可以证明,最后的答案一定是某个b[i],所以我们按b[i]从小到大处理
     82     sort(id+1,id+n+1,cmp);
     83     int now=1,pos=0,ans=0,st=n+1;//now 表示当前的趟数
     84     //for1(i,n)cout<<i<<' '<<id[i]<<' '<<b[i]<<endl;
     85     for1(i,n)if(b[id[i]]){st=i;break;}
     86     for2(i,st,n)
     87     {
     88         while(now<=m)
     89         {
     90             int t=sum(n)-sum(pos);
     91             if(ans+t<b[id[i]])ans+=t,now++,pos=0;//如果可以走完这一趟
     92             else break;
     93         }
     94         if(now>m)break;
     95         int l=pos,r=n,t=sum(pos);
     96         while(l<=r)
     97         {
     98             int mid=(l+r)>>1;
     99             if(sum(mid)-t+ans>=b[id[i]])r=mid-1;else l=mid+1;
    100         }//二分到下一个点
    101         ans=b[id[i]];pos=l;
    102         for(;b[id[i]]==b[id[i+1]];i++)add(id[i],-1);//去除不能再次饮水的点
    103         add(id[i],-1);
    104     }
    105     printf("%d
    ",ans);
    106 
    107     return 0;
    108 
    109 } 
    View Code
  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4121265.html
Copyright © 2011-2022 走看看