2019 10 22 NOIP模擬測試 day2

2022-03-17 23:02:21 字數 3073 閱讀 4441

t1 入陣曲

n的範圍很小,可以用n^3的方法解決。但是我一開始想的是線段樹維護矩陣的和,但是複雜度一直降不下來,還多乙個log,最後還沒有n^4的暴力高。

n^4暴力(70分):就是二維字首和,n^4列舉即可。

100分做法:

現預處理出二維字首和,然後枚舉行和列,列舉列可以直接變成少掉一維列舉,就是看是否能被整除,然後開乙個桶統計一下就可以了,複雜度n^3。

**如下:

#includeusing

namespace

std;

const

int maxn=505

;const

int nn=1e6+7

;int

a[maxn][maxn];

long

long

sum[maxn][maxn];

intn,m,k;

long

long

ans;

intcnt[nn];

intb[nn];

intmain()

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

for(int i=0;i)

for(int o=1;o<=m;o++) cnt[b[o]]=0

; }

}printf(

"%lld\n

",ans);

return0;

}

view code

t2 將軍令

一看,這不是最小點覆蓋嗎,直接上樹形dp最小點覆蓋,結果最後wa的很慘。

正解:樹形dp(那是肯定的),只不過dp方程極其複雜,考慮有沒有簡單一點的方法,當然就是貪心。貪心的列舉每個點最多能覆蓋掉的點的個數打標記,用乙個堆來存,從深度深的點向它的第k祖先上打標記。看哪些點沒被覆蓋即可。如果沒被覆蓋,就增加乙個驛站。

**如下:

#includeusing

namespace

std;

const

int maxn=1e6+7

;struct

nodeedge[maxn*2

];int

head[maxn],cnt;

intdeg[maxn];

bool

vis[maxn];

void add(int x,int

y)priority_queue

int,int> >q;

intfa[maxn];

intdep[maxn];

inttot;

intn,m,k,x,y,t;

void dfs1(int

x) }

}void mark(int x,int f,int

dep)

}int getfa(int

x)

returnx;}

intmain()

fa[1]=1;dep[1]=1;dfs1(1

);

for(int i=1;i<=n;i++) q.push(make_pair(dep[i],i));

while(!q.empty())

printf(

"%lld\n

",tot);

return0;

}

view code

t3 星空

輸出0,1,2,3運氣最好的是輸出2,有12分。

看k的範圍很小,就想是否可以狀壓處理,對於每次區間異或,可以將其轉化為差分的形式,維護乙個差分陣列,然後看差分陣列中每個不為0的點的位置所能到達的其他區間,預處理出他們之間的距離,bfs即可。然後就是狀壓dp。設dp[i]表示狀態為i時的最小步數,我們的最終狀態是燈全亮,就這樣dp下去求解即可。轉移方程也非常簡單。

**如下:

#includeusing

namespace

std;

const

int maxn=1e6+7

;const

int n=550

;int dis[20

][maxn];

inta[maxn],b[maxn];

intcha[maxn];

intn,k,m;

intcnt[maxn],num;

intx;

bool

vis[maxn];

long

long dp[1

<<20|1

];int

state[n][n];

void bfs(int x,int *dis)

y=u+b[i];

if(y<=n+1&&!vis[y])} }

}int

main()

for(int i=1;i<=m;i++) scanf("

%d",&b[i]);

for(int i=1;i<=n+1;i++) cha[i]=a[i]^a[i-1

]; memset(dis,

88,sizeof

(dis));

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

}memset(dp,

88,sizeof

(dp));

for(int i=1;i<=num;i++)

}dp[

0]=0

;

int maxx=1

<

for(int i=0;i)}}

}}

printf(

"%lld\n

",dp[maxx-1

]);

return0;

}

view code

NOIP模擬 修路

這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...

NOIP模擬 項鍊

經過一番周折,bob找到了alice,為了安慰alice驚魂未定的心,bob決定給alice買一條手鍊,這條手鍊由m個珍珠組成,每個珍珠上刻著不同的小寫字母。當alice看到一些字母按照一定的順序排列成的字串時,就會產生一定的愉悅值。bob現在可以在這m個珍珠上刻上字母,現在他想知道,如何刻字母可以...

NOIP模擬 幻象

phantom是一位愛思考的哲 學家。最近phantom得到了森 妖精的真傳。在他練功的時候,每秒他的思緒中都有一定的概率浮現出奇 異的幻象,持續x秒的幻象將產生 空格 的幻象值。phantom練功發自真心,他想知道,在n秒內他期望產生的幻象值是多少。等我比賽完之後,我們才知道 空格 是x2 所以比...