大视野3562 [SHOI2014]神奇化合物

http://www.lydsy.com/JudgeOnline/problem.php?id=3562

  1 //Accepted    6020 kb    1012 ms
  2 //由于题目的特殊要求:然而,令科学家们大为惊异的是,SHTSC 在变化过程中始终保持着一种特殊的性质:
  3 //即不存在这样的原子序列 a1,a2,...,an(n>3)满足 a1 与 a2、a2 与
  4 //a3、......、an-1 与 an 以及 an 与 a1 都通过化学键相连,但它们之间却没有其他化学键相连的情况。
  5 //所以有如下结论:
  6 //记所求答案为ans
  7 //对于A x y,判断是否存在另外的一个点z使x,z有边,y,z有边
  8 //如果存在z,则操作以后ans不变,否则ans+=1;
  9 //对于D x y,判断是否存在另外的一个点z使x,z有边,y,z有边
 10 //如果存在z,则操作以后ans不变,否则ans-=1;
 11 #include <cstdio>
 12 #include <cstring>
 13 #include <iostream>
 14 #include <queue>
 15 #include <cmath>
 16 #include <algorithm>
 17 using namespace std;
 18 #define ll long long
 19 const int imax_n = 5005;
 20 const int imax_m = 420005;
 21 struct node
 22 {
 23     int v,u;
 24     node()
 25     {
 26
 27     }
 28     node(int u,int v):u(u),v(v)
 29     {
 30
 31     }
 32 }p[imax_m];
 33 int head[imax_n],next[imax_m];
 34 int e;
 35 int vis[imax_n];
 36 int ans;
 37 int Q;
 38 int n,m;
 39 void init()
 40 {
 41     memset(head,-1,sizeof(head));
 42     memset(next,-1,sizeof(next));
 43     e=0;
 44 }
 45 void addEdge(int u,int v)
 46 {
 47     p[e]=node(u,v);
 48     next[e]=head[u];
 49     head[u]=e++;
 50 }
 51 void deleteEdge(int u,int v)
 52 {
 53     int pre=-1,i;
 54     for (i=head[u];i!=-1;i=next[i])
 55     {
 56         if (p[i].v==v) break;
 57         pre=i;
 58     }
 59     if (pre==-1)
 60     {
 61         //head[u]=next[next[i]];
 62         head[u]=next[i];
 63     }
 64     else
 65     {
 66         //next[pre]=next[next[i]];
 67         next[pre]=next[i];
 68     }
 69 }
 70 void dfs(int u)
 71 {
 72     vis[u]=1;
 73     for (int i=head[u];i!=-1;i=next[i])
 74     {
 75         int v=p[i].v;
 76         if (!vis[v])
 77         dfs(v);
 78     }
 79 }
 80 int countTheNumberOfGraph()
 81 {
 82     memset(vis,0,sizeof(vis));
 83     int ans=0;
 84     for (int i=1;i<=n;i++)
 85     {
 86         if (!vis[i])
 87         {
 88             dfs(i);
 89             ans++;
 90         }
 91     }
 92     return ans;
 93 }
 94 /*
 95 bool find(int x,int y)
 96 {
 97     int flag=0;
 98     for (int i=1;i<=n;i++)
 99     {
100         if (i==x) continue;
101         if (i==y) continue;
102         flag=0;
103         for (int j=head[i];j+1;j=next[j])
104         {
105             if (p[j].v==x) flag++;
106             if (p[j].v==y) flag++;
107             if (flag==2) return 1;
108         }
109     }
110     return 0;
111 }
112 */
113 int mark[imax_n];
114 bool find(int x,int y)
115 {
116     memset(mark,0,sizeof(mark));
117     for (int i=head[x];i+1;i=next[i])
118     {
119         if (p[i].v!=y)
120         mark[p[i].v]++;
121     }
122     for (int i=head[y];i+1;i=next[i])
123     {
124         if (p[i].v!=x)
125         mark[p[i].v]++;
126     }
127     for (int i=1;i<=n;i++)
128     {
129         //printf("mark[%d]=%d\n",i,mark[i]);
130         if (mark[i]==2) return 1;
131     }
132     return 0;
133 }
134 void operatorA(int x,int y)
135 {
136     if (find(x,y)==0)
137     {
138         //printf("A %d %d ans--\n",x,y);
139         ans--;
140     }
141     addEdge(x,y);
142     addEdge(y,x);
143 }
144 void operatorD(int x,int y)
145 {
146     if (find(x,y)==0)
147     {
148         //printf("D %d %d ans++\n",x,y);
149         ans++;
150     }
151     deleteEdge(x,y);
152     deleteEdge(y,x);
153 }
154 void operatorQ()
155 {
156     printf("%d\n",ans);
157 }
158 char s[5];
159 int main()
160 {
161     //freopen("in.txt","r",stdin);
162     //freopen("out.txt","w",stdout);
163     while (scanf("%d%d",&n,&m)!=-1)
164     {
165         int x,y;
166         init();
167         for (int i=0;i<m;i++)
168         {
169             scanf("%d%d",&x,&y);
170             addEdge(x,y);
171             addEdge(y,x);
172         }
173         ans=countTheNumberOfGraph();
174         scanf("%d",&Q);
175         for (int i=0;i<Q;i++)
176         {
177             scanf("%s",s);
178             if (s[0]==‘A‘)
179             {
180                 scanf("%d%d",&x,&y);
181                 operatorA(x,y);
182             }
183             if (s[0]==‘D‘)
184             {
185                 scanf("%d%d",&x,&y);
186                 operatorD(x,y);
187             }
188             if (s[0]==‘Q‘)
189             {
190                 operatorQ();
191             }
192         }
193     }
194     return 0;
195 }
时间: 2024-10-10 23:41:56

