codeforces(Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) )(C,D)
1 second
256 megabytes
standard input
standard output
You are given an array consisting of n non-negative integers a1, a2, ..., an.
You are going to destroy integers in the array one by one. Thus, you are given the permutation of integers from 1 to n defining the order elements of the array are destroyed.
After each element is destroyed you have to find out the segment of the array, such that it contains no destroyed elements and the sum of its elements is maximum possible. The sum of elements in the empty segment is considered to be 0.
The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the length of the array.
The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).
The third line contains a permutation of integers from 1 to n — the order used to destroy elements.
Print n lines. The i-th line should contain a single integer — the maximum possible sum of elements on the segment containing no destroyed elements, after first i operations are performed.
4
1 3 2 5
3 4 1 2
5
4
3
0
5
1 2 3 4 5
4 2 3 5 1
6
5
5
1
0
8
5 5 4 4 6 6 5 5
5 2 8 7 1 3 4 6
18
16
11
8
8
6
6
0
思路:并查集;
倒着来做,每次我们向原来的序列中加点,那么我们如果知道他的左边i-1和右边i+1,是否已经存在,那么我们就可以将他们合并,这个用并查集维护就可以了,然后,用当前加入的点,所构成的段去更新最大值即可。
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<set>
7 #include<math.h>
8 #include<map>
9 using namespace std;
10 typedef long long LL;
11 LL ans[100005];
12 int bns[100005];
13 int bin[100005];
14 int du[100005];
15 LL ask[100005];
16 bool flag[100005];
17 LL cost[100005];
18 int main(void)
19 {
20 int n;
21 scanf("%d",&n);
22 {
23 int i,j;memset(cost,0,sizeof(cost));
24 for(i = 1; i <= n; i++)
25 {
26 scanf("%lld",&ans[i]);
27 }
28 for(i = 1; i <= n; i++)
29 {
30 scanf("%d",&bns[i]);
31 }
32 for(i = 0; i <= 100000; i++)
33 {
34 bin[i] = i;
35 du[i] = 1;
36 }
37 LL maxx = 0;
38 for(i = n; i >= 1; i--)
39 {
40 ask[i] = maxx;
41 flag[bns[i]] = true;
42 cost[bns[i]] = ans[bns[i]];
43 maxx =max(maxx,ans[bns[i]]);
44 if(flag[bns[i]-1])
45 {
46 int xx = bns[i];
47 int yy = bns[i]-1;
48 int x,y;
49 for(x = xx; x!=bin[x];)
50 x = bin[x];
51 for(y = yy; y!=bin[y];)
52 y = bin[y];
53 if(du[x]>du[y])
54 {
55 bin[y] = x;
56 du[x]+=du[y];
57 cost[x]+=cost[y];
58 maxx = max(maxx,cost[x]);
59 }
60 else
61 {
62 bin[x] = y;
63 du[y]+=du[x];
64 cost[y]+=cost[x];
65 maxx = max(maxx,cost[y]);
66 }
67 }
68 if(flag[bns[i]+1])
69 {
70 int xx = bns[i];
71 int yy = bns[i]+1;
72 int x,y;
73 for(x = xx; x!=bin[x];)
74 x = bin[x];
75 for(y = yy; y!=bin[y];)
76 y = bin[y];
77 if(du[x]>du[y])
78 {
79 bin[y] = x;
80 du[x]+=du[y];
81 cost[x]+=cost[y];
82 maxx = max(maxx,cost[x]);
83 }
84 else
85 {
86 bin[x] = y;
87 du[y]+=du[x];
88 cost[y]+=cost[x];
89 maxx = max(maxx,cost[y]);
90 }
91 }
92 }
93 for(i = 1;i <= n;i++)
94 {
95 printf("%lld\n",ask[i]);
96 }
97 }
98 return 0;
99 }
C
2 seconds
256 megabytes
standard input
standard output
You are given a set Y of n distinct positive integers y1, y2, ..., yn.
Set X of n distinct positive integers x1, x2, ..., xn is said to generate set Y if one can transform X to Y by applying some number of the following two operation to integers in X:
- Take any integer xi and multiply it by two, i.e. replace xi with 2·xi.
- Take any integer xi, multiply it by two and add one, i.e. replace xi with 2·xi + 1.
Note that integers in X are not required to be distinct after each operation.
Two sets of distinct integers X and Y are equal if they are equal as sets. In other words, if we write elements of the sets in the array in the increasing order, these arrays would be equal.
Note, that any set of integers (or its permutation) generates itself.
You are given a set Y and have to find a set X that generates Y and the maximum element of X is mininum possible.
The first line of the input contains a single integer n (1 ≤ n ≤ 50 000) — the number of elements in Y.
The second line contains n integers y1, ..., yn (1 ≤ yi ≤ 109), that are guaranteed to be distinct.
Print n integers — set of distinct integers that generate Y and the maximum element of which is minimum possible. If there are several such sets, print any of them.
5
1 2 3 4 5
4 5 2 3 1
6
15 14 3 13 1 12
12 13 14 7 3 1
6
9 7 13 17 5 11
4 5 2 6 3 1
思路:贪心;
每次选取当前数中最大的进行除2,当队列中没有的时候将新的数加入队列继续,如果存在则一直进行下去,如果得到0,那么说明当前的数已经不能分解了.复杂度(n*log(n)^2)
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<set>
7 #include<math.h>
8 #include<map>
9 using namespace std;
10 typedef long long LL;
11 int ans[50005];
12 int bns[50005];
13 typedef struct pp
14 {
15 int x;
16 bool operator<(const pp &cx)const
17 {
18 return cx.x>x;
19 }
20 } ss;
21 priority_queue<ss>que;
22 map<int,int>my;
23 int main(void)
24 {
25 int n;
26 while(scanf("%d",&n)!=EOF)
27 {
28 int i,j;int cn = 0;
29 my.clear();
30 while(!que.empty())
31 que.pop();
32 for(i = 0; i < n; i++)
33 {
34 scanf("%d",&ans[i]);
35 ss ak;
36 ak.x = ans[i];
37 que.push(ak);
38 my[ans[i]]++;
39 }
40 while(true&&!que.empty())
41 {
42 ss ak = que.top();
43 //printf("%d\n",ak.x);
44 que.pop();
45 int v = ak.x;
46 my[ak.x]--;
47 int c = ak.x/2;
48 while(my.count(c))
49 {
50 c/=2;
51 }
52 if(c == 0)
53 {
54 bns[cn++] = v; break;
55 }
56 else
57 {
58 ak.x = c;
59 que.push(ak);
60 my[c]++;
61 }
62 }
63 while(!que.empty())
64 {
65 bns[cn++] = que.top().x;
66 que.pop();
67 }
68 printf("%d",bns[0]);
69 for(i = 1;i < cn;i++)
70 {
71 printf(" %d",bns[i]);
72 }
73 printf("\n");
74 }
75 return 0;
76 }
D
codeforces(Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) )(C,D)的更多相关文章
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) B. Verse Pattern 水题
B. Verse Pattern 题目连接: http://codeforces.com/contest/722/problem/B Description You are given a text ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A B C D 水 模拟 并查集 优先队列
A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)
A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)(set容器里count函数以及加强for循环)
题目链接:http://codeforces.com/contest/722/problem/D 1 #include <bits/stdc++.h> #include <iostr ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array -- 逆向思维
原题中需要求解的是按照它给定的操作次序,即每次删掉一个数字求删掉后每个区间段的和的最大值是多少. 正面求解需要维护新形成的区间段,以及每段和,需要一些数据结构比如 map 和 set. map< ...
- 二分 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D
http://codeforces.com/contest/722/problem/D 题目大意:给你一个没有重复元素的Y集合,再给你一个没有重复元素X集合,X集合有如下操作 ①挑选某个元素*2 ②某 ...
- 线段树 或者 并查集 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C
http://codeforces.com/contest/722/problem/C 题目大意:给你一个串,每次删除串中的一个pos,问剩下的串中,连续的最大和是多少. 思路一:正方向考虑问题,那么 ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets 贪心
D. Generating Sets 题目连接: http://codeforces.com/contest/722/problem/D Description You are given a set ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 带权并查集
C. Destroying Array 题目连接: http://codeforces.com/contest/722/problem/C Description You are given an a ...
随机推荐
- CMSIS-RTOS 信号量Semaphores
信号量Semaphores 和信号类似,信号量也是一种同步多个线程的方式,简单来讲,信号量就是装有一些令牌的容器.当一个线程在执行过程中,就可能遇到一个系统调用来获取信号量令牌,如果这个信号量包含多个 ...
- Git五个常见问题及解决方法
一.删除远程仓库上被忽略的文件 由于种种原因,一些本应该被忽略的文件被我们误操作提交到了远程仓库了.那么我们该怎么删除这些文件呢? 以误提交了.idea目录为例,我们可以通过下面的步骤处理: 1)我们 ...
- URLDNS分析
学习了很久的Java基础,也看了很多的Java反序列化分析,现在也来分析学习哈最基础的URLDNS反序列化吧. Java反序列化基础 为了方便数据的存储,于是乎有了现在的Java序列化于反序列化.序列 ...
- 巩固javaweb的第二十八天
巩固内容: 设置页面的编码方式 实现代码: 每个 JSP 页面都需要设置编码方式,设置 JSP 页面的编码方式可以是下面两种方式 之一. 方式一: <%@ page contentType=&q ...
- 日常Java 2021/11/16
获得applet参数 下面的例子演示了如何使用一个Applet响应来设置文件中指定的参数.该Applet显示了-个黑色棋盘图案和第二种颜色.第二种颜色和每一列的大小通过文档中的Applet的参数指定. ...
- 学习java 7.12
学习内容: File是文件和目录路径名的抽象表示,File封装的不是一个真正存在的文件,仅仅是一个路径名 File类的方法 绝对目录和相对目录的区别 字节流 使用字节输出流写数据的步骤 : 创建字节输 ...
- GO瞬间并发数控制
var wg2 sync.WaitGroup wg2.Add(nums) xc :=0 parallelNum := plt.MaxParallel var waitCount int32 = 0 f ...
- When should we write our own copy constructor?
Reference:http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html Please write ...
- Vue API 4 (过渡和动画)
transition name 用于自动生成 CSS 过渡类名.例如:name: fade 将自动拓展为 .fade-enter ,.fade-enter-active等.默认类名为 "v& ...
- 【Java】面向类与对象
一.面向对象 对象封装:私有变量+公共方法 方法与构造方法 this变量 Animal.java public class Animal { String name; int age; void mo ...