NOIP模擬題 位運算 生成樹

2021-07-24 17:25:52 字數 4603 閱讀 3224

如約而至。

願不辜負。

說正事,不要因為寫得很快而沾沾自喜,對拍要快快快一點啊啊啊!

然後推的時候要用變數代替樣例資料,同時一定!要自己出資料。

還有,一定要在思路理清楚以後認真檢查一次程式的邏輯關係,是否能達到要求,尤其是常數的使用。

靜態差錯一!定!要!認真看每一句,清醒一點呀喂!

現在腦子不太好使,很容易想不出來,每抓住乙個可能的思路,不要因為問題而退縮,要想一下如果我要用這個方法的話我要怎麼解決!

t1:

題意:

給定一串行,求每個數&,|每個數的和。

分析:

把每一位畫出來會發現,針對當前數當前位是0或是1來進行處理即可。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 2e8

#define clr(x) memset(x,0,sizeof(x))

#define maxen(x) memset(x,127,sizeof(x))

#define maxer(x) memset(x,31,sizeof(x))

#define minus(x) memset(x,-1,sizeof(x))

#define each(i,n,m) for(long long i=n;i#define eachrev(i,n,m) for(long long i=n;i>m;i--)

#define minn(a,b,c) min(a,min(b,c))

#define maxx(a,b,c) max(a,max(b,c))

#ifdef win32

#define lld "%i64d"

#else

#define lld "%lld"

#endif

#define proc "believe"

//for(long long i=1;i<=n;i++)

//(double) (ll) ll (long long)

//(double)clock()/clocks_per_sec

using

namespace

std;

const

long

long maxn=1e5+5;

const

long

long modd=1e9+7;

long

long n,a[maxn];

long

long b[20],c[20],ansb[maxn],ansc[maxn];

long

long read()

while(ch>='0'&&ch<='9')

return x*f;

}void init()

void work1()

for(int i=1;i<=n;i++)printf(lld" ",ansb[i]);

printf("\n");

for(int i=1;i<=n;i++)printf(lld" ",ansc[i]);

}int main()

t2:

題意:

要求從n個,每個有兩個不同顏色的盒子裡選出最多個數的盒子,使得其任意子集不會出現所有顏色數為偶數的情況。

分析:

對於兩個點繫結了的情況,考慮建圖,然後會發現,只要連成的圖成了環,則出現了所有點度為偶數的最小情況,所以不能選。針對這種情況就不能選,由於加上一條邊必須同時減去一條邊,而它們的取捨不會對後面造成不同(因為其本質都是環的一部分),貪心走下去就可以了。

其實本質就是對於每個連通分量選一棵樹。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 2e8

#define clr(x) memset(x,0,sizeof(x))

#define maxen(x) memset(x,127,sizeof(x))

#define maxer(x) memset(x,31,sizeof(x))

#define minus(x) memset(x,-1,sizeof(x))

#define each(i,n,m) for(int i=n;i#define eachrev(i,n,m) for(int i=n;i>m;i--)

#define minn(a,b,c) min(a,min(b,c))

#define maxx(a,b,c) max(a,max(b,c))

#ifdef win32

#define lld "%i64d"

#else

#define lld "%lld"

#endif

#define proc "heart"

//for(int i=1;i<=n;i++)

//(double) (ll) ll (int)

//(double)clock()/clocks_per_sec

using

namespace

std;

const

int maxn=1e5+5;

const

int modd=1e9+7;

int tot,fin,sta;

int n,m,fa[maxn*2];

int read()

while(ch>='0'&&ch<='9')

return x*f;

}int findfa(int u)

void init()

}}void work()

int main()

t3:

題意:

對於t1,給出結果,輸出滿足的序列。

分析:

a&b+a|b=a+b,給的兩個序列剛好是這兩種運算,加起來解一下方程就可以了。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 2e8

#define clr(x) memset(x,0,sizeof(x))

#define maxen(x) memset(x,127,sizeof(x))

#define maxer(x) memset(x,31,sizeof(x))

#define minus(x) memset(x,-1,sizeof(x))

#define each(i,n,m) for(long long i=n;i#define eachrev(i,n,m) for(long long i=n;i>m;i--)

#define minn(a,b,c) min(a,min(b,c))

#define maxx(a,b,c) max(a,max(b,c))

#ifdef win32

#define lld "%i64d"

#else

#define lld "%lld"

#endif

#define proc "problem"

//for(long long i=1;i<=n;i++)

//(double) (ll) ll (long long)

//(double)clock()/clocks_per_sec

using

namespace

std;

const

long

long maxn=1e5+5;

const

long

long modd=1e9+7;

long

long n,***,res,cal;

long

long tot[maxn],ans[maxn];

long

long read()

while(ch>='0'&&ch<='9')

return x*f;

}void init()

void work()

void debug()

int main()

NOIP模擬題 「與」(位運算)

因為是與運算,所以我們可以貪心地每次找最高位的,將他們加入到新的序列中,然後每一次在這個新的序列繼續找下乙個位。然後最後序列中任意兩個的與運算的值都是一樣的且是最大的。include include include include include include include include in...

NOIP模擬 位運算(trie樹 按位貪心)

題目描述 有q次操作,每次操作是以下兩種 1 加入乙個數到集合中 2 查詢,查詢當前數字與集合中的數字的最大異或值,最大and值,最大or值 輸入格式 第一行1個正整數q表示操作次數 接下來q行,每行2個數字,第乙個數字是操作序號op 1,2 第二個數字是x表示操作的數字 輸出格式 輸出查詢次數行,...

NOIP模擬 wall 最大生成樹

給出n個點,第i個點座標是 x i,y i 給出m條邊,第i條邊的權值是 w i 求將圖變成一顆樹所需要刪除邊的最小權值和。首先要看出座標其實是出題人使出的障眼法,把人往計算幾何引。看透問題後就知道這是求一顆最大生成樹。includeusing namespace std const int n 1...