百度之星复赛Astar Round3

拍照

树状数组。求出静止状态下,每个点能看到多少个向右开的船c1[i],多少个向左开的船c2[i]。

max{c1[i],   max{ c2[j], (i <= j) } }即为答案。

注意要离散化,否则会Tle。

 1 #include <bits/stdc++.h>
 2 typedef long long ll;
 3 using namespace std;
 4
 5 const int maxn =2e4;
 6 //c1 向右开的船
 7 int c1[maxn<<2], c2[maxn<<2];
 8 int s1[maxn<<2], s2[maxn<<2];
 9
10 int lowbit(int x){ return x&-x;}
11 void add(int x, int d, int* c){//c[x]++;
12     while(x <= (maxn<<2)){
13         c[x] += d;
14         x += lowbit(x);
15     }
16 }
17 void Add(int l, int r, int* c){
18     add(l, 1, c);
19     add(r+1, -1, c);
20 }
21 int sum(int x, int* c){
22     int ret = 0;
23     while(x > 0){
24         ret += c[x];
25         x -= (x&-x);
26     }
27     return ret;
28 }
29
30 int n;
31 int ope[maxn], tot;
32 struct p{
33     int l, r, d;
34     p(){}
35     p(int l, int r, int d):l(l), r(r), d(d){}
36 };
37 p pp[maxn];
38
39 int main(){
40     int t, ca = 1;scanf("%d", &t);
41     while(t--){
42         scanf("%d", &n);
43         memset(c1, 0, sizeof(c1));
44         memset(c2, 0, sizeof(c2));
45         int l, r, x, y, z, d;
46
47         tot = 0;
48         for(int i = 0; i < n; i++){
49             scanf("%d%d%d%d", &x, &y, &z, &d);
50             l = y-z+maxn, r = x+z+maxn;
51             ope[tot++] = l, ope[tot++] = r;
52             pp[i] = p(l, r, d);
53         }
54
55         sort(ope, ope+tot);
56         //tot = unique(ope, ope+tot)-ope;
57         for(int i = 0; i < n; i++){
58             int l = lower_bound(ope, ope+tot, pp[i].l)-ope+1;
59             int r = lower_bound(ope, ope+tot, pp[i].r)-ope+1;
60             int d = pp[i].d;
61             if(l <= r)
62                 Add(l, r, (d == 1? c1 : c2));
63         }
64
65         for(int i = 0; i < (maxn<<2); i++)
66             s1[i] = sum(i, c1);
67         for(int i = 0; i < (maxn<<2); i++)
68             s2[i] = sum(i, c2);
69
70         int ans = 0;
71         for(int i = (maxn<<2)-2; i > 0; i--){
72             s2[i] = max(s2[i], s2[i+1]);
73             ans = max(ans, s1[i]+s2[i]);
74         }
75         printf("Case #%d:\n%d\n", ca++, ans);
76     }
77     return 0;
78 }

时间: 2024-11-10 01:11:23

百度之星复赛Astar Round3的相关文章

2016百度之星复赛 1003 拍照 优先队列

2016"百度之星" - 复赛(Astar Round3) Ended 2016-05-29 14:00:00 - 2016-05-29 17:00:00 Current Time: 00:46:02 Solved Pro.ID Title Ratio(Accepted / Submitted) Language   1001 D++游戏 13.79% (16/116) 中文   1002 K个联通块 17% (136/800) 中文 1003 拍照 22.49% (434/1930)

2016&quot;百度之星&quot; - 复赛(Astar Round3) 1003 拍照

拍照 思路:先静态,离线树状数组,分别统计每个点向左向右能看到的船的数量.再枚举整个区间求最大值. 应为人和船都是动态的,假设船往左走,处理每个点看到向左最大船的数量,满足动态条件.就是向左的船一开始在最右边,向右的船一开始在最左边,则两船肯定相向运动到某个地方最佳. 1 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交 2 #include <cstdio> 3 #include <cs

2017百度之星复赛1003Pok&#233;mon GO------hdu6146

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=6146 分析:这道题有点麻烦啊!貌似是原题,讨论情况好恶心啊. 1.首先呢,我们考虑从左上角出发,先从左往右抓到底,再从右往左抓,因为题目要的是步数最少的,所以不能随便      走.每一步选择有2种可能,所以总的方案数是 b[i] = 2^i (i为列数) 2.我们可以第一列抓完,再抓第二列,也从左上角开始,到第二列有两种可能,到上面的格子和到下面的格子,所以 方案数是  2 * a[i-1] (

百度之星复赛T6&amp;&amp;hd6149 ——Valley Numer II

Problem Description 众所周知,度度熊非常喜欢图. 它最近发现了图中也是可以出现 valley -- 山谷的,像下面这张图. 为了形成山谷,首先要将一个图的顶点标记为高点或者低点.标记完成后如果一个顶点三元组<X, Y, Z>中,X和Y之间有边,Y与Z之间也有边,同时X和Z是高点,Y是低点,那么它们就构成一个valley. 度度熊想知道一个无向图中最多可以构成多少个valley,一个顶点最多只能出现在一个valley中. Input 第一行为T,表示输入数据组数. 每组数据的

hdu5713 K个联通块[2016百度之星复赛B题]

dp 代码 1 #include<cstdio> 2 const int N = 30000; 3 const int P = 1000000009; 4 int n,m,k,cnt[N]; 5 long long f[N],g[N],o[N],dp[N][15]; 6 int e[15][15],i,j,l,a,b; 7 int check(int x,int y) 8 { 9 int i; 10 for (i=0;i<n;i++) 11 if ((1<<i)==x) br

Hdu 5696 区间价值(2016百度之星初赛Astar Round2B )(线段树)

思路来源于:http://blog.csdn.net/kk303/article/details/51479423 注意数组用 long long 存,否则WA. /* Problem : Status : By wf, */ #include "algorithm" #include "iostream" #include "cstring" #include "cstdio" #include "string&q

2016百度之星-初赛(Astar Round2A)AII X

Problem Description F(x,m) 代表一个全是由数字x组成的m位数字.请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据. 每组测试数据占一行,包含四个数字x,m,k,c 1≤x≤9 1≤m≤10^10 0≤c<k≤10,000 Output 对于每组数据,输出两行: 第一行输出:"Case #i:".i代表第i组测试数据. 第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式.

最强密码 (百度之星复赛 T5)

题目大意: 给出一个字符串A,要求最短的字符串B,B不是A的子序列. 求最短长度 和 最短的字符串个数    |A|<=105. 题解: 1.比赛的时候没有想出来,时隔一个多月又看到了这道题,虽然已经退役,还是下决心把它弄懂. 2.网络上基本都是直接贴代码的.我还是简要的写一写解法: 可以想象我们在字符串A上移动.一开始在一个起始节点(0号节点)上,如果我们选了字符p,现在在k号节点上,那么我们可以直接跳到p下一次出现的位置r(如果没有,跳到n+1号点). 因为k,r直接没有字符p,就无需考虑它

2017百度之星复赛1001Arithmetic of Bomb------hdu6144

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6144 分析:这道题挺水的,就是讲(a)#(b)表示有b个相连的a,当然也有可能有穿插不是这样表示直接给数字的,比如题目的(12)#(2)4(2)#(3)表示12124222,照着模拟就行了,注意下要到处取模,要不可能出现溢出啥的 代码如下: #include<bits/stdc++.h> using namespace std; typedef long long LL; const LL mod