改章节是一篇关于线段端点的帖子
ps:这场的题解非常nice啊,还供给了各种插图,在解理的中程过感受了出题人维思的大强啊
非常非常非常非常非常难的竞赛,正反还是由于我太弱了。。。
A
B
C : 结构题,看到上面这张图片就懂了。。。。
深蓝色的部份是unique的,大红色的部份也是unique的,各据占了三分之二。。。。。
D:结构题,临时不会
E: 官方题解
计数题,突破口在于三条线的订交式方只有五种,然后我们要盘算其中的两种的总数,但是由于直接算比较难,于是可以反过来求
即求C(n,3)减去川字型,减去XD状形的,再减去H状形的,要主就是要算两个东东。
1:一条直线内有几条线段,这个可以用树状组数来求,每次遍历到一个线段的右端点就把左端点插进来(先和求再插),整齐划就白明了。
2:求一条线与几条线订交,这个可以根据面上的来求,因为减去在内部的线段*2以后的点都是在这条线内的立孤的点的个数,,,自然是订交的
其他的看看码代就可以想白明了。
共和国迎来了她五十诞辰。五十年像一条长河,有急流也有缓流;五十年像一幅长卷,有冷色也有暖色;五十年像一首乐曲,有低音也有高音;五十年像一部史诗,有痛苦也有欢乐。长河永远奔流,画卷刚刚展开,乐曲渐趋高潮,史诗还在续写。我们的共和国正迈着坚定的步伐,跨入新时代。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX_N = 222222;
int c[MAX_N];
void update(int x)
{
for(;x<MAX_N;x+=x&-x) c[x]++;
}
int sum(int x)
{
int ans = 0;
for(;x;x-=x&-x) ans += c[x];
return ans;
}
int a[MAX_N] , b[MAX_N] , p[MAX_N] , in[MAX_N] , id[MAX_N] ,inter[MAX_N];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i] >> b[i];
if(a[i] > b[i]) swap(a[i],b[i]);
id[a[i]] = id[b[i]] = i;
p[a[i]] = b[i];
p[b[i]] = a[i];
}
int m = 2 * n;
for(int i = 1; i <= m; i++)
{
if(p[i] < i)
{
in[id[i]] = sum(i) - sum(p[i]-1);
update(p[i]);
}
}
for(int i = 1; i <= n; i++)
{
inter[i] = b[i] - a[i] - 1 - 2 * in[i];
}
// for(int i = 1; i <= n; i++) printf("%d ",inter[i]);
long long ans = (long long)n*(n-1)*(n-2) / 6;
long long chuang = 0 , cha = 0;
for(int i = 1; i <= n; i++)
{
cha += (long long)inter[i] * (n-1-inter[i]);
chuang+= (long long)in[i] * (n-1-in[i]-inter[i]);
}
cout<<ans-cha/2-chuang<<endl;
return 0;
}
summary : 好大强的一场标题啊,种这题是怎么被想出来的,我这么挫该如何解救!!!!
文章结束给大家分享下程序员的一些笑话语录: 神灯新篇
一个程序员在海滩上发现了一盏神灯。他在灯上擦了几下,一个妖怪就从灯里跳出来说:“我是世界上法术最强的妖怪。我可以实现你的任何梦想,但现在,我只能满足你一个愿望。”程序员摊开了一幅中东地图说:“我想让中东得到永久的和平。”妖怪答道:“哦,我没办法。自打创世纪以来,那里的战火就没有停息过。这世上几乎没有我办不到的事,但这件事除外。”程序员于是说:“好吧,我是一个程序员,为许多用户编写过程序。你能让他们把需求表述得更清楚些,并且让我们的软件项目有那么一两次按进度按成本完成吗?”妖怪说:“唔,我们还是来看中东地图吧。”