Codeforces Hello 2020 选讲

http://codeforces.com/contest/1284/problem/D

把区间对的第二维放入以第一维为下标的数轴中(如1 2 3 4,就把区间[3,4]放入位置1和位置2),如此同个位置的所有区间必须两两相交,即检验第一维相交?第二维相交。同理检验第二维相交?第一维相交。“放入”可用差分的方式。检验:新加入一个区间[x,y],必须满足y>=s_max,且x<=e_min,其中s和e是起点和终点。可用multiset维护加入、检测、删除。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4
 5 int n;
 6 #define maxn 200011
 7 struct AAA{int c,d,x,y;}a[maxn];
 8 struct EVE
 9 {
10     int pos,x,y; bool ty;
11     bool operator < (const EVE &b) const
12     {return pos<b.pos || (pos==b.pos && ty<b.ty);}
13 }eve[maxn<<1]; int leve=0;
14 multiset<int> muls,mult;
15
16 #define IT multiset<int>::iterator
17 int main()
18 {
19     scanf("%d",&n);
20     for (int i=1;i<=n;i++)
21     {
22         scanf("%d%d%d%d",&a[i].c,&a[i].d,&a[i].x,&a[i].y);
23         eve[++leve]=(EVE){a[i].c,a[i].x,a[i].y,1};
24         eve[++leve]=(EVE){a[i].d+1,a[i].x,a[i].y,0};
25     }
26     sort(eve+1,eve+1+leve);
27
28     muls.clear(); mult.clear();
29     for (int i=1;i<=leve;i++)
30     {
31         if (!eve[i].ty) muls.erase(muls.lower_bound(eve[i].x)),mult.erase(mult.lower_bound(eve[i].y));
32         else
33         {
34             if (!muls.empty())
35             {
36                 IT it=muls.end(); it--;
37                 if (eve[i].y<(*it)) {puts("NO"); return 0;}
38                 it=mult.begin();
39                 if (eve[i].x>(*it)) {puts("NO"); return 0;}
40             }
41             muls.insert(eve[i].x),mult.insert(eve[i].y);
42         }
43     }
44
45     leve=0;
46     for (int i=1;i<=n;i++)
47     {
48         eve[++leve]=(EVE){a[i].x,a[i].c,a[i].d,1};
49         eve[++leve]=(EVE){a[i].y+1,a[i].c,a[i].d,0};
50     }
51     sort(eve+1,eve+1+leve);
52
53     muls.clear(); mult.clear();
54     for (int i=1;i<=leve;i++)
55     {
56         if (!eve[i].ty) muls.erase(muls.lower_bound(eve[i].x)),mult.erase(mult.lower_bound(eve[i].y));
57         else
58         {
59             if (!muls.empty())
60             {
61                 IT it=muls.end(); it--;
62                 if (eve[i].y<(*it)) {puts("NO"); return 0;}
63                 it=mult.begin();
64                 if (eve[i].x>(*it)) {puts("NO"); return 0;}
65             }
66             muls.insert(eve[i].x),mult.insert(eve[i].y);
67         }
68     }
69
70     puts("YES");
71     return 0;
72 }

http://codeforces.com/contest/1284/problem/E

