2018-10-15队内ACM

T1

题意:

给出n*m的棋盘,问可以放多少互相不影响(x±2,y±1)或(x±1,y±2)的士兵。

对于 100%的数据:1≤T≤1000,1≤N,M≤10^9。

 

直接打表找规律,

当n=1时直接输出m;

当n=2时以4个兵为一组,每组隔开2列;

同理m=2以4个兵一组,每组隔开2行;

以上为特殊情况,其他的情况基数行从j=1开始每个士兵隔开一格,偶数行从j=2开始每个士兵隔开一格,

即得到公式为(n*m+1)/2。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 long long T,n,m;
 7 long long solve(long long x)
 8 {
 9     if(x%4==1||x%4==3)
10     return x+1;
11     if(x%4==0)
12     return x;
13     if(x%4==2)
14     return x+2; 
15 }
16 int main()
17 {
18     scanf("%lld",&T);
19     while(T--)
20     {
21         scanf("%lld%lld",&n,&m);
22         if(m==1||n==1)
23         printf("%lld\n",m*n);
24         else if(n==2)
25         printf("%lld\n",solve(m));
26         else if(m==2)
27         printf("%lld\n",solve(n));
28         else
29         printf("%lld\n",(n*m+1)/2); 
30     }
31     return 0;
32 }
View Code

 

T2

这道题暴力可以水过去,

只要将线段的长度从大到小排序,

若ans > len / 2 那么后面全部的线段都不会符合条件,所以直接break掉就可以了。

正解的做法应该用二分+扫描线+平衡树。

posted @ 2018-10-16 16:03  Dingwenh  阅读(123)  评论(0编辑  收藏  举报