【JZOJ A组】听我说,海蜗牛
真的好有意思啊~~居然是暴力~~
分析数据范围是个好东西,发现每次的复杂度是(抄的):
所有询问子图的边数的和 每块(询问)分 k 个时和最大, 则此时和为 min(k∗k,m)∗(n/k) 视 n,m 同阶, 则当 k 取 √n 时, 复杂度卡到最高, 为 n∗√n.
直接bfs,链表记录没有过的点;
1 #include<cstdio> 2 #include<map> 3 #include<algorithm> 4 #define reg register 5 using namespace std; 6 int n,m,q; 7 pair<int,int>h[400100]; 8 struct lian 9 { 10 int t,f,net; 11 }lian[200100]; 12 void del(const int x) 13 { 14 int l=lian[x].f,r=lian[x].net; 15 lian[l].net=r; 16 lian[r].f=l; 17 } 18 int vis[200100]; 19 int cnt; 20 int t[200100]; 21 int l,r; 22 void bfs(const int z) 23 { 24 l=r=0; 25 t[++r]=lian[z].t; 26 while(l<r) 27 { 28 int x=t[++l]; 29 vis[x]=cnt; 30 for(reg int i=lian[0].net;i;i=lian[i].net) 31 { 32 int y=lian[i].t; 33 int a=lower_bound(h+1,h+1+m,make_pair(x,y))-h; 34 if(h[a]==make_pair(x,y))continue; 35 t[++r]=y; 36 del(i); 37 i=lian[i].f; 38 } 39 } 40 } 41 int main() 42 { 43 scanf("%d%d%d",&n,&m,&q); 44 for(reg int i=1;i<=m;i++) 45 { 46 int a,b; 47 scanf("%d%d",&a,&b); 48 h[i].first=h[m+i].second=a; 49 h[i+m].first=h[i].second=b; 50 } 51 m*=2; 52 sort(h+1,h+1+m); 53 for(int k=1;k<=q;k++) 54 { 55 int tot,ans=0; 56 ++cnt; 57 scanf("%d",&tot); 58 for(reg int i=1;i<=tot;i++) 59 { 60 scanf("%d",&lian[i].t); 61 lian[i].net=i+1;lian[i].f=i-1; 62 } 63 lian[0].net=1;lian[tot].net=0; 64 for(int i=1;i<=tot;i++) 65 { 66 if(vis[lian[i].t]==cnt)continue; 67 del(i); 68 bfs(i); 69 ans++; 70 } 71 printf("%d\n",ans); 72 } 73 return 0; 74 }