在乙個n*n的西洋棋棋盤上有m個皇后。
乙個皇后可以攻擊其他八個方向的皇后(上、下、左、右、左上、右上、左下、右下)。
對於某個皇后,如果某乙個方向上有其他皇后,那麼這個方向對她就是不安全的。
對於每個皇后,我們都能知道她在幾個方向上是不安全的。
現在我們想要求出t0,t1,...,t8,其中ti表示恰有i個方向是"不安全的"的皇后有多少個。
第一行兩個整數n,m表示棋盤大小和皇后數量。i接下來m行每行兩個整數ri,ci表示皇后座標。
1 <= n, m <= 100,000
1 <= r
, ci
<= n資料保證沒有皇后在同乙個位置上。
一行九個整數表示答案。示例1空格隔開,結尾無空格
8 44 34 8
6 51 6
0 3 0 1 0 0 0 0 0示例2
10 31 11 2
1 3
0 2 1 0 0 0 0 0 0
分析:這個題有點技巧,八個方向想象成四條直線,每條直線排序,一共四次排序,每次排序後統計一遍就好了。
這題比賽的時候沒做出來啊qaq
#include#includeview codeusing
namespace
std;
struct
nodea[
100100
];int sum[100100
];int t[10
];int
cmp1(node a,node b)
intcmp2(node a,node b)
intc***(node a,node b)
intcmp4(node a,node b)
intmain()
sort(a,a+m,cmp1);
for(int i=1;i)
if(a[i-1].x==a[i].x)
sort(a,a+m,cmp2);
for(int i=1;i)
if(a[i-1].y==a[i].y)
sort(a,a+m,c***);
for(int i=1;i)
if(a[i-1].x+a[i-1].y==a[i].x+a[i].y)
sort(a,a+m,cmp4);
for(int i=1;i)
if(a[i-1].x-a[i-1].y==a[i].x-a[i].y)
for(int i=0;i)
t[sum[i]]++;
for(int i=0;i<8;i++) printf("
%d "
,t[i]);
printf(
"%d\n
",t[8
]);
return0;
}
牛客小白月賽13 F題
小a這次來到乙個景區去旅遊,景區裡面有n個景點,景點之間有n 1條路徑。小a從當前的乙個景點移動到下乙個景點需要消耗一點的體力值。但是景區裡面有兩個景點比較特殊,它們之間是可以直接坐觀光纜車通過,不需要消耗體力值。而小a不想走太多的路,所以他希望你能夠告訴它,從當前的位置出發到他想要去的那個地方,他...
牛客練習賽58 F
求帶單點修改的樹上兩點間任意子路徑長異或和。路徑長等於路徑上所有異或和。簡單模擬一下,可以發現。奇數情況下,答案是偶數點異或和。偶數情況下,就是正常的異或和。偶數點異或和也很容易處理。分深度奇偶樹狀陣列即可。但是這是對於鏈的,不能直接dfs dfsdf s序,需要剖分一下。但是我不會,所以去學了一下...
牛客練習賽13 烏龜跑步 DP
有乙隻烏龜,初始在0的位置向右跑。這只烏龜會依次接到一串指令,指令t表示向後轉,指令f表示向前移動乙個單位。烏龜不能忽視任何指令。現在我們要修改其中正好n個指令 乙個指令可以被改多次,一次修改定義為把某乙個t變成f或把某乙個f變成t 求這只烏龜在結束的時候離起點的最遠距離。假設烏龜最後的位置為x,我...