cdoj1341卿学姐与城堡的墙

2023-12-08 19:50
文章标签 城堡 学姐 cdoj1341

本文主要是介绍cdoj1341卿学姐与城堡的墙,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

地址:http://acm.uestc.edu.cn/#/problem/show/1341

题目:

卿学姐与城堡的墙

Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

卿学姐终于来到了魔王的城堡,城堡修建的十分壮观。

即使心中放不下公主,卿学姐还是忍不住驻足观赏这宏伟的建筑。

卿学姐注意到城堡的墙上有若干直线状的花纹。

可以将墙看做一个平面,卿学姐想知道有多少种方式任取两个直线,使得这两个直线的交点的横坐标xx满足:uxvu≤x≤v。

Input

第一行三个整数N,u,vN,u,v,标明直线有NN条。

接下来有NN行,每行两个整数k,bk,b,表示这条直线是y=kx+by=kx+b

1N2000001≤N≤200000

0|k|10000000000≤|k|≤1000000000

0|b|10000000000≤|b|≤1000000000

0|u|10000000000≤|u|≤1000000000

0|v|10000000000≤|v|≤1000000000

输入保证uvu≤v,保证没有两条直线是一样的

Output

输出一个整数,代表选择的方法数。

Sample input and output

Sample InputSample Output
3 -3 1
-1 3
2 2
1 1
3

Hint

title

上图是样例的解释,交点是A,B,C

 

思路:

对所有直线进行预处理(只保存和uv的交点)这是很容易想到的,不过一开始不知道有种东西叫逆序对,只想到n*n的算法。。。。。。。

逆序对的求法有好几种我用的是归并的方法。。

不过这个题要考虑边界情况,如果按u边界的y排序的话,就需要对u边界上的点特殊处理,其实就是u边界上的点扫一遍就好了,,,

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <queue>
 7 #include <stack>
 8 #include <map>
 9 #include <vector>
10 #include <cstdlib>
11 #include <string>
12 
13 #define PI acos((double)-1)
14 #define E exp(double(1))
15 using namespace std;
16 
17 vector<pair<long long ,long long > >p;
18 long long  a[200000+5];
19 long long  temp[200000+5];
20 long long  cnt=0;//逆序对的个数
21 double cnm_lg(int n,int m)
22 {
23     int i;
24     double s1=0.0,s2=0.0;
25     for(i=1;i<=m;i++)
26         s1 += log(i);
27     for(i=n-m+1;i<=n;i++)
28         s2 += log(i);
29     return s2-s1;
30 }
31 long long  cnm_double(int n,int m)
32 {
33     if(n<m)
34         return 0;
35     if(m > n/2)
36     m = n-m;
37     return (long long)exp(cnm_lg(n,m));
38 }
39 void merge(int left,int mid,int right)
40 {
41     int i=left,j=mid+1,k=0;
42     while (( i<=mid )&& (j<=right))
43           if (a[i]<a[j]) temp[k++]=a[i++];
44           else {
45               cnt+=mid+1-i;//关键步骤
46               temp[k++]=a[j++];
47           }
48     while (i<=mid) temp[k++]=a[i++];
49     while (j<=right) temp[k++]=a[j++];
50     for (i=0,k=left; k<=right;) a[k++]=temp[i++];
51 }
52 void mergeSort(int left,int right)
53 {
54     if (left<right)
55     {    int mid=(left+right)/2;
56          mergeSort(left, mid);
57          mergeSort(mid+1, right);
58          merge(left, mid, right);
59     }
60 }
61 int main (void)
62 {
63     int n,u,v;
64     cin>>n>>u>>v;
65     for(int i=0;i<n;i++)
66     {
67         long long k,b;
68         scanf("%lld%lld",&k,&b);
69         p.push_back(make_pair(b+u*k,b+v*k));
70     }
71     sort(p.begin(),p.end());
72     p.push_back(make_pair(0,1000000000));
73     pair<long ,long >temp=p[0];
74     temp.second=0;
75     for(int i=1;i<=n;i++)
76         if(temp.first != p[i].first || i==n)
77         {
78             cnt+=cnm_double(i-temp.second,2);
79             temp.first=p[i].first;temp.second=i;
80         }
81     if(u==v)
82     {
83         cout<<cnt<<endl;return 0;
84     }
85     for(int i=0;i<n;i++)
86         a[i]=p[i].second;
87     mergeSort(0,n-1);
88     cout<<cnt<<endl;
89     return 0;
90 }
View Code

 

