NOI2015 程式自動分析

2021-10-07 01:43:10 字數 1283 閱讀 6126

題解:並查集,因為資料比較大嘛,你要是想再所以如果開1e9的陣列大小,那毫無疑問,基佬紫等著你。

所以這個題離散化用了map這個容器。

首先,遍歷一遍e=1的時候,把他們之間相等的都給連到同乙個集合裡去,其次再遍歷一遍e=0的時候,看一下當e=0的時候,這兩個是是不是已經在同乙個集合裡面了,如果在乙個集合裡面的話,就說明這兩個條件是衝突的,直接輸出no即可。

如何使用map:我們設乙個cnt變數從0開始,沒遇到乙個沒有遇到的數,就把他的值變換成++cnt即可,這樣就可以把1e9的範圍大小給縮小成2e5的範圍。

這個題要注意的幾點:

1.可能會存在2 2 0這種條件,所以要特判一下。

2.注意f[x]要開雙倍的空間!!!!!

/*keep on going never give up*/

#pragma gcc optimize(3,"ofast","inline")

#include

const

int maxn =

1e5+10;

const

int maxn =

0x3f3f3f3f

;const

int minn =

0xc0c0c00c

;typedef

long

long ll;

const

int mod =

100000000

;using

namespace std;

mapint> s;

int a[maxn]

,b[maxn]

,c[maxn]

;int f[maxn<<1]

;void

init

(int x)

intifind

(int x)

intmain()

}bool flag=

false

;//for(int i=1;i<=4;i++) cout(int i=

0;i(!nx||

!ny)

continue

;int dx=

ifind

(nx)

;int dy=

ifind

(ny)

;//cout(dx==dy)}}

if(flag) cout<<

"no"

"yes"

<}return0;

}

NOI 2015 程式自動分析

description 在實現程式自動分析的過程中,常常需要判定一些約束條件是否能被同時滿足。考慮乙個約束滿足問題的簡化版本 假設x1,x2,x3,代表程式中出現的變數,給定n個形如xi xj或xi xj的變數相等 不等的約束條件,請判定是否可以分別為每乙個變數賦予恰當的值,使得上述所有約束條件同時...

NOI 2015 程式自動分析

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

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 在同一集合就無解...