題意:
有n條直線,問他們兩兩在橫座標開區間(l,r)之間相交的個數
n=50000,暴力肯定就不用想了,如果在紙上畫一畫可以發現如果兩條直線在(l,r)內相交,那麼他們與x= l和x=r的交點序數是相反的
所以我們只需要算與x=l的交點,然後根據這些點排序編個號,在與r相交,根據新的交點排個逆序,根據編號求逆序數即可。
需要注意的一點:兩種特殊情況如果不與l,r相交,那麼如果再這個區間內,必定所有直線都會與之相交,記錄下數量。
另一種情況就是,如果兩個直線的交點正巧在x=l和x=r時, 這種情況是不能記錄在內的,那麼在之前排序的時候與l相交的交點按公升序排列
如果交點座標相同按r交點座標公升序,再根據r的座標排降序的時候,如果r座標相同,根據l的座標排降序,就可以避免這種情況計算在內了。
求逆序數的時候是不會計算在裡面的。
求逆序數樹狀陣列即可。
1 #include 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 #include
9 #include 10 #include 11
#define pb push_back
12#define clr(a) memset(a, 0, sizeof(a));
13#define mem(a, b) memset(a, b, sizeof(a));
14#define fi first
15#define se second
1617
using
namespace
std;
1819 typedef long
long
ll;20
21const
int maxn = 50007;22
const
int maxv = 207;23
const
int maxe = 207;24
const
int inf = 0x3f3f3f3f;25
26int
n;27
28struct
node
2933 node (double a, double
b) : a(a), b(b) {}
34}node[maxn];
35double
l, r;
3637
bool
cmpl(node n1, node n2)
3843
bool
cmpr(node n1, node n2)
4449
int cnt = 0;50
int c[maxn << 1
];51
int lowbit(int
x)52
55void modify(int x, int
data)
5660
int getsum(int
x)61
6768
intmain()
6986
double k = (y2-y1)/(x2-x1);
87double b = y2 - k*x2;
88double l = k*l+b, r = k*r+b;
89 node[cnt++] =node(l, r);90}
91 sort(node, node+cnt, cmpl);
92for (int i = 0; i < cnt; i++) node[i].nu = i+1
;93 sort(node, node+cnt, cmpr);
94//
for (int i = 0; i < cnt; i++) cout << node[i].nu << endl;
95int ans = 0;96
for (int i = 0; i < cnt; i++)
97101 ans += cnt*vrtcl;
102 cout << ans <
103}
104return0;
105 }
求逆序數 逆序數 歸併排序
求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...
真分頁和假分頁
假分頁 從資料庫一次性取出所有資料繫結到控制項上,再將所有資料根據每頁顯示記錄條數進行分頁。使用gridview控制項來達到分頁的功能 資料繫結 using system using system.collections.generic using system.linq using system....
真怒還是假怒
今天說著去圖書館更新一批書看,結果意外發現竟然有兩本書沒還,而且已經過去了半年多。瞬間不淡定了,我十分肯定以及確定我已經還了,但是系統上面就是顯示我沒還。當然了,根據以往的人生慣性我首先是變急了起來,然後是怒了起來,尤其是當我在圖書館發現我已經還了的時候。但是可能是最近的長期高壓工作吧,我向釋放一下...