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 }
T2
这道题暴力可以水过去,
只要将线段的长度从大到小排序,
若ans > len / 2 那么后面全部的线段都不会符合条件,所以直接break掉就可以了。
正解的做法应该用二分+扫描线+平衡树。