问题 L: 寄蒜几盒?
题目传送门
此题很难吗?貌似是,反正当时没人A掉,或许是因为大佬们不主动带路,我们没怎么敢看这道题,赛后看题,发现emm…这题还可以(逃)
题目描述见传送门
我们可以提炼出几个要点:
题目是个圆,弱弱的问一句有存圆的数据结构或类型嘛?呃,看成一条直线不就行。
题目数据量感人,我能不能O(N^3)解决?emm....
步入正题:
我的思路:
1.首先既然能构成等边三角形,那么必然,三个点是要平分整个圆的。也就是说只要存在一组三个点他们之间的距离都是三分之一圆弧就行,也就是周长的三分之一。
2.把一个圆找个位置切开,然后拉成一条直线,然后把题目给我们的每一个圆上的点都在这条虚拟的直线上标记一下顺便记录每个点的坐标,那么如果我们能找到三个点坐标之差都为三分之一圆弧就好了。
3.问题在于怎么把虚拟的直线给存下来(用map)
为什么用map,一般标记东西不是直接用数组嘛?因为这里直线可能过于长,数组会直接爆炸,(现场的时候我就没想到用map,赛完康哥给我提示一下,我恍然大雾,你说你真是的,为啥不在现场赛的时候给我个眼神提示我一下呢?差评!哈哈emm…)我们这里开一个map记录一下直线上的哪个坐标被标记了 这样操作map< long long bool> m;
这里贴上AC代码,速度一般,还有很大的优化潜力。没朋哥快,但是比林姐快多了(逃…)
#include <iostream>
#include <map>
using namespace std;
map< long long , int > m;
int n;
long long ll;
long long p;
long long a;
long long x[ 1000006 ] ;
int main ( )
{
cin>> n;
for (