【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 }

 

posted @ 2019-09-15 14:18  加载中···  阅读(171)  评论(0编辑  收藏  举报