那时候吃了饭后,剩下25分钟,我就把A-D都过了一遍,E不够时间。
D
对于x~y这个长度为k的序列:对于1~k每个数,它出现的数目。
从x~y,到x+1~y:如果一个数出现的数目从0 -> 1,出现元素数目+1;如果一个数出现的数目从1 -> 0,出现元素数目-1。
记录所有出现元素数目=k的序列。
太多人对了。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <cstdbool> 6 #include <string> 7 #include <algorithm> 8 #include <iostream> 9 #include <sstream> 10 #include <ctime> 11 #include <stack> 12 #include <vector> 13 #include <queue> 14 #include <set> 15 #include <map> 16 #include <array> 17 #include <bitset> 18 using namespace std; 19 #define LL long long 20 #define ULL unsigned long long 21 22 const LL mod_1=1e9+7; 23 const LL mod_2=998244353; 24 25 const double eps_1=1e-5; 26 const double eps_2=1e-10; 27 28 const int maxn=1e5+10; 29 30 LL a[maxn], hap[maxn]; 31 32 int main() 33 { 34 LL n,k,ci=0,r=0,i; 35 36 memset(hap,0,sizeof(hap)); 37 38 cin>>n>>k; 39 for (i=1;i<=n;i++) 40 cin>>a[i]; 41 42 for (i=1;i<=n;i++) 43 { 44 if (hap[ a[i] ]==0) 45 ci++; 46 hap[ a[i] ]++; 47 48 if (i>=k) 49 { 50 if (ci==k) 51 r++; 52 } 53 54 if (i>=k) 55 { 56 if (hap[ a[i-k+1] ]==1) 57 ci--; 58 hap[ a[i-k+1] ]--; 59 } 60 61 } 62 63 cout<<r; 64 65 return 0; 66 }
E
遍历所有边,因为点数目<=1e3,那么边数目>=1e6。
对于每条边,记录斜率y、x(斜率为y/x),长度len(长度为sqrt(len)),然后用map记录满足这个条件的b的最大值/最小值(y=k*x+b)。如果有两条边,斜率y、x、长度len都一样,那么它们可以作为平行四条行的两条边(剩下两条边也自然满足条件)。
斜率用y, x表示,长度用len表示,使得它们都是整数,这样一来,避免出现浮点数精度的错误。
这样写很方便:
1 typedef pair<pair<LL,LL>, LL> typ; 2 3 map<typ, LL> m_min, m_max;
最后的结果是一个整数,如果用double、long double,只能过53%左右的样例。
为什么结果一定是整数,把它切成这样,就能理解了,点的x,y坐标都是整数。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <cstdbool> 6 #include <string> 7 #include <algorithm> 8 #include <iostream> 9 #include <sstream> 10 #include <ctime> 11 #include <stack> 12 #include <vector> 13 #include <queue> 14 #include <set> 15 #include <map> 16 #include <array> 17 #include <bitset> 18 using namespace std; 19 #define LL long long 20 #define ULL unsigned long long 21 22 const LL mod_1=1e9+7; 23 const LL mod_2=998244353; 24 25 const double eps_1=1e-5; 26 const double eps_2=1e-10; 27 28 const int maxn=1e3+10; 29 const int maxp=1e6+10; 30 31 LL x[maxn], y[maxn]; 32 33 typedef pair<pair<LL,LL>, LL> typ; 34 35 map<typ, LL> m_min, m_max; 36 37 38 int main() 39 { 40 LL n,i,j,xx,yy,len,xishu,v1,v2; 41 typ ty; 42 //long double r=0,b1,b2; 43 ///变为long double,反而有一个错了 44 45 ///输出全部都是整数 46 47 ///也就是說,long double只是定義為至少跟double一樣精度(即是可以一樣) 48 49 50 ///double r=0,b1,b2; 51 52 LL r=0; 53 54 cin>>n; 55 for (i=1;i<=n;i++) 56 cin>>x[i]>>y[i]; 57 for (i=1;i<=n;i++) 58 for (j=i+1;j<=n;j++) 59 { 60 yy = y[i]-y[j]; 61 xx = x[i]-x[j]; 62 63 if (xx<0) 64 yy=-yy, xx=-xx; 65 66 /* 67 if (x[i]==x[j]) 68 xishu = y[i] - 1.0*(y[i]-y[j])/(x[i]-x[j])*x[i]; 69 else 70 xishu = 1e18; 71 */ 72 73 xishu = y[i]*xx - yy*x[i]; /// xishu/xx 74 75 len = yy*yy + xx*xx; /// sqrt(len) 76 77 ty = make_pair( make_pair(yy,xx), len); 78 79 if (m_max.find(ty)==m_max.end()) 80 m_max[ty]=xishu; 81 else 82 m_max[ty]=max(m_max[ty], xishu); 83 84 if (m_min.find(ty)==m_min.end()) 85 m_min[ty]=xishu; 86 else 87 m_min[ty]=min(m_min[ty], xishu); 88 } 89 90 91 92 for (auto d : m_max) 93 { 94 v1 = d.second; 95 ty = d.first; 96 v2 = m_min[ty]; 97 98 len = ty.second; 99 yy = ty.first.first; 100 xx = ty.first.second; 101 102 /* 103 if (xx==0) 104 continue; 105 */ 106 107 //b1 = abs( 1.0* (v1-v2) / xx ); 108 //b2 = sqrt(1.0*len); 109 110 //r = max(r, b2 * b1 * xx / b2); 111 112 //r = max(r, 1.0*(v1-v2)); 113 114 r = max(r, v1-v2); 115 116 } 117 118 if (r==0) 119 cout<<"-1"; 120 else 121 cout<<r<<".0"; 122 123 /* 124 if (fabs(r)<1e-5) 125 { 126 cout<<"-1"; 127 return 0; 128 } 129 130 printf("%.1f",r); 131 */ 132 133 //printf("%.1Lf",r); 134 135 return 0; 136 } 137 /* 138 4 139 0 0 140 0 10 141 10 0 142 10 10 143 144 145 146 147 4 148 0 0 149 10 0 150 3 5 151 13 5 152 153 154 155 6 156 0 0 157 0 10 158 10 0 159 10 10 160 3 5 161 13 5 162 163 164 4 165 0 0 166 1 0 167 2 0 168 3 0 169 170 4 171 0 10 172 1 10 173 2 10 174 3 10 175 176 4 177 10 0 178 10 1 179 10 2 180 10 3 181 */