大视野3562 [SHOI2014]神奇化合物的相关文章

BZOJ 3562: [SHOI2014]神奇化合物 并查集+dfs

点击打开链接 注意到20w条边,但是询问只有1w,所以有很多边是从头到尾不变的. 首先离线处理,将从未删除的边缩点,缩点后的图的点数不会超过2w,对于每一次add或者delete,直接dfs看是否能从a走到b,然后维护一个ans. 数据不强,不然这种复杂度起码要跑10s.. #include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> using namespace st

BZOJ 3562 SHOI2014 神奇化合物 暴力

题目大意:维护一张弦图,支持加边.删边和询问图中有多少个联通块 暴力题233 直接做O(qn+qm)会挂 因此我们预先将m条边中自始至终不会被删除的边用并查集缩点 这样图中的边就只有O(q)条 暴力即可 时间复杂度O(nq+q^2) 很疑惑为什么要给一张弦图- - 去找了下没看到类似于动态弦图的东西- - #include <map> #include <vector> #include <cstdio> #include <cstring> #includ

bzoj3562: [SHOI2014]神奇化合物

又是玄学的一天~ 首先,这题做法就很玄学,考虑到点和询问都很少,那么很多边都是没有改动的,那么可以离线用并查集缩点,然后爆搜求解. 假如只是这样还好吧,尴尬就在于我跑数据前面3个点挂了??黑人问号 然后一怒之下特判,假如边数<10000那我就不缩点,直接爆力搞! A了~ 真的A了... 这个故事告诉我们,猜证结合,爆正乱搞,天下大同... #include<cstdio> #include<iostream> #include<cstring> #include&

VS大视野

vs的本质:他是微软公司的员工一起开发的一个项目: 既然是项目:那么就是用编程语言编出来的! 用的是C# C#有他的特点:继承,封装,多态!等 我们在使用vs的时候,为什么可以使用很多的里面已经存在的方法呢!因为微软的人员将方法都编译成了dll文件,导入到vs里面了!所以我们可以使用String,int ,datetime等类型! 而且我们也可以引用其他的dll,只要可以用就可以! VS大视野

【BZOJ3562】【SHOI2014】神奇化合物 特技

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44016219"); } 题解: 一开始让我写这道题,其实我是,是拒绝的. 我跟大爷讲,我拒绝,因为,其实我,根本搞不懂这个时间复杂度. 大爷跟我讲,敲时加特技,代码很短很快很好. 加了30行特技之后呢,代码DUANG~~~ 后来我其

1639 月度开支 大视野评测

Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100,000)个工作日中每一天的花费moneyi(1<=moneyi<=10,000),他想要为他连续的M(1<=M<=N)个被叫做"清算月"的结帐时期做一个预算,每一个"清算月"包含一个工作日或更多连续的工作日,每一个工作日都仅被包含在一个&quo

2星|《大视野经济学》:零碎、不成体系的经济学常识

看介绍以为是很牛的著作,读完非常失望.通篇是零碎的.不成体系的对经济宏观或微观的观察及分析.信息浓度比较低.前1/4的篇幅非常具体地描述几个美国人的生活细节.第7章提到美国的医疗支出的增速开始下降,并且经济衰退不是最根本的原因,我以为后面会有更深刻的原因出现,结果就没有了,后面再不提这个话题. 总体评价2星. 以下是书中一些内容的摘抄: 1:我们都知道,美国是一个消费主义国家,我们的经济发展是建立在蒸蒸日上.愿意花钱的中产阶级的基础之上.所以,逻辑就是,减税可以让人们有更多的钱,意味着花钱更多.

大视野 1031 字符加密Cipher(后缀数组)

字符加密Cipher Description 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0 把它们按照字符串的大小排序: 07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J 读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容

2600 米仓 大视野评测

Description 乡间有一条笔直而长的路称为"米道".沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ≤ i <R,稻田 i 的坐标 X[i]满足 1 ≤ X[0] ≤ ... ≤ X[R-1] ≤ L. 注意:可能有多块稻田位于同一个坐标上. 我们计划建造一个米仓用于储存尽可能多的稻米.和稻田一样,米仓将建在米道上,其坐标也是一个 1 到 L 之间的整数(含 1 和 L).这个米仓