[codeforces 391D2]Supercollider

这题觉得似乎不难的样子……

但硬是没有做出来,真是不知说什么好喵~

注意到没有两条共线的线段具有公共点,没有重合的线段

说明每个十字形最多涉及一个水平线段和一个竖直线段

这说明我们可以二分了:每条线段两端砍掉delta长度后,有没有线段有公共点?

很水的扫描线吧~  按 X 轴扫描,先把横的线段扫进去,再用竖的线段去查询

但是写法是很重要的,我说我不用线段树你信喵?我说我连离散化都不用你信喵?

约大爷教你做人!@Ruchiose

  1 #include <cstdio>
  2 #include <algorithm>
  3 #include <set>
  4 const int size=100000;
  5
  6 namespace IOspace
  7 {
  8     inline int getint()
  9     {
 10         register int num=0;
 11         register char ch=0, last;
 12         do last=ch, ch=getchar(); while (ch<‘0‘ || ch>‘9‘);
 13         do num=num*10+ch-‘0‘, ch=getchar(); while (ch>=‘0‘ && ch<=‘9‘);
 14         if (last==‘-‘) num=-num;
 15         return num;
 16     }
 17     inline void putint(int num, char ch=‘\n‘)
 18     {
 19         char stack[10];
 20         register int top=0;
 21         if (num==0) stack[top=1]=‘0‘;
 22         for ( ;num;num/=10) stack[++top]=num%10+‘0‘;
 23         for ( ;top;top--) putchar(stack[top]);
 24         if (ch) putchar(ch);
 25     }
 26 }
 27
 28 struct line
 29 {
 30     int x, y, l;
 31     inline line() {}
 32     inline line(int _x, int _y, int _l):x(_x), y(_y), l(_l) {}
 33 };
 34 struct node
 35 {
 36     int type;
 37     int x, y1, y2;
 38     inline node() {}
 39     inline node(int _type, int _x, int _y1, int _y2):type(_type), x(_x), y1(_y1), y2(_y2) {}
 40     inline bool operator < (node a) const {return x!=a.x?x<a.x:type*y2>a.type*a.y2;}
 41 };
 42
 43 int n, m, k;
 44 line h[size], s[size];
 45 node q[size];
 46 std::multiset<int> t;
 47 inline int max(int x, int y) {return x>y?x:y;}
 48 inline void swap(int & a, int & b) {int t=a; a=b; b=t;}
 49 inline bool query(int, int);
 50 inline bool check(int);
 51
 52 int main()
 53 {
 54     n=IOspace::getint(); m=IOspace::getint();
 55     for (int i=0;i<n;i++) s[i].x=IOspace::getint(), s[i].y=IOspace::getint(), s[i].l=IOspace::getint();
 56     for (int i=0;i<m;i++) h[i].x=IOspace::getint(), h[i].y=IOspace::getint(), h[i].l=IOspace::getint();
 57
 58     int left=0, right=0, mid;
 59     for (int i=0;i<n;i++) right=max(right, s[i].l);
 60     while (left+1<right)
 61     {
 62         mid=(left+right)>>1;
 63         if (check(mid)) left=mid;
 64         else right=mid;
 65     }
 66
 67     IOspace::putint(left);
 68
 69     return 0;
 70 }
 71
 72 inline bool query(int l, int r)
 73 {
 74     return t.lower_bound(l)!=t.upper_bound(r);
 75 }
 76 inline bool check(int d)
 77 {
 78     k=0;
 79     for (int i=0;i<m;i++) if (h[i].l>=(d<<1))
 80     {
 81         q[k++]=node(1, h[i].x+d, h[i].y, 1);
 82         q[k++]=node(1, h[i].x+h[i].l-d, h[i].y, -1);
 83     }
 84     for (int i=0;i<n;i++) if (s[i].l>=(d<<1))
 85         q[k++]=node(0, s[i].x, s[i].y+d, s[i].y+s[i].l-d);
 86     std::sort(q, q+k);
 87     t.clear();
 88     for (int i=0;i<k;i++)
 89     {
 90         if (q[i].type)
 91         {
 92             if (q[i].y2==1) t.insert(q[i].y1);
 93             else t.erase(t.find(q[i].y1));
 94         }
 95         else
 96             if (query(q[i].y1, q[i].y2))
 97                 return true;
 98     }
 99     return false;
100 }

本傻受益匪浅系列

只存操作(包括插入、删除、询问)真是无比的高大上,跪跪跪

还有那鬼畜的查询写法

(set).lower_bound(l)!=(set).upper_bound(r)

可以查询 [l..r] 中是否有数存在,至于为什么这样是对的而不是别的样子了,大家在纸上画画就知道了吧

其实更好理解的是

当 (set).lower_bound(l)==(set).upper_bound(r) 时, [l..r] 中一定没有数

lower_bound是为了将 l 算入 [l..r] 中,upper_bound(r) 也是为了将 r 算入 [l..r] 中

真是跪跪跪跪跪跪跪跪

[codeforces 391D2]Supercollider,布布扣,bubuko.com

时间: 2024-10-12 13:23:19

[codeforces 391D2]Supercollider的相关文章

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Codeforces Round #408 (Div. 2) B

Description Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, numbered from 1 to n, placed along the x-axis on a table that has m holes on it. More precisely, cup i is on the table at the position x?=?i. The probl

Codeforces 617 E. XOR and Favorite Number

题目链接:http://codeforces.com/problemset/problem/617/E 一看这种区间查询的题目,考虑一下莫队. 如何${O(1)}$的修改和查询呢? 令${f(i,j)}$表示区间${\left [ l,r \right ]}$内数字的异或和. 那么:${f(l,r)=f(1,r)~~xor~~f(1,l-1)=k}$ 记一下前缀异或和即可维护. 1 #include<iostream> 2 #include<cstdio> 3 #include&l

CodeForces - 601A The Two Routes

http://codeforces.com/problemset/problem/601/A 这道题没想过来, 有点脑筋急转弯的感觉了 本质上就是找最短路径 但是卡在不能重复走同一个点 ---->>> 这是来坑人的 因为这是一个完全图(不是被road 连接  就是被rail连接 ) 所以一定有一条直接连1 和 n的路径 那么只用找没有连 1 和 n 的路径的 那个图的最短路即可 然后这个dijkstra写的是O(V^2)的写法 以后尽量用优先队列的写法O(ElogV) 1 #includ