枚举中间点,其他点关于它极角排序后,除非四边形四个端点在过它的某条直线的同一侧,否则四边形一定可以包住它。因此枚举一个点,根据极角排序后的单调性找到最远的正好在“某条直线同侧”的点的下标,进行计数。注意,如果某个中间点对答案完全没贡献,即所有点关于它极角排序后都在同侧,可能导致死循环,需要特判。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4
 5 int n;
 6 #define maxn 5011
 7 LL cha(int x,int y,int xx,int yy)
 8 {
 9     return 1ll*x*yy-1ll*xx*y;
10 }
11 bool Area(int x,int y)
12 {
13     return !(x>0 || (x==0 && y>0));
14 }
15 LL C(int n,int m)
16 {
17     LL ans=1;
18     for (int i=0;i<m;i++) ans*=n-i;
19     for (int i=1;i<=m;i++) ans/=i;
20     return ans;
21 }
22
23 struct POINT
24 {
25     int x,y;
26     bool operator < (const POINT &b) const
27     {
28         bool area1=Area(x,y),area2=Area(b.x,b.y);
29         if (area1<area2) return 1;
30         if (area1>area2) return 0;
31         return cha(b.x,b.y,x,y)>0;
32     }
33 }p[maxn],np[maxn]; int lnp;
34
35 int main()
36 {
37     scanf("%d",&n);
38     for (int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
39
40     LL ans=0;
41     for (int cen=1;cen<=n;cen++)
42     {
43         lnp=0;
44         for (int i=1;i<=n;i++) if (i!=cen) np[++lnp]=(POINT){p[i].x-p[cen].x,p[i].y-p[cen].y};
45         sort(np+1,np+1+lnp);
46
47 //        for (int i=1;i<=lnp;i++) cout<<np[i].x<<‘ ‘<<np[i].y<<endl;
48 //        cout<<endl;
49
50         if (cha(np[lnp].x,np[lnp].y,np[1].x,np[1].y)>=0) continue;
51         bool skip=0;
52         for (int i=1;i<lnp;i++) if (cha(np[i].x,np[i].y,np[i+1].x,np[i+1].y)>=0) skip=1;
53         if (skip) continue;
54
55         ans+=C(lnp,4);
56
57         int j=1;
58         for (int i=1;i<=lnp;i++)
59         {
60             while (cha(np[j].x,np[j].y,np[i].x,np[i].y)>=0) j=(j==lnp?1:j+1);
61 //            cout<<i<<‘ ‘<<j<<endl;
62             ans-=(j>i?C(j-i-1,3):C(lnp-i+j-1,3));
63         }
64 //        cout<<ans<<endl;
65 //        cout<<endl;
66     }
67     printf("%lld\n",ans);
68     return 0;
69 }

原文地址:https://www.cnblogs.com/Blue233333/p/12228026.html

时间: 2024-08-30 17:23:32

Codeforces Hello 2020 选讲的相关文章

Codeforces Round #614 选讲

http://codeforces.com/contest/1292/problem/C 注意到编号x的边对答案要有贡献,必须和0到x-1的边一起形成一条链,否则x及编号比x大的边都没有贡献.由此,对答案有贡献的边形成了一条链,且这条链的编号是个谷形,即中间编号小,往两边编号变大,编号最大的边在最外侧.由此可以进行dp,dp[u][v]表示如果上述链为点u到点v这条链的答案.令sz[u][v]为以u为根,子树v的大小:fa[u][v]为以u为根,点v的父亲,则有dp[u][v]=dp[v][u]

正睿OI DAY3 杂题选讲

正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n\leq k^2\) 暴力 \(n\geq k^2\),找点x,求直线l经过x,且点数最多,点数\(\geq k+1\),递归,否则再找一个 One Point Nine Nine 现在平面上有\(n\)个点,已知有一个常数\(D\). 任意两点的距离要么\(\leq D\),要么\(\geq 1.

[Codeforces] [EducationalRound58] [1101] 瞎讲报告

目录 Educational Codeforces Round 58 (Rated for Div. 2) A. Minimum Integer B. Accordion C. Division and Union D.GCD Counting E.Polycarp's New Job F.Trucks and Cities G.(Zero XOR Subset)-less A,B,C,D,E都是几个月前写的..现在终于把这个坑填上了qwwwwq Educational Codeforces R

20170824图论选讲部分习题

1.车站分级 讲过啊,拓扑排序,每个停靠的车站向所有未停靠的车站连一条边,拓扑层数即可,小优化,每次删0度点的边时顺便统计一下删好后为0度点的边 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define maxn 1005 using namespace std; int to[maxn][maxn],point[maxn],Map[maxn][maxn

codeforces hello 2020

题目链接:https://codeforces.com/contest/1284 A:New Year and Gaming 题目大意为存在n个字符串S1,S2....Sn和m个字符串t1,t2....tn,对每个年份,需要找到对应的S和对应的t并把它们相连.规则为从第一年开始,对应第一个字符串,后每年都会向后移动一个字符串,当到达最后一个字符串时,下一年会回到第一个字符串. 样例大意为输入n个字符串S1,S2....Sn,之后输入m个字符串t1,t2....tn.然后需要回答q个询问,每个询问

[入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样,并且有不少的分类讨论,让插头DP十分锻炼思维的全面性和严谨性. 下面我们一起来学习插头DP的内容吧! 插头DP主要用来处理一系列基于连通性状态压缩的动态规划问题,处理的具体问题有很多种,并且一般数据规模较小. 由于棋盘有很特殊的结构,使得它可以与“连通性”有很强的联系,因此插头DP最常见的应用要数

应用运筹学基础:组合优化 (6) - 近似算法选讲 (4)

这节课介绍了斯坦纳树问题(Steiner tree)与旅行商问题(TSP),并讲解了它们的近似算法. 平面上的斯坦纳树 平面上的斯坦纳树指的是这样的问题:平面上有 $n$ 个点,要用总长尽量少的线段把它们连通起来.要注意,线段不一定要在给定的 $n$ 个点相交(不然跑个最小生成树就没了),完全可以在平面上的其它点相交.最优解中,线段在平面上除了给定点外的交点称为斯坦纳点. 可以从上图看出 $n = 3$ 和 $n = 4$ 的情况,$S$.$S_1$ 和 $S_2$ 是斯坦纳点.$n = 3$

ZROI 19.08.02 杂题选讲

给出\(n\)个数,用最少的\(2^k\)或\(-2^{k}\),使得能拼出所有数,输出方案.\(n,|a_i|\leq 10^5\). 显然一个绝对值最多选一次.这个性质非常强. 如果所有都是偶数,可以直接除以\(2\). 否则\(1\)或\(-1\)必须选,暴力枚举选哪个然后递归,每层去重,发现最多只会递归\(\log a\)次.总复杂度\(O((n+a)\log n)\),等价于线段树上区间长度总和. \(n\)个数,每次可以花费\(1\)的代价给某个数\(+1\)或\(-1\),问变成不

「总结」杂题选讲

Bitwise Xor 我们可以发现一个序列中的最小的异或值是两个大小相邻的数的\(xor\)取\(min\). 那么我们对序列排序. 只需要计算相邻的\(xor\)是大于等于\(k\)的方案. \(dp[i]\)是以\(i\)结尾最小\(xor\)大于\(K\)的方案. 然后我们可以类似于用树状数组来搞最长升降转移. 这次用\(trie\)来转移. MOD Problem 大水题 \[\begin{aligned} ans&=\sum\limits_{i=1}^{n}n\ mod\ I\&