转载于:https://www.cnblogs.com/weeping/p/5456099.html

这篇关于cdoj1341卿学姐与城堡的墙的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/471129

相关文章

乐城堡 JoyCastle Unity岗位笔试题

1)实现 move(GameObjct gameObject, Vector3 begin, Vector3 end, float time, bool pingpong){ } 使 gameObject 在 time 秒内,从 begin 移动到 end,若 pingpong 为 true,则在结束时 使 gameObject 在 time 秒内从 end 移动到 begin,如此往复。 2)

HDU1269 迷宫城堡 (强连通图判定)

题意:判定给出的有向图是不是强连通图 Tarjan算法模板题目 #include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue

SDUT OJ 2798小鑫的城堡 并查集

题目描述 从前有一个国王,他叫小鑫。有一天,他想建一座城堡,于是,设计师给他设计了好多简易图纸,主要是房间的连通的图纸。小鑫希望任意两个房间有且仅有一条路径可以相通。小鑫现在把设计图给你,让你帮忙判断设计图是否符合他的想法。比如下面的例子,第一个是符合条件的,但是,第二个不符合,因为从5到4有两条路径(5-3-4和5-6-4)。 输入 多组输入,每组第一行包含一个整数m(m

AW349 黑暗城堡

题目地址 易错点: 模数是2147483647. #include<cstdio>#include<iostream>#include<cstring>#include<queue>#define ll long longusing namespace std;const int MAXN=2e3,MAXM=2e6,MOD=2147483647;struct Edg

CodeForces Round 218 D. Vessels(学姐我没用线段树系列)

这道题的意思是给你一个水塔,可以从中间任意一层倒水,告诉你每一层的容量,这一曾层满后水会流入下一层,总共有N层,再满了就直接流到地上。然后给出N个操作 操作1:往第n层中加x的水 操作2:询问每一层装有多少水 用BIT保存所剩空间的前缀和,每次加水的时候二分最终水会流到哪一层,然后加水的时候依次更新BIT,虽然式单点更新但是每一次更新都会直接把该层的空间沾满,下一次不会再更新,所以总共是O(

『围城』:愿我们都能走出命运的城堡

本文首发于我的个人博客:『不羁阁』 文章链接: 『传送门』 在20岁的时候读“围城”看了一小半便觉得无趣就放一边不再看了。 在23岁的时候,完整地读了一遍“围城”,也许是自己资历尚浅,尚未经历婚姻,看完竟没有那么多的感悟和震动。 也许在今后拥有婚姻之后再来读这本“围城”,我会有更多的感受吧。 我们每个人都生活在一座围城里,我们拼了命的想要逃出这座城,逃出去却发现外边是更大的一座围城

hdu(1269)迷宫城堡

题意很容易理解;; //强连通是任意两点都能到达,双向的。 #include"stdio.h" int pre[100001]; int find(int k) { if(k!=pre[k]) pre[k]=find(pre[k]); return pre[k]; } int main() { int n,m,i,a,b; while(sca

HDU 1269 迷宫城堡(强连通)

HDU 1269 迷宫城堡 题目链接 题意:中文题 思路:强连通模板题 代码: #include <cstdio>#include <cstring>#include <vector>#include <stack>using namespace std;const int N = 10005;int n, m;vector<int> g[N], scc[N];

Python到底是什么?学姐靠它拿了5个offer!

你ZAO吗? 最近陌陌发布了一款很有意思的产品——ZAO,这款AI换脸的产品刷爆朋友圈! 这款产品火爆到什么程度呢? 正在使用ZAO的用户会发现,想要生成一段新的AI换脸视频,已经不是等待几秒、排队第几位的问题,而是—— “服务器繁忙” 在#AI换脸#话题讨论巨高不下的 同时 ,也让我们重新认识 了被大家炒得很热的“人工智能”。 众所周知,随着人工智能技术的发展,各行各业都在发生着变

POJ 1164 The Castle 深搜入门(城堡问题)

题意:计算城堡一共有多少房间,最大的房间有多大(多少方块数构成最大的房间)? 城堡被分割成 R × C(R <= 50,C <= 50),每个方块可以有 0-4 面墙(1-西面有墙,2-北面有墙,4-东面有墙,8-南面有墙),例如:13-表示东南西三面有墙。 深度优先遍历图 VS 广度优先遍历图 import java.io.BufferedReader;import java.io.