目录:
————————————————————
ps:楼主脑残有点严重,很容易写错别字和语言组织混乱,如果在读文章时遇到,可以在评论区里回复一下,我好改(花式骗评论)
补题地址:http://acm.zju.edu.cn/onlinejudge/showProblems.do?contestId=1&pageNumber=31
顺便好人做到底,给大家凑个11/13的题解出来。(据说A题题解某个大佬是有写的,但是我找不到,有没有好心人告诉我一下)
B:https://www.cnblogs.com/xseventh/p/9986194.html(摸鱼的队员终于把B题补掉了,dsu on tree)
C:https://blog.csdn.net/lzyws739307453/article/details/83932183 (分类讨论)
D:https://blog.csdn.net/LSD20164388/article/details/83893264(枚举+讨巧)
E:https://blog.csdn.net/Code92007/article/details/83932020(二分+贪心)
F:http://www.cnblogs.com/qq965921539/p/9905086.html (构造题)
J :https://blog.csdn.net/Code92007/article/details/83930044(贪心)
M:傻逼签到题,递归到1时判奇偶就行了
____________________________
K Airdrop
虽然K题现场过的比较少,但实际上是一个排个序 ,按顺序枚举x0,大力数数的垃圾题,只是现场榜歪没人看而已。emmmm,根据重现的结果,可能k确实有一点难度,这里给一下提示,首先这个人啊,是优先先动y,再动x的,所以不和x=x0在同一条线上的点,只要与(x0,y0)的曼哈顿距离相同就有可能会撞。因此我们要在(x0,y0)的左右两边分别数每种曼哈顿距离出现的次数。显然左右的是可以拆开数,所以我们先把所有x0左侧曼哈顿距离相同的点的数量数完,在数右边,最后在数一下多少个点的x=x0就行,如果你有注意到题目有说所有点的初始位置是不一样的,可能会好写很多。
现在以数左边曼哈顿距离相同的点的数量为例,首先要注意到什么情况下曼哈顿距离相同点并不会抵消掉而是会留下一个,这里举个栗子,当有三个点对于(x0,y0)的曼哈顿距离相同时,万一有两个因为比较早相遇而挂掉,则最后一个人就能活到空投那里。解决办法也简单,注意到,他们只能在y=y0这条直线上相遇,早相遇的点,他们相遇的x也比较小,只要在从左往右枚举x0的过程中,顺便把在上个x0的相撞死的人对于的数量贡献去掉就好了。再维护一下当前有多少个曼哈顿距离只出现了1次,只出现一次的点都是能活着到空投的。
最后的最后,在教一下怎么数量,因为对于不同的x0,y0所有点的曼哈顿距离都在变的,我们不能每次重新数所有距离出现的次数。但是对于在(x0,y0)左侧点,如果他们对于(x0,y0)曼哈顿距离相同,随着(x0,y0)右移他们还是会相同的,所以干脆直接数他们到(xm,y0)的曼哈顿距离就行了,xm为x0坐标的最大值。 他们到(xm,y0)距离相同的话,则这些点到任意他们的右侧(x0,y0)距离也肯定相同。
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<vector> 6 #include<algorithm> 7 using namespace std; 8 int const maxn=2e5+5; 9 int x[200005]; 10 int y[200005]; 11 vector<int>e[maxn],q,que,res; 12 int sum[200005]; 13 int num[200005]; 14 void clear(int n,int x0,int y0) 15 { 16 for(int i=1;i<=n;i++) 17 { 18 num[abs(x0-x[i])+abs(y0-y[i])]=0; 19 } 20 } 21 int main() 22 { 23 int i,j,n,m,w,t,y0,xm=1e5+1,k; 24 scanf("%d",&t); 25 while(t--) 26 { 27 scanf("%d%d",&n,&y0); 28 q.clear(); 29 q.push_back(0); 30 // e[0].clear(); 31 for(i=1;i<=n;i++) 32 { 33 scanf("%d%d",&x[i],&y[i]); 34 e[x[i]].clear(); 35 e[x[i]+1].clear(); 36 // e[x[i]-1].clear(); 37 q.push_back(x[i]); 38 q.push_back(x[i]+1); 39 // q.push_back(x[i]-1); 40 } 41 sort(q.begin(),q.end()); 42 q.erase(unique(q.begin(),q.end()),q.end()); 43 for(i=1;i<=n;i++) 44 { 45 e[x[i]].push_back(y[i]); 46 } 47 int ans=0,temp=0; 48 clear(n,xm,y0); 49 for(int xx:q) 50 { 51 sum[xx]=e[xx].size(); 52 if(temp) 53 { 54 que.clear(); 55 for(int yy:e[temp]) 56 { 57 k=abs(yy-y0)+abs(xm-temp); 58 num[k]++; 59 if(num[k]==1) 60 { 61 ans++; 62 } 63 else 64 { 65 que.push_back(k); 66 } 67 } 68 for(int pos:que) 69 { 70 if(num[pos]) 71 ans--; 72 num[pos]=0; 73 } 74 } 75 temp=xx; 76 sum[xx]+=ans; 77 // printf("(%d %d)\n",xx,sum[xx]); 78 } 79 reverse(q.begin(),q.end()); 80 81 ans=0,temp=0; 82 clear(n,0,y0); 83 res.clear(); 84 for(int xx:q) 85 { 86 if(temp) 87 { 88 que.clear(); 89 for(int yy:e[temp]) 90 { 91 k=abs(yy-y0)+abs(0-temp); 92 num[k]++; 93 if(num[k]==1) 94 { 95 ans++; 96 } 97 else 98 { 99 100 que.push_back(k); 101 } 102 } 103 for(int pos:que) 104 { 105 if(num[pos]) 106 ans--; 107 num[pos]=0; 108 } 109 } 110 temp=xx; 111 sum[xx]+=ans; 112 res.push_back(sum[xx]); 113 //printf("(%d %d %d)\n",xx,sum[xx],ans); 114 } 115 sort(res.begin(),res.end()); 116 printf("%d %d\n",res.front(),res.back()); 117 } 118 return 0; 119 }