NOI 2015 程式自動分析

2021-07-14 12:39:03 字數 760 閱讀 7950

description

在實現程式自動分析的過程中,常常需要判定一些約束條件是否能被同時滿足。

考慮乙個約束滿足問題的簡化版本:假設x1,x2,x3,…代表程式中出現的變數,給定n個形如xi=xj或xi≠xj的變數相等/不等的約束條件,請判定是否可以分別為每乙個變數賦予恰當的值,使得上述所有約束條件同時被滿足。例如,乙個問題中的約束條件為:x1=x2,x2=x3,x3=x4,x1≠x4,這些約束條件顯然是不可能同時被滿足的,因此這個問題應判定為不可被滿足。

現在給出一些約束滿足問題,請分別對它們進行判定。

【題目分析】

先離散化,然後再解決等於的情況(並查集),最後在進行判斷。

【**】

#include

#include

#include

using

namespace

std;

map f;

int p[1000005][2];

int n, len;

int getf(int x)

int main()

else

}bool flag = true;

for (int i = 0; i < len; ++i)

}if (flag) printf("yes\n");

else

printf("no\n");

}return

0;}

NOI 2015 程式自動分析

我覺得是noi史上最簡單的題目了,沒有之一。我們把相等的變數合併起來,然後最後在掃一遍不同的變數是否在乙個塊裡。可能變數很大,離散化一下。uojluogu bzoj cogs include include include using namespace std const int maxm 1e7...

NOI2015 程式自動分析

題解 並查集,因為資料比較大嘛,你要是想再所以如果開1e9的陣列大小,那毫無疑問,基佬紫等著你。所以這個題離散化用了map這個容器。首先,遍歷一遍e 1的時候,把他們之間相等的都給連到同乙個集合裡去,其次再遍歷一遍e 0的時候,看一下當e 0的時候,這兩個是是不是已經在同乙個集合裡面了,如果在乙個集...

NOI2015 程式自動分析

題意 有一些變數 x 給出 n 個形如 i,j,e 的約束條件,判斷能否存在乙個 x 的賦值方案滿足所有約束.e 0 表示 x x e 1 表示 x x n 10 i,j 10 e 題解 先處理所有 e 0 的約束,把相等的變數用並查集並起來.對於 e 1 的約束,如果 i 和 j 在同一集合就無解...