2017计蒜客(四,五,六)
Posted dy blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017计蒜客(四,五,六)相关的知识,希望对你有一定的参考价值。
2017 计蒜之道 初赛 第四场 rank 178 题解
1A
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m,k,v[110][110]; 4 void setrow(int c) 5 { 6 for(int j=1;j<=m;j++) v[c][j]=1; 7 } 8 void setcol(int c) 9 { 10 for(int j=1;j<=n;j++) v[j][c]=1; 11 } 12 int dfs(int i,int j) 13 { 14 if(v[i][j]) return 0; 15 v[i][j]=1; 16 return dfs(i+1,j)+dfs(i-1,j)+dfs(i,j+1)+dfs(i,j-1)+1; 17 } 18 int main() 19 { 20 while(scanf("%d%d%d",&n,&m,&k)==3) 21 { 22 memset(v,0,sizeof(v)); 23 for(int i=0,d,c;i<k;i++) 24 { 25 scanf("%d%d",&d,&c); 26 if(d==0) setrow(c); 27 else setcol(c); 28 } 29 setrow(0); 30 setrow(n+1); 31 setcol(0); 32 setcol(m+1); 33 //puts("ok"); 34 int ans=0; 35 for(int i=1;i<=n;i++) 36 { 37 for(int j=1;j<=m;j++) 38 { 39 ans+=dfs(i,j)/2; 40 } 41 } 42 printf("%d\n",ans); 43 } 44 return 0; 45 }
WA一次,其实这道题是主元素问题,可以通过每次去掉两个不同的元素来达到O(n)的时间复杂度和O(1)的空间复杂度(不包括本数组)
1 //WA 2 #include<bits/stdc++.h> 3 using namespace std; 4 int n; 5 map<pair<int,int>,int> mp; 6 int main() 7 { 8 while(scanf("%d",&n)==1) 9 { 10 while(n--) 11 { 12 int a,b,c,d; 13 scanf("%d%d%d%d",&a,&b,&c,&d); 14 mp[make_pair(c-a,d-b)]++; 15 } 16 pair<int,int> ans=mp.begin()->first; 17 int maxt=0; 18 for(auto it=mp.begin();it!=mp.end();it++) 19 { 20 if(it->second > maxt) ans=it->first; 21 } 22 printf("%d %d\n",ans.first,ans.second); 23 } 24 return 0; 25 } 26 //AC 27 #include<bits/stdc++.h> 28 using namespace std; 29 int n; 30 map<pair<int,int>,int> mp; 31 int main() 32 { 33 while(scanf("%d",&n)==1) 34 { 35 mp.clear(); 36 while(n--) 37 { 38 int a,b,c,d; 39 scanf("%d%d%d%d",&a,&b,&c,&d); 40 mp[make_pair(c-a,d-b)]++; 41 } 42 pair<int,int> ans=mp.begin()->first; 43 int maxt=0; 44 for(auto it=mp.begin();it!=mp.end();it++) 45 { 46 if(it->second > maxt) ans=it->first,maxt=it->second; 47 } 48 printf("%d %d\n",ans.first,ans.second); 49 } 50 return 0; 51 }
2017 计蒜之道 初赛 第五场 rank 131 题解
A题一开始没考虑n=0的情况返回0错了1发,然后没想到n=1时要输出0错了一发,第三发WA手误
1 //WA1 2 #include<bits/stdc++.h> 3 using namespace std; 4 int n,m; 5 int a[110]; 6 int solve() 7 { 8 for(int i=m-1;i>=0;i--) 9 { 10 if(a[i]>=n) return m-i; 11 if(a[i]==0) break; 12 n-=a[i]-1; 13 } 14 return -1; 15 } 16 int main() 17 { 18 while(cin>>n>>m) 19 { 20 for(int i=0;i<m;i++) cin>> a[i]; 21 sort(a,a+m); 22 int ans=solve(); 23 if(ans==-1) cout<<"Impossible"<<endl; 24 else cout<<ans<<endl; 25 } 26 return 0; 27 } 28 //WA2 29 #include<bits/stdc++.h> 30 using namespace std; 31 int n,m; 32 int a[110]; 33 int solve() 34 { 35 if(n==0) return 0; 36 for(int i=m-1;i>=0;i--) 37 { 38 if(a[i]>=n) return m-i; 39 if(a[i]==0) break; 40 n-=a[i]-1; 41 } 42 return -1; 43 } 44 int main() 45 { 46 while(cin>>n>>m) 47 { 48 for(int i=0;i<m;i++) cin>> a[i]; 49 sort(a,a+m); 50 int ans=solve(); 51 if(ans==-1) cout<<"Impossible"<<endl; 52 else cout<<ans<<endl; 53 } 54 return 0; 55 } 56 //WA3 57 #include<bits/stdc++.h> 58 using namespace std; 59 int n,m; 60 int a[110]; 61 int solve() 62 { 63 if(n==0) return 0; 64 if(n==1) return 1; 65 for(int i=m-1;i>=0;i--) 66 { 67 if(a[i]>=n) return m-i; 68 if(a[i]==0) break; 69 n-=a[i]-1; 70 } 71 return -1; 72 } 73 int main() 74 { 75 while(cin>>n>>m) 76 { 77 for(int i=0;i<m;i++) cin>> a[i]; 78 sort(a,a+m); 79 int ans=solve(); 80 if(ans==-1) cout<<"Impossible"<<endl; 81 else cout<<ans<<endl; 82 } 83 return 0; 84 } 85 //AC 86 #include<bits/stdc++.h> 87 using namespace std; 88 int n,m; 89 int a[110]; 90 int solve() 91 { 92 if(n==0) return 0; 93 if(n==1) return 0; 94 for(int i=m-1;i>=0;i--) 95 { 96 if(a[i]>=n) return m-i; 97 if(a[i]==0) break; 98 n-=a[i]-1; 99 } 100 return -1; 101 } 102 int main() 103 { 104 while(cin>>n>>m) 105 { 106 for(int i=0;i<m;i++) cin>> a[i]; 107 sort(a,a+m); 108 int ans=solve(); 109 if(ans==-1) cout<<"Impossible"<<endl; 110 else cout<<ans<<endl; 111 } 112 return 0; 113 }
1A 数组标记,cnt记录不满足标记的不同数的个数,cnt为0时ans++
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 int s[50010],t[50010]; 5 int mp[50010],v[50010]; 6 int main() 7 { 8 while(scanf("%d",&n)==1) 9 { 10 for(int i=0;i<n;i++) scanf("%d",s+i); 11 scanf("%d",&m); 12 while(m--) 13 { 14 memset(mp,0,sizeof(mp)); 15 memset(v,0,sizeof(v)); 16 int k,cnt=0,ans=0; 17 scanf("%d",&k); 18 for(int i=0;i<k;i++) 19 { 20 scanf("%d",t+k); 21 mp[t[k]]--; 22 if(!v[t[k]]) cnt++; 23 v[t[k]]=1; 24 } 25 for(int i=0;i<k;i++) 26 { 27 if(!v[s[i]]) continue; 28 mp[s[i]]++; 29 if(mp[s[i]]==0) cnt--; 30 if(mp[s[i]]==1) cnt++; 31 } 32 for(int i=k;i<=n;i++) 33 { 34 if(cnt==0) ans++; 35 if(v[s[i-k]]) 36 { 37 mp[s[i-k]]--; 38 if(mp[s[i-k]]==-1) cnt++;//0->-1 39 if(mp[s[i-k]]==0) cnt--;//1->0 40 } 41 if(!v[s[i]] || i==n) continue; 42 mp[s[i]]++; 43 if(mp[s[i]]==0) cnt--;//1->0 44 if(mp[s[i]]==1) cnt++;//0->1 45 } 46 printf("%d\n",ans); 47 } 48 } 49 return 0; 50 }
赛后:前面可能是因为hash写挫了WA了好多发,后面就开始T了,map会被卡常,改用数组sort后upper_bound()-lower_bound()可过,或者用手写的hash map
这里还见识到了没用过的hash,能比较两个数组排序后是否相等,方法是将原来的数组元素散列,然后每次增减一个元素用加减法
1 //WA1 2 #include <bits/stdc++.h> 3 using namespace std; 4 int n,m; 5 int s[50010]; 6 int mp[50010],v[50010]; 7 vector<vector<int> >t; 8 bool cmp(const vector<int>&a,const vector<int>&b) 9 { 10 return a.size()<b.size(); 11 } 12 map<unsigned long long ,int>table; 13 const unsigned long long HASHNUM=1000000007,p=1000009; 14 template <class T> 15 unsigned long long HASH(T&t) 16 { 17 unsigned long long ans=0; 18 for(auto it=t.begin();it!=t.end();it++) ans=(ans+(*it)*p)%HASHNUM; 19 return ans; 20 } 21 void cal(int l) 22 { 23 multiset<int>st; 24 for(int i=0;i<l;i++) st.insert(s[i]); 25 table.clear(); 26 for(int i=l;i<=n;i++) 27 { 28 table[HASH(st)]++; 29 st.erase(st.find(s[i-l])); 30 st.insert(s[i]); 31 } 32 } 33 map<unsigned long long,int>id; 34 int ans[50010]; 35 int main() 36 { 37 while(scanf("%d",&n)==1) 38 { 39 for(int i=0;i<n;i++) scanf("%d",s+i); 40 scanf("%d",&m); 41 for(int i=0;i<m;i++) 42 { 43 int k,x; 44 scanf("%d",&k); 45 vector<int>tmp; 46 while(k--) scanf("%d",&x),tmp.push_back(x); 47 sort(tmp.begin(),tmp.end()); 48 id[HASH(tmp)]=i; 49 t.push_back(tmp); 50 } 51 sort(t.begin(),t.end(),cmp); 52 for(int i=0;i<m;) 53 { 54 int j=i; 55 while(j<m && t[j].size()==t[i].size()) j++; 56 cal(t[i].size()); 57 for(int k=i;k<j;k++) ans[id[HASH(t[k])]]=table[HASH(t[k])]; 58 i=j; 59 } 60 for(int i=0;i<m;i++) printf("%d\n",ans[i]); 61 } 62 return 0; 63 } 64 //WA2 65 #include <bits/stdc++.h> 66 using namespace std; 67 int n,m; 68 int s[50010]; 69 int mp[50010],v[50010]; 70 vector<vector<int> >t; 71 bool cmp(const vector<int>&a,const vector<int>&b) 72 { 73 return a.size()<b.size(); 74 } 75 map<unsigned long long ,int>table; 76 const unsigned long long HASHNUM=1000007,p=10009; 77 template <class T> 78 unsigned long long HASH(T&t) 79 { 80 unsigned long long ans=0; 81 for(auto it=t.begin();it!=t.end();it++) ans=(ans+(*it)*p)%HASHNUM; 82 return ans; 83 } 84 void cal(int l) 85 { 86 multiset<int>st; 87 for(int i=0;i<l;i++) st.insert(s[i]); 88 table.clear(); 89 for(int i=l;i<=n;i++) 90 { 91 table[HASH(st)]++; 92 st.erase(st.find(s[i-l])); 93 st.insert(s[i]); 94 } 95 } 96 map<unsigned long long,int>id; 97 int ans[50010]; 98 int main() 99 { 100 while(scanf("%d",&n)==1) 101 { 102 for(int i=0;i<n;i++) scanf("%d",s+i); 103 scanf("%d",&m); 104 for(int i=0;i<m;i++) 105 { 106 int k,x; 107 scanf("%d",&k); 108 vector<int>tmp; 109 while(k--) scanf("%d",&x),tmp.push_back(x); 110 sort(tmp.begin(),tmp.end()); 111 id[HASH(tmp)]=i; 112 t.push_back(tmp); 113 } 114 sort(t.begin(),t.end(),cmp); 115 for(int i=0;i<m;) 116 { 117 int j=i; 118 while(j<m && t[j].size()==t[i].size()) j++; 119 cal(t[i].size()); 120 for(int k=i;k<j;k++) ans[id[HASH(t[k])]]=table[HASH(t[k])]; 121 i=j; 122 } 123 for(int i=0;i<m;i++) printf("%d\n",ans[i]); 124 } 125 return 0; 126 } 127 //WA3 128 #include <bits/stdc++.h> 129 using namespace std; 130 int n,m; 131 int s[50010]; 132 int mp[50010],v[50010]; 133 map<unsigned long long ,int>table; 134 unsigned long long randnum[50010]; 135 const unsigned long long HASHNUM=1000000007,p=1000009; 136 template <class T> 137 unsigned long long HASH(T&t) 138 { 139 unsigned long long ans=0; 140 for(auto it=t.begin();it!=t.end();it++) ans=(ans+randnum[*it])%HASHNUM; 141 return ans; 142 } 143 void cal(int l) 144 { 145 multiset<int>st; 146 for(int i=0;i<l;i++) st.insert(s[i]); 147 table.clear(); 148 for(int i=l;i<=n;i++) 149 { 150 table[HASH(st)]++; 151 st.erase(st.find(s[i-l])); 152 st.insert(s[i]); 153 } 154 } 155 struct node 156 { 157 unsigned long long hash; 158 int len,i; 159 bool operator < (const node&a) 160 { 161 return len<a.len; 162 } 163 }; 164 int ans[50010]; 165 vector<node>t; 166 int main() 167 { 168 for(int i=0;i<50010;i++) randnum[i]=1ULL * (rand()*p)+rand(); 169 while(scanf("%d",&n)==1) 170 { 171 for(int i=0;i<n;i++) scanf("%d",s+i); 172 scanf("%d",&m); 173 for(int i=0;i<m;i++) 174 { 175 int k,x; 176 scanf("%d",&k); 177 vector<int>tmp; 178 while(k--) scanf("%d",&x),tmp.push_back(x); 179 node tmpn; 180 tmpn.hash=HASH(tmp); 181 tmpn.i=i; 182 tmpn.len=tmp.size(); 183 t.push_back(tmpn); 184 } 185 sort(t.begin(),t.end()); 186 for(int i=0;i<m;) 187 { 188 int j=i; 189 while(j<m && t[j].len==t[i].len) j++; 190 cal(t[i].len); 191 for(int k=i;k<j;k++) ans[t[k].i]=table[t[k].hash]; 192 i=j; 193 } 194 for(int i=0;i<m;i++) printf("%d\n",ans[i]); 195 } 196 return 0; 197 } 198 //WA4 199 #include <bits/stdc++.h> 200 using namespace std; 201 int n,m; 202 int s[50010]; 203 int mp[50010],v[50010]; 204 map<unsigned long long ,int>table; 205 unsigned long long randnum[50010]; 206 const unsigned long long HASHNUM=1000000007,p=1000009; 207 template <class T> 208 unsigned long long HASH(T&t) 209 { 210 unsigned long long ans=0; 211 for(auto it=t.begin();it!=t.end();it++) ans=(ans+randnum[*it])%HASHNUM; 212 return ans; 213 } 214 void cal(int l) 215 { 216 multiset<int>st; 217 for(int i=0;i<l;i++) st.insert(s[i]); 218 table.clear(); 219 for(int i=l;i<=n;i++) 220 { 221 table[HASH(st)]++; 222 st.erase(st.find(s[i-l])); 223 st.insert(s[i]); 224 } 225 } 226 struct node 227 { 228 unsigned long long hash; 229 int len,i; 230 bool operator < (const node&a) 231 { 232 return len<a.len; 233 } 234 }; 235 int ans[50010]; 236 vector<node>t; 237 int main() 238 { 239 for(int i=0;i<50010;i++) randnum[i]=1ULL * ((rand()*p)+rand()*p)+rand(); 240 while(scanf("%d",&n)==1) 241 { 242 for(int i=0;i<n;i++) scanf("%d",s+i); 243 scanf("%d",&m); 244 for(int i=0;i<m;i++) 245 { 246 int k,x; 247 scanf("%d",&k); 248 vector<int>tmp; 249 while(k--) scanf("%d",&x),tmp.push_back(x); 250 node tmpn; 251 tmpn.hash=HASH(tmp); 252 tmpn.i=i; 253 tmpn.len=tmp.size(); 254 t.push_back(tmpn); 255 } 256 sort(t.begin(),t.end()); 257 for(int i=0;i<m;) 258 { 259 int j=i; 260 while(j<m && t[j].len==t[i].len) j++; 261 cal(t[i].len); 262 for(int k=i;k<j;k++) ans[t[k].i]=table[t[k].hash]; 263 i=j; 264 } 265 for(int i=0;i<m;i++) printf("%d\n",ans[i]); 266 } 267 return 0; 268 }
1 //TLE5 2 #include <bits/stdc++.h> 3 using namespace std; 4 int n,m; 5 int s[50010]; 6 int mp[50010],v[50010]; 7 map<unsigned long long ,int>table; 8 unsigned long long randnum[50010]; 9 const unsigned long long HASHNUM=1000000007,p=1000009; 10 template <class T> 11 unsigned long long HASH(T&t) 12 { 13 unsigned long long ans=0; 14 for(auto it=t.begin();it!=t.end();it++) ans=ans+randnum[*it]; 15 return ans; 16 } 17 void cal(int l) 18 { 19 multiset<int>st; 20 for(int i=0;i<l;i++) st.insert(s[i]); 21 table.clear(); 22 for(int i=l;i<=n;i++) 23 { 24 table[HASH(st)]++; 25 st.erase(st.find(s[i-l])); 26 st.insert(s[i]); 27 } 28 } 29 struct node 30 { 31 unsigned long long hash; 32 int len,i; 33 bool operator < (const node&a) 34 { 35 return len<a.len; 36 } 37 }; 38 int ans[50010]; 39 vector<node>t; 40 int main() 41 { 42 for(int i=0;i<50010;i++) randnum[i]=1ULL * ((rand()*p)+rand()*p)+rand(); 43 while(scanf("%d",&n)==1) 44 { 45 for(int i=0;i<n;i++) scanf("%d",s+i); 46 scanf("%d",&m); 47 for(int i=0;i<m;i++) 48 { 49 int k,x; 50 scanf("%d",&k); 51 vector<int>tmp; 52 while(k--) scanf("%d",&x),tmp.push_back(x); 53 node tmpn; 54 tmpn.hash=HASH(tmp); 55 tmpn.i=i; 56 tmpn.len=tmp.size(); 57 t.push_back(tmpn); 58 } 59 sort(t.begin(),t.end()); 60 for(int i=0;i<m;) 61 { 62 int j=i; 63 while(j<m && t[j].len==t[i].len) j++; 64 cal(t[i].len); 65 for(int k=i;k<j;k++) ans[t[k].i]=table[t[k].hash]; 66 i=j; 67 } 68 for(int i=0;i<m;i++) printf("%d\n",ans[i]); 69 } 70 return 0; 71 } 72 //TLE6 73 #include <bits/stdc++.h> 74 using namespace std; 75 int n,m; 76 int s[50010]; 77 int mp[50010],v[50010]; 78 map<unsigned long long ,int>table; 79 unsigned long long randnum[50010]; 80 const unsigned long long HASHNUM=1000000007,p=1000009; 81 template <class T> 82 unsigned long long HASH(T&t) 83 { 84 unsigned long long ans=0; 85 for(auto it=t.begin();it!=t.end();it++) ans+=randnum[*it]; 86 return ans; 87 } 88 void cal(int l) 89 { 90 unsigned long long ans=0; 91 for(int i=0;i<l;i++) ans+=randnum[s[i]]; 92 table.clear(); 93 for(int i=l;i<=n;i++) 94 { 95 table[ans]++; 96 ans-=randnum[s[i-l]]; 97 ans+=randnum[s[i]]; 98 } 99 } 100 struct node 101 { 102 unsigned long long hash; 103 int len,i; 104 bool operator < (const node&a) 105 { 106 return len<a.len; 107 } 108 }; 109 int ans[50010]; 110 vector<node>t; 111 int main() 112 { 113 for(int i=0;i<50010;i++) randnum[i]=1ULL * ((rand()*p)+rand()*p)+rand(); 114 while(scanf("%d",&n)==1) 115 { 116 for(int i=0;i<n;i++) scanf("%d",s+i); 117 scanf("%d",&m); 118 for(int i=0;i<m;i++) 119 { 120 int k,x; 121 scanf("%d",&k); 122 vector<int>tmp; 123 while(k--) scanf("%d",&x),tmp.push_back(x); 124 node tmpn; 125 tmpn.hash=HASH(tmp); 126 tmpn.i=i; 127 tmpn.len=tmp.size(); 128 t.push_back(tmpn); 129 } 130 sort(t.begin(),t.end()); 131 for(int i=0;i<m;) 132 { 133 int j=i; 134 while(j<m && t[j].len==t[i].len) j++; 135 cal(t[i].len); 136 for(int k=i;k<j;k++) ans[t[k].i]=table[t[k].hash]; 137 i=j; 138 } 139 for(int i=0;i<m;i++) printf("%d\n",ans[i]); 140 } 141 return 0; 142 }
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef unsigned long long ULL; 4 const int N=50010; 5 int n,m; 6 int s[N]; 7 int mp[N],v[N]; 8 vector<ULL>table; 9 ULL randnum[N]; 10 const ULL HASHNUM=1000000007,p=1000009; 11 template <class T> 12 ULL HASH(T&t) 13 { 14 ULL ans=0; 15 for(auto it=t.begin();it!=t.end();it++) ans+=randnum[*it]; 16 return ans; 17 } 18 void cal(int l) 19 { 20 ULL ans=0; 21 for(int i=0;i<l;i++) ans+=randnum[s[i]]; 22 table.clear(); 23 for(int i=l;i<=n;i++) 24 { 25 table.push_back(ans); 26 ans-=randnum[s[i-l]]; 27 ans+=randnum[s[i]]; 28 } 29 sort(table.begin(),table.end()); 30 } 31 struct node 32 { 33 ULL hash; 34 int len,i; 35 bool operator < (const node&a) 36 { 37 return len<a.len; 38 } 39 }; 40 int ans[N]; 41 vector<node>t; 42 int main() 43 { 44 for(int i=0;i<N;i++) randnum[i]=1ULL * ((rand()*p)+rand()*p)+rand(); 45 while(scanf("%d",&n)==1) 46 { 47 for(int i=0;i<n;i++) scanf("%d",s+i); 48 scanf("%d",&m); 49 for(int i=0;i<m;i++) 50 { 51 int k,x; 52 scanf("%d",&k); 53 vector<int>tmp; 54 while(k--) scanf("%d",&x),tmp.push_back(x); 55 node tmpn; 56 tmpn.hash=HASH(tmp); 57 tmpn.i=i; 58 tmpn.len=tmp.size(); 59 t.push_back(tmpn); 60 } 61 sort(t.begin(),t.end()); 62 for(int i=0;i<m;) 63 { 64 int j=i; 65 while(j<m && t[j].len==t[i].len) j++; 66 cal(t[i].len); 67 for(int k=i;k<j;k++) ans[t[k].i]=upper_bound(table.begin(),table.end(),t[k].hash)-lower_bound(table.begin(),table.end(),t[k].hash); 68 i=j; 69 } 70 for(int i=0;i<m;i++) printf("%d\n",ans[i]); 71 } 72 return 0; 73 } 74 /* 75 统计数组a中每个数出现的次数: 76 最简单的是直接用map<T,int>mp 77 for(int i=0;i<a.size();i++) mp[a[i]]++; 78 但map log常数较大,容易被卡常 79 不用map: 80 sort(a.begin(),a.end()); 81 则x出现的次数为 82 upper_bound(a.begin(),a.end(),x)-lower_bound(a.begin(),a.end(),x); 83 */ 84 /* 85 与顺序无关的数组hash值(只考虑排序后是否相等) 86 const int p=100009; 87 ULL randnum[N]; 88 for(int i=0;i<N;i++) randnum[i]=1ULL * ((rand()*p)+rand()*p)+rand(); 89 ULL hash=0; 90 for(int i=0;i<a.size();i++) hash+=randnum[a[i]];//增加或减少一个数a[i]则+ - randnum[a[i]]; 91 */
以上是关于2017计蒜客(四,五,六)的主要内容,如果未能解决你的问题,请参考以下文章