http://www.elijahqi.win/2018/02/06/bzoj5139/
我这种智商低下曾经还不努力的人如果现在不努力,怕是没有大学上了
【题意】
n个奶牛排成一排,顺次编号为1到n
John每次给队头发一个礼物,然后队头移动到后面去
若奶牛i是队头,则它拿到礼物后会插入到倒数第ai个奶牛的前面
若John发了+∞次礼物,则有多少个奶牛一个礼物也拿不到呢?
【数据范围】
n≤100000
想了很久不得 于是膜了leoly的代码 什么为什么别人比我快这么多? 因为没有线段树..
每次我可以去二分一下我认为这头牛他会得到礼物 那么什么情况下他不会得到礼物呢 那么就是他前面的牛 所去到的位置全部都在他前面的时候我这头牛就一定得不到 那么就 把认为能得到礼物的边界那个人缩小

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 110000
#define inf 0x3f3f3f3f
using namespace std;
inline char gc(){static char now[1<<16],*S,*T;if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=gc();return x*f;
}
int b[N],n,sum[N];
inline bool check(int mid){memset(sum,0,sizeof(sum));int ans=0;for (int i=1;i<=mid;++i) ++sum[b[i]];for (int i=1;i<=n;++i){ans+=sum[i];if (ans>=i) return 1;}return 0;
}
int main(){freopen("bzoj5139.in","r",stdin);n=read();for (int i=1;i<=n;++i) b[i]=n-read();int l=1,r=n;while(l<=r){int mid=l+r>>1;if (check(mid)) r=mid-1;else l=mid+1;}printf("%d",n-l);return 0;
}

线段树:leolyun的做法
可以想象 我一定是由于前面的前缀陷入了循环导致后面无法get礼物 问题在于怎么寻找这个最小的环 我可以预处理 每个位置都是由哪些牛到来 那么我可以知道 如果我到这部分的总牛数>=i的时候说明我有可能是答案了 这时候我需要去贰分一下 找到最后一个是谁填满了我前面i个前缀 如果我是前面的一部分人 恰好填满到i那么说明我那个人有可能就是答案 所以我认为只需要找到第一个与之相等的地方退出即可 即到达前i个位置的数他之前的数能够满足构成循环
update进一步思考 我认为只要陷入循环 我给他重新编号之后偶可以直接认为是一个前缀在循环就是因为这个最终循环状态中我一定是整个前缀都参与了这个循环所以 因为最后问多少个牛没拿到 不妨 进行重新编号也不会影响

#include<vector>
#include<cstdio>
#include<algorithm>
#define N 110000
#define inf 0x3f3f3f3f
using namespace std;
inline char gc(){static char now[1<<16],*S,*T;if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=gc();return x*f;
}
struct node{int left,right,sum;
}tree[N<<1];
vector<int>a[N];int num,n,root,ans=inf;
inline void build(int &x,int l,int r){x=++num;if(l==r) return;int mid=l+r>>1;build(tree[x].left,l,mid);build(tree[x].right,mid+1,r);
}
inline void insert1(int x,int l,int r,int p){tree[x].sum+=1;if (l==r) return;int mid=l+r>>1;if (p<=mid) insert1(tree[x].left,l,mid,p);else insert1(tree[x].right,mid+1,r,p);
}
inline int qr(int x,int l,int r,int p){if (!x) return inf;if (l==r) return l;int mid=l+r>>1;if (p<=tree[tree[x].left].sum) return qr(tree[x].left,l,mid,p);else return qr(tree[x].right,mid+1,r,p-tree[tree[x].left].sum);
}
inline void print(int x,int l,int r){int mid=l+r>>1;if (tree[x].left) print(tree[x].left,l,mid);printf("%d %d %d\n",l,r,tree[x].sum);if (tree[x].right) print(tree[x].right,mid+1,r);
}
int main(){
//  freopen("bzoj5139.in","r",stdin);n=read();for (int i=1;i<=n;++i) {int x=read();a[n-x].push_back(i);}build(root,1,n);
//  for (int i=1;i<=n;++i) for (int j=0;j<a[i].size();++j) printf("%d ",a[i][j]);puts("");for (int i=1;i<=n;++i){for (int j=0;j<a[i].size();++j) insert1(root,1,n,a[i][j]);//printf("%d\n",qr(root,1,n,i));//print(root,1,n);if (tree[root].sum>=i) ans=min(ans,qr(root,1,n,i));if (ans==i) break;}printf("%d",n-ans);return 0;
}

