ACM基础训练题解4302 丢失的牛

简单线段树插入和查询删除

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstring>
 4 using namespace std;
 5 int num[10000];
 6 int node[20000];
 7 int scale;
 8 void clear(int n){
 9     scale=1;
10     while(scale<=n+1)
11       scale=scale<<1;
12     memset(node,0,sizeof(node));
13     for(int i=scale+1;i<=scale+n;i++)
14         node[i]=1;
15     for(int i=scale-1;i>=1;i--)
16        node[i]=node[i+i]+node[i+i+1];
17     return ;
18 }
19 int insert(int loc){
20     int p=1;
21     while(p<scale){
22         node[p]--;
23         if(node[p<<1]-loc>0)
24            p+=p;
25         else {
26             loc-=node[p<<1];
27             p=p+p+1;
28         }
29     }
30     node[p]=0;
31     return (p-scale);
32 }
33 int main(){
34     int n;
35     cin>>n;
36     clear(n);
37     num[1]=0;
38     for(int i=2;i<=n;i++)
39        cin>>num[i];
40     for(int i=n;i>=1;i--)
41        num[i]=insert(num[i]);
42     for(int i=1;i<=n;i++)
43       cout<<num[i]<<endl;
44     return 0;
45 }

ACM基础训练题解4302 丢失的牛,布布扣,bubuko.com

时间: 2024-10-29 19:08:36

ACM基础训练题解4302 丢失的牛的相关文章

ACM基础训练题解4301 城市地平线

遍历线段树   线段树的插入和查询 1 //城市地平线(线段树) 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<cstdio> 7 using namespace std; 8 typedef __int64 LL; 9 struct building{ 10 LL x1; 11 LL x2; 12 LL

洛谷P1588 丢失的牛

P1588 丢失的牛 158通过 654提交 题目提供者JOHNKRAM 标签USACO 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 答案下载下来是对的,但过不- 此题卡stl的queue? 假的编译器... 怎么A不了 题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他至少需要几步追上他的牛. 输入输出

洛谷——P1588 丢失的牛

P1588 丢失的牛 题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他至少需要几步追上他的牛. 输入输出格式 输入格式: 第一行为一个整数t(≤10),表示数据组数:接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标. 输出格式: 对于每组数据,输出最少步数. 输入输出样例 输入样例#1: 1 5 17 输出样例#

heu acm基础训练 1001

哈尔滨工程大学 online judge acm训练之分治算法 原题大意:求a ,b,之间的数有多少个1,包括a,b. 这题典型的分治算法: 举例说明: 以197为例: 那么我们将其分为个位,十位,个位7上有一个,那么在190~197上有7+1个 然后整十位上的为18,即197/10-1,然后其权值将变为10.如此进行. 源代码: #include<stdio.h> #define N 11 int d[N],value; int deal(int n) { int one ,ten ; if

【题解】P2854 [USACO06DEC]牛的过山车Cow Roller Coaster

P2854 [USACO06DEC]牛的过山车Cow Roller Coaster 题目描述 The cows are building a roller coaster! They want your help to design as fun a roller coaster as possible, while keeping to the budget. The roller coaster will be built on a long linear stretch of land o

【luoguP1588】丢失的牛

Luogu题目链接:https://www.luogu.org/problem/P1588 思路:有三种走法,x+1,x-1,x*2 可以宽搜做此题 #include <bits/stdc++.h> using namespace std; #define maxn 1000000 int used[maxn]; struct node{ int x,t;//x记录坐标,t记录步数 }; //宽搜 int bfs(int x,int y){ queue<node> q; q.pus

2016年山东省acm比赛题解(差l和h)

a Julyed 题意:n个单词,每天最多背m个单词,最少背多少天 分析:水题,不解释 #include<bits/stdc++.h> using namespace std; int main(){ int t,n,m; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); int ans=n/m; if(n%m!=0) ans++; printf("%d\n",a

[Luogu P1588]丢失的牛

本题抽象一下就是从一个点出发,然后经过坐标x2或+1或-1到另一个点.显然这就是一个搜索题,而且显然可以看出步数最多就是两个点坐标之差.但是数据范围105,直接暴搜肯定要么MLE要么TLE,肯定不行,一定要加上优化. 我们注意到坐标的范围是(0,105],那么如果一个点扩展到了这个范围之外显然就不可能得到解了,因此直接剪枝.同时我们用bfs搜索,显然第一次搜到某个点那一定是到这个点的最少步数,之后再到达这个点就没必要再搜一遍了,有些记忆化的思想. 所以最后一顿剪枝操作就可以通过本题了,模拟的时候

【题解】 P3043 [USACO12JAN]牛联盟Bovine Alliance

题意:现在有$n$个点,$m$条边的图,$1 \leq m \leq n$,让点和其所连边进行配对,一个点或边只能配对一次,所有边必须配对,而点可以无需配对 这题有思维无码量还是比较友好的 现在我们有一张连通图,设它边数为$m$,点数为$n$,显然$m \ge n-1$ 根据题意,一个点只能和一条边配对,自然的若在当前图中$m > n$,则是无解的 接下来进行分类讨论 $m=n$的情况下,有点类似**基环树**的感觉...思考和环有关的性质,若现在有一条环,每个点要和一条边进行匹配,不难发现匹配