那時候吃了飯後,剩下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 */