bzoj5139 [Usaco2017 Dec]Greedy Gift Takers相关推荐

  1. [BZOJ5139][Usaco2017 Dec]Greedy Gift Takers 权值线段树

    Description Farmer John's nemesis, Farmer Nhoj, has NN cows (1≤N≤10^5), conveniently numbered 1-N. T ...

  2. bzoj5139 [Usaco2017 Dec]Greedy Gift Takers(二分答案+模拟)

    首先我们发现如果第x头牛不能拿到礼物,则x之后的所有牛也不能拿到礼物.因此我们可以二分来找到这第一头不能拿到礼物的牛.满足什么条件的牛不能拿到礼物呢?我们预处理出每头牛拿到礼物之后会出现在哪里,如果在 ...

  3. Greedy Gift Takers

    Farmer John's nemesis, Farmer Nhoj, has N cows (1≤N≤105 ), conveniently numbered 1...N .They have un ...

  4. [USACO17DEC]Greedy Gift Takers

    题目描述 Farmer John's nemesis, Farmer Nhoj, has NN cows (1 \leq N \leq 10^51≤N≤105 ), conveniently numb ...

  5. P4090 [USACO17DEC]Greedy Gift Takers

    题目链接 题意分析 首先 如果当前序列中一头奶牛拿不到礼物的话 那么他后面的奶牛也拿不到礼物 所以我们可以二分 由于可以操作无限次 所以我们对于当前\([1,mid)\)的奶牛按照\(c\)值排序之后 ...

  6. USACO 2017 December Contest Platinum T3: Greedy Gift Takers

    题目大意 有 N(1≤N≤1e5)头牛按顺序排成一列,编号从 1 到 N,1 号牛在队头,N 号牛在队尾. 每次位于队头的牛 i 拿到一个礼物,然后插入到从队尾数ci​头牛之前的位置..举个栗子: 初 ...

  7. [USACO 2017DEC] Greedy Gift Takers

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5139 [算法] 二分答案 时间复杂度 : O(NlogN^2) [代码] #incl ...

  8. USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers

    P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers 题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一 ...

  9. Greedy Gift Givers

    原题地址 Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange g ...

最新文章

  1. 如何提高阿里云上应用的可用性(一)
  2. 在华为路由器上配置IPv6 over IPv4隧道
  3. Quora Andy Barton
  4. 为什么我从 npm 到 yarn 再到 npm?
  5. 小甲鱼python课后答案40讲_小甲鱼Python第二十讲课后习题---021
  6. HDMI视频光端机常见故障问题及解决方法
  7. windows 调用linux .a lib,动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)...
  8. rstudio查询命令_Rstudio支持可视化的Markdown编辑了?
  9. 根据div 标签 查看数组@class=modulwrap 下面的/table/tbody/tr/td
  10. MAC使用CodeSign查看已签名的文件的数字签名情况
  11. java 公众号文章爬取_50行代码爬取微信公众号所有文章
  12. ureport2项目使用
  13. Qt编写可视化大屏电子看板系统2-配色方案
  14. 这些高逼格的网站设计,能看到无数美的东西~
  15. 学生如何提高专业英文阅读能力(转自施一公博客)
  16. 专访弘玑Cyclone贾岿、吴楠:超自动化+流程挖掘,助力企业深度掌控完整数字业务流程走势
  17. SLAM【十一】建图
  18. 苹果电脑破音的解决办法
  19. linux 析构函数地址获取_c语言中有析构函数吗
  20. MPEG-2压缩编码技术原理应用

热门文章

  1. [学习记录]realsence d455 +vins-fusion+px4+ego_planner下无人机的悬停与控制
  2. 飞蛾投火式的瞬间灿烂
  3. channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no
  4. 妈蛋,终于在TQ2440上点亮一个led了。。。
  5. java大写md5_java 字符按字母排序-拼接-md5加密-大写
  6. 百度地图 appkey_android,百度地图AppKey的申请
  7. 父类引用指向子类对象是什么意思
  8. 面向对象——类与对象的概念
  9. U盘无法格式化的几个解决方法
  10. 【Rust每周一库】anyhow和thiserror - 错误处理库