在开头位置%%%nbdhhzh。正是他的出现使窝们陷入了万劫不复的境地。
咦?有点偏了。。。
好像自己有思路的就只有第一题哦~于是我们先来看一看我们的第一题。
程序自动分析(内存限制:512MB 时间限制:1s 代码长度限制:1024KB)
【问题描述】
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。
考虑一个约束满足问题的简化版本:假设 x1,x2,x3,…代表程序中出现的变量,给定 n个形如 xi=xj或 xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。
现在给出一些约束满足问题,请分别对它们进行判定。
如果第i个约束与之前保留的约束可以共存,那么保留它,输出YES。
如果第i个约束与之前保留的约束冲突,那么忽略他,输出NO。
【输入格式】
第1行包含1个正整数n,表示该问题中需要被满足的约束条件个数。
接下来n行,每行包括3个整数i,j,e,描述1个相等/不等的约束条件,相邻整数之间用单个空格隔开。若e=1,则该约束条件为xi=xj;若e=0,则该约束条件为xi≠xj。
【输出格式】
输出文件包括n行。
每行是一个字符串YES或NO,表示这个约束条件是否与之前保留的约束冲突。
【样例输入】
5
1 2 1
1 2 0
2 3 1
2 3 0
1 3 0
【样例输出】
YES
NO
YES
NO
NO
【数据规模与规定】
n范围 | i,j范围 | 约定 | |
---|---|---|---|
1 |
1≤n≤1000
|
1≤i,j≤10000
|
e∈{0,1}
|
2 | |||
3 | |||
4 |
1≤n≤100000
|
||
5 | |||
6 | |||
7 |
1≤i,j≤100000000
|
||
8 | |||
9 | |||
10 |
看到这题可以发现这题的形式很像NOI2015中的一题。然而好像如果(和NOI2015的那题)用一样的算法必死无疑。所以窝们要再想想。
看到题目之后的第一反应应该是并查集吧。窝们看到了这个数据范围之后会觉得i,j很大(但还是没有黈力大),这个时候记录Father节点似乎本蒟蒻不怎么会。。。
于是就可以看到n。。。(不错不错十分美味)发现n只有少少的100000也就是说不重复的数字出现的最多为200000!于是似乎可以<li>乱<san>搞<hua>一下。然后就可以用裸裸的并查集来判断元素是否相同了。至于元素不同?直接在每个并查集的最终Father节点那里记录下与它不相等的集合的最终Father子节点离散化以后的序号。。
似乎问题就解决了。。
然而。。判着判着似乎TLE了
3400 | mars_cat | 时间超限36% |
405216
|
2004
|
C++ | 4075 B | 2015-08-05 16:22:34 |
这是怎么回事呢?听说是合并集合的时候爆掉了。。就像这样!
while(!N[gfy].empty()) { N[gfx].insert(GF(*N[gfy].begin())); N[gfy].erase(N[gfy].begin()); }
然后被黈力骂了
啊。。于是就启发式合并了一下A掉了。。
3403 | mars_cat | 正确 |
405480
|
204
|
C++/Edit | 4131 B | 2015-08-05 16:51:15 |
最终代码如下:(请无视那些长长的读入优化。。)
#include <fstream> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cstring> #include <ctime> #include <cmath> #include <string> #include <algorithm> #include <queue> #include <set> #include <map> using namespace std; #define gch getchar #define mp make_pair char C_get; void read(int &x) { for(x=0,C_get=gch();(C_get<'0'||C_get>'9')&&C_get!='-'&&C_get!='+';C_get=gch()); if(C_get=='-') { for(C_get=gch();C_get>='0'&&C_get<='9';C_get=gch())x=x*10-C_get+'0'; } else { if(C_get=='+')C_get=gch(); for(;C_get>='0'&&C_get<='9';C_get=gch())x=x*10+C_get-'0'; } } void read(long long &x) { for(x=0,C_get=gch();(C_get<'0'||C_get>'9')&&C_get!='-'&&C_get!='+';C_get=gch()); if(C_get=='-') { for(C_get=gch();C_get>='0'&&C_get<='9';C_get=gch())x=x*10-C_get+'0'; } else { if(C_get=='+')C_get=gch(); for(;C_get>='0'&&C_get<='9';C_get=gch())x=x*10+C_get-'0'; } } void read(double &x) { for(x=0,C_get=gch();(C_get<'0'||C_get>'9')&&C_get!='-'&&C_get!='+';C_get=gch()); if(C_get=='-') { for(C_get=gch();C_get>='0'&&C_get<='9';C_get=gch())x=x*10-C_get+'0'; if(C_get=='.') { double n=1; for(C_get=gch();C_get>='0'&&C_get<='9';C_get=gch())n/=10,x=x-(C_get+'0')*n; } } else { if(C_get=='+')C_get=gch(); for(;C_get>='0'&&C_get<='9';C_get=gch())x=x*10+C_get-'0'; if(C_get=='.') { double n=1; for(C_get=gch();C_get>='0'&&C_get<='9';C_get=gch())n/=10,x=x+(C_get-'0')*n; } } } void read(char x){x=gch();} void read(char x[]){gets(x);} int MAP[100000010]; int tt=0; int n,x,y,e; set <int> N[200010]; int F[200010]; int gfx,gfy; int GF(int xx)//Get_Father { if(F[xx]!=xx) { F[xx]=GF(F[xx]); } return F[xx]; } int main() { memset(MAP,0,sizeof(MAP)); memset(F,0,sizeof(F)); read(n); for(int i=1;i<=n;++i) { read(x); read(y); read(e); if(MAP[x]==0)MAP[x]=++tt,N[tt].clear(); if(MAP[y]==0)MAP[y]=++tt,N[tt].clear(); x=MAP[x]; y=MAP[y]; if(!F[x])F[x]=x; if(!F[y])F[y]=y; if(e)/*x==y*/ { if(x==y) { puts("YES"); continue; } gfx=GF(x);gfy=GF(y); if(N[gfx].count(gfy)) { puts("NO"); continue; } if(N[gfy].count(gfx)) { puts("NO"); continue; } puts("YES"); if(gfx==gfy)continue; if(N[gfy].size()>N[gfx].size())swap(gfx,gfy); F[gfy]=gfx; while(!N[gfy].empty()) { N[gfx].insert(GF(*N[gfy].begin())); N[gfy].erase(N[gfy].begin()); } } else/*x!=y*/ { gfx=GF(x);gfy=GF(y); if(gfx==gfy) { puts("NO"); continue; } puts("YES"); N[gfx].insert(gfy); N[gfy].insert(gfx); } } return 0; } /************************************************************** Problem: 1935 User: mars_cat Language: C++ Result: 正确 Time:204 ms Memory:405480 kb ****************************************************************/
可接受。。除了内存比较蛤蛤。。
下表截至2015-8-7 15:54
名次 | RunID | 用户 | 内存 | 耗时 | 语言 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|
1 | 3403 | mars_cat | 405480 KB | 204 MS | C++ | 4131 B | 2015-08-05 16:51:15 |
2 | 3385 | ljx | 17196 KB | 272 MS | C++ | 1787 B | 2015-08-05 15:27:58 |
3 | 3388 | zhl | 20344 KB | 296 MS | C++ | 2042 B | 2015-08-05 15:38:47 |
4 | 3354 | maoxiaohan | 16416 KB | 300 MS | C++ | 1868 B | 2015-08-05 13:26:51 |
5 | 3456 | 20141104 | 16420 KB | 308 MS | C++ | 2783 B | 2015-08-06 09:48:16 |
6 | 3398 | zenith | 20344 KB | 320 MS | C++ | 1378 B | 2015-08-05 16:12:24 |
7 | 3357 | hhw | 17832 KB | 332 MS | C++ | 1754 B | 2015-08-05 13:27:26 |
8 | 3430 | mykk | 21008 KB | 348 MS | C++ | 1326 B | 2015-08-05 20:46:42 |
9 | 3454 | zhzxcool | 9700 KB | 492 MS | C++ | 1860 B | 2015-08-06 08:28:56 |
10 | 3460 | 20141109 | 19180 KB | 604 MS | C++ | 1812 B | 2015-08-06 11:44:47 |
11 | 3353 | lbn187 | 19604 KB | 788 MS | C++ | 1062 B | 2015-08-05 13:25:58 |
2015年8月07日 19:13
咦n不是100000吗。。n要是10000直接n^2暴力不就好了。。
顺便跪rank1爷
2015年8月07日 19:23
已修改= =|@hhw