Codeforces Round #345 (Div. 1)
2016-03-11 21:00
309 查看
A. Watchmen
只有在和坐标轴平行的线上的两点,两种距离相等。对于重合的点,容斥一下。#include <bits/stdc++.h> #include <unordered_map> using namespace std; #define ll long long unordered_map<int,ll> xx; unordered_map<int,ll> yy; struct point{ int x; int y; point(int x,int y):x(x),y(y){ } point(){ } }; map<pair<int,int> ,ll> pts; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ int x,y; scanf("%d%d",&x,&y); xx[x]++; yy[y]++; pts[make_pair(x,y)]++; } ll ans = 0; for(auto it=xx.begin();it!=xx.end();it++){ ans+= it->second*(it->second-1)/2; } for(auto it=yy.begin();it!=yy.end();it++){ ans+= it->second*(it->second-1)/2; } for(auto it=pts.begin();it!=pts.end();it++){ ans-= it->second*(it->second-1)/2; } cout<<ans<<endl; return 0; }
B. Image Preview
分析一下可以知道,如果改变方向,肯定只会改变一次。对于先往左和先往右的情况,枚举转向的位置,二分搜一下。#include <bits/stdc++.h> #include <unordered_map> using namespace std; #define ll long long int n,a,b,t; int lr[500010]; int rl[500010]; char ori[500010]; int bslr(int k){ int curt = t; curt-=lr[k]; if(curt<0)return 0; curt-=a*(k-1); if(curt<=0)return k; int r = n+1; int l = k+1; int finalPos=n+1; while(l<=r){ int mid = (r+l)>>1; if(rl[mid]>curt){ l=mid+1; }else{ finalPos=mid; r=mid-1; } } return k+(n+1-finalPos); } int ans = 0; void solve(){ lr[0] =-a; for(int i=1;i<=n;i++){ lr[i]=lr[i-1]; lr[i] += a+1; if(ori[i]=='w'){ lr[i]+=b; } } rl[n+1]=0; for(int i=n;i>1;i--){ rl[i]=rl[i+1]; rl[i] += a+1; if(ori[i]=='w'){ rl[i]+=b; } } rl[n+1]=0; for(int i=1;i<=n;i++){ ans = max(ans,bslr(i)); } } int main(){ cin>>n>>a>>b>>t; scanf("%s",ori+1); solve(); reverse(ori+2,ori+n+1); solve(); cout<<ans<<endl; return 0; }
C. Table Compression
用并查集合并必须一样的点,然后对值排序,从小到大处理。每次处理到新的点,要保证它比同行,同列中要小的点大,维护所在集合即可。比赛时用unordered_map乱搞,居然完全没有想到并查集。#include <bits/stdc++.h> #include <unordered_map> using namespace std; #define ll long long int tab[1000010]; int ans[1000010]; const int maxsz = 1000010; int rowMax[maxsz]; int colMax[maxsz]; int rowMaxId[maxsz]; int colMaxId[maxsz]; struct node{ int val; int x,y; node(int val,int x,int y):val(val),x(x),y(y){ } node(){ } bool operator<(const node &other)const{ return val<other.val; } }nds[1000010]; int p[1000010]; int find(int x){ if(p[x]==x)return x; int px = find(p[x]); return p[x]=px; } void Union(int a,int b){ int pa = find(a); int pb = find(b); if(pa!=pb){ p[pb]=pa; } } int main(){ int n,m; cin>>n>>m; int k=1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ int num; scanf("%d",&num); nds[k]=node(num,i,j); tab[k++]=num; } } int nm=n*m; for(int i=0;i<=nm;i++){ p[i] = i; } for(int i=0;i<n;i++){ unordered_map<int,int> mp; for(int j=0;j<m;j++){ int k = i*m+j+1; if(mp.count(tab[k])){ Union(k,mp[tab[k]]); }else{ mp[tab[k]] = k; } } } for(int j=0;j<m;j++){ unordered_map<int,int> mp; for(int i=0;i<n;i++){ int k = i*m+j+1; if(mp.count(tab[k])){ Union(k,mp[tab[k]]); }else{ mp[tab[k]] = k; } } } sort(nds+1,nds+nm+1); for(int i=1;i<=nm;i++){ int val = nds[i].val; int x = nds[i].x; int y = nds[i].y; int k = find(x*m+y+1); if(rowMax[x]<val){ ans[k] = max(ans[k],ans[rowMaxId[x]]+1); rowMax[x]=val; rowMaxId[x] = k; } if(colMax[y]<val){ ans[k] = max(ans[k],ans[colMaxId[y]]+1); colMax[y]=val; colMaxId[y] = k; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ int aa = ans[find(i*m+j+1)]; printf("%d ",aa); } printf("\n"); } return 0; }
相关文章推荐
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- codeforces 618C. Constellation
- Codeforces Round #265 (Div. 2)
- Codeforces #310 div2 C. Case of Matryoshkas
- 状态压缩DP codeforces 244 Problem C. The Brand New Function 和 codeforces 165 E. Compatible Numbers
- codeforces 16 Problem E fish
- Codeforces Round332 部分题解
- CodeForces 603A_Alternative Thinking (DP)
- CodeForces 602B_Approximating a Constant Range_DP
- Codeforces round #247 for Div. 2
- Codeforces Round #246 (Div. 2)
- Codeforces #264(div 2)D.Gargari and Permutations
- Codeforces Round #236 (Div. 2)------A,B
- codeforces 257 div2 B
- Codeforces Gym100571A Cursed Query