拿到了icpc北京站的参赛名额 感谢亮哥~
虽然是地狱之战 但也要全力以赴!
题意:
有一片沙漠 n片绿洲 让你用一条线分成两部分
左≥右 而且分割线要尽量靠右 问线的位置
思路:
网上说可以二分 没太看懂……
还有一种思路就是线性扫描
将二维的图化成一维的线 然后从头扫一遍
遇到左≥sum/2时试探着向右继续扫
最后输出答案
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<set> 9 #include<vector> 10 #include<queue> 11 #define M(a,b) memset(a,b,sizeof(a)) 12 using namespace std; 13 typedef long long ll; 14 const int inf=0x3f3f3f; 15 const int maxn=1e6+10; 16 ll line[maxn]; 17 int main(){ 18 int T; 19 scanf("%d",&T); 20 while(T--){ 21 int sq; 22 scanf("%d",&sq); 23 int n; 24 scanf("%d",&n); 25 int x,y,w,h; 26 M(line,0); 27 ll sum=0; 28 for(int i=0;i<n;i++){ 29 scanf("%d%d%d%d",&x,&y,&w,&h); 30 for(int j=x;j<x+w;j++){ //将二维的图转化成一维的线 使时间复杂度达到线性时间O(n) 31 line[j]+=h; 32 sum+=h; 33 } 34 } 35 sum++; 36 sum/=2; 37 ll cal=0; 38 for(int i=0;i<=sq;i++){ //扫描 39 cal+=line[i]; 40 if(cal>=sum){ //已经符合题意 41 i++; 42 while(line[i]==0&&i<sq) i++; //试探着继续扫 43 printf("%d\n",i); 44 break; 45 } 46 } 47 } 48 return 0; 49 } 50 /* 51 52 2 53 1000 54 2 55 1 1 2 1 56 5 1 2 1 57 1000 58 1 59 1 1 2 1 60 61 */
[ An Ac a Day ^_^ ] HihoCoder 1249 Xiongnu's Land 线性扫描
时间: 2024-11-06 11:33:54