首页 > 其他分享 >Codeforces 1025F Disjoint Triangles

Codeforces 1025F Disjoint Triangles

时间:2024-02-24 21:57:41浏览次数:23  
标签:这条线 int Codeforces 枚举 maxn 端点 Disjoint 三角形 Triangles

结论:如果两个三角形不相交,那么一定存在两条内公切线。

于是可以考虑枚举这条内公切线的端点 \(x, y\)。
那么一个三角形的两个端点就会在 \(x\to y\) 这条线的同一侧,另外一个三角形的两个端点会在这条线的另一侧。
同时这条线的一侧与其配对的端点可能是 \(x\) 也可能是 \(y\)。
所以令在 \(x\to y\) 这条线下面的点的数量为 \(c\),方案数为 \(2\binom{c}{2}\binom{n - 2 - c}{2}\)。

那么可以先枚举 \(x\)。
然后对于每个点按照 \(x\) 极角排序。
再枚举 \(y\),可以用双指针求出在 \(x\to y\) 一侧的点的数量然后计数。

考虑到一对三角形会被 \(2\) 条内切线算到,而因为还定了向,所以会被 \(4\) 条算上。
于是最后答案需除 \(4\)。

时间复杂度 \(O(n^2\log n)\)。

#include<bits/stdc++.h>
#define C2(x) ((x) * ((x) - 1) / 2)
const int maxn = 2e3 + 10;
const double pi = acos(-1);
int X[maxn], Y[maxn];
double a[maxn * 2];
int main() {
    int n; scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d%d", &X[i], &Y[i]);
    long long ans = 0;
    for (int i = 1; i <= n; i++) {
        int m = 0;
        for (int j = 1; j <= n; j++) j != i && (a[++m] = atan2(Y[j] - Y[i], X[j] - X[i]), 1);
        std::sort(a + 1, a + m + 1);
        for (int j = 1; j <= m; j++) a[m + j] = a[j] + pi * 2.0;
        for (int l = 1, r = 1; l <= m; l++) {
            while (a[r] < a[l] + pi) r++;
            int c1 = r - l - 1, c2 = n - 2 - c1;
            ans += 2ll * C2(c1) * C2(c2);
        }
    }
    printf("%lld\n", ans / 4);
    return 0;
}

标签:这条线,int,Codeforces,枚举,maxn,端点,Disjoint,三角形,Triangles
From: https://www.cnblogs.com/rizynvu/p/18031672

相关文章

  • Codeforces 486E LIS of Sequence
    考虑一个暴力的做法:建立一个超级起点\(a_0=0\)超级终点\(a_{n+1}=\inf\)。求出\(f_i\)代表\(1\simi\)且以\(i\)结尾的\(\text{LIS}\)长度。考虑\(f_i=\max\{f_j+1\}(j<i\landa_j<a_i)\)这个转移的式子,如果\(f_i=f_j+1(j<i\landa_j<a_i......
  • codeforces 1575M Managing Telephone Poles
    假设固定了\((x,y)\),考虑其和\((x',y')\)的距离\((x-x')^2+(y-y')^2=x^2-2xx'+x'^2+y^2-2yy'+y'^2=(x^2+y^2)+(-2xx'+x'^2)+(-2yy'+y'^2)\)。第一个括号内的式子是个定值,不用管;第二三个式子都是一次函数的形式......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    不会F的场。A答案是最左的\(1\)和最右的\(1\)之间的\(0\)的个数。Code#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ ios::sync_with_stdio(false); cin.tie(0); intt; cin>>t; while(t--){ intn; cin>>n......
  • Educational Codeforces Round 162 [Rated for Div. 2]
    第二次,三道题,剩下的回学校再补,总结:还是需要多练习A:让数列里所有的1都挨在一起,可以看出,相邻1之间有多少个0就需要操作几次,特判:当只有一个1或者原本全是1就输出0;voidsolve(){cin>>n;inttop1=0,top2=0,cnt=0;memset(a,0,sizeof(a));memset(b,0,siz......
  • Codeforces 799E Aquarium decoration
    考虑去枚举能满足\(1,2\)的个数\(l\),那自然只能满足\(1\)或\(2\)的个数为\(\max\{k-l,0\}\)。对于还剩下的,可以从只能满足\(1,2\)和不能满足任意一个的选出来。显然如果要选就是选最小的。考虑用个数据结构优化这个过程。查询前\(k\)大的和,插入一个数,可以想......
  • Codeforces 图论题
    CF243BHydra枚举点\(u,v\),或者说枚举边。然后找出\(u,v\)分别所连的点。有数组\(st\),结点\(x\)仅与\(u\)相邻则\(st[x]=1\),仅与\(v\)相邻则\(st[x]=2\),与两个点都相邻则\(st[x]=3\)。用数组\(rest\)记录\(st[x]=3\)的所有\(x\)。先优先选走至多\(h\)个\(......
  • Codeforces 869D The Overdosing Ubiquity
    考虑树的\(\text{dfs}\)(根据当前节点\(u\)找到\(v\)满足存在\((u,v)\),然后走向\(v\)进入更深的搜索)为和能做到\(O(n)\)的复杂度。原因是没有环的情况,到每个点只有一条路径。回到这个题,有\(m\)条边导致到每个点可能有多条路径了。能发现其实还是能\(\text{dfs}\)......
  • Codeforces 1876F - Indefinite Clownfish
    首先注意到这样一个性质:既然两个序列的平均值相同,并且又形成公差\(\pm1\)的等差数列,就必然会存在一个元素\(x\)满足\(x\)在两个序列中都出现过(否则两个序列的值域区间不交,值域区间靠后的那个显然平均值比靠前的那个大)。那么我们枚举\(x\)在两个序列中出现的位置\(p\)和......
  • Codeforces Round 923 (Div. 3)
    A.MakeitWhite#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingi128=__int128;usingldb=longdouble;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;usingvii......
  • Codeforces Round 928 (Div. 4)
    CodeforcesRound928(Div.4)比赛链接A.VladandtheBestofFive思路就是统计字符A和字符B的个数,将个数多的那个输出出来Code#include<bits/stdc++.h>usingnamespacestd;#defineall(x)x.begin()+1,x.end()#defineintlonglongvoidsolve(){strings;......