NOIP模擬20 題解

2022-03-16 16:57:26 字數 1796 閱讀 8484

來自達哥的問候……

究級難題,完全不可做qaq

#include#include

#include

using

namespace

std;

typedef

long

long

ll;int

n;ll a[

25],b[25],c[25],d[25

],ans;

void dfs(int

step,ll mdx,ll lhb)

//cout0?mdx+a[step]:0,lhb-b[step]>0?lhb-b[step]:0

); dfs(step+1,mdx-d[step]>0?mdx-d[step]:0,lhb+c[step]>0?lhb+c[step]:0

);

return;}

intmain()

view code

題目中特意強調了簡單路徑,往無環圖的性質上想。顯然無環圖聯通塊個數=點數-邊數,那麼直接二維字首和維護黑塊個數、橫向邊數、縱向邊數即可。

#include#include

#include

using

namespace

std;

const

int n=2019

;int

n,m,q;

inta[n][n];

inthl[n][n],sl[n][n],sum[n][n];

intread()

while(isdigit(ch))x=x*10+ch-'

0',ch=getchar();

return x*f;}/*

int getsum(int tmp[n],int i,int j)

*/int

main()

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

for(int j=1;j<=m;j++)

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

return0;

}

view code

鬼畜值的計算公式其實就是$c_n^2$,所以每一對相交線貢獻就是1,不用考慮多條線交於一點的情況。

其實手玩一下的話很容易發現題目要求的就是逆序對個數(只要你別像我一樣以為這是一道美妙的數學題考場推2頁a4紙公式就行)

但是達哥為了不讓自己出的題被ak(雖說我們那場還是有ak的),把記憶體卡到了32m

肯定要在$x$的生成方式上尋求突破,可以發現$x$構成的序列由多個等差數列構成。如果$x[i]$和$x[i-1]$在同一段等差數列內,且$x[i-1]$和前面的數列構成了m個逆序對,那麼$x[i]$一定可以和前面的數構成m-k個逆序對。因為每段中必然有乙個數能和$x[i-1]$構成逆序對而不能和$x[i]$構成,所以每段貢獻都要少1。

如果到了新一段等差數列的開始,就直接用樹狀陣列計算逆序對數。另外,對於剛開始不完整的一段等差數列需要加特判。

#include#include

#include

using

namespace

std;

#define int long long

intn,ini,a,mod,maxx,ans;

int c[100005

];int lb(int x)

int add(int x,int

val)

int sum(int

x)signed main()

cout

return0;

}

view code

NOIP 模擬17 題解

部分分很肥,正解寫得常數稍大就會和暴力乙個分,考試的時候寫什麼自己考慮。滑稽 部分分的迴圈邊界手抖寫錯了 25 原本暴力分中的10分都沒了啊啊啊 沒寫掛的話應該有75,其實就是二維字首和 暴力列舉點對統計 a i j 都相等時只枚舉子矩形大小再乘上這種大小出現的次數。正解 sum r sum l 1...

NOIP模擬16 題解

出題人大概已經去為國家處理積壓子彈了?貪心,讓每乙隻青蛙 我慫行吧 都盡量往遠跳,能到達的最遠的被踩了就跳次遠的,以此類推。可以維護乙個單調佇列,表示每只青蛙的位置 開始都是0 然後按順序掃一遍每個石頭,如果隊首的青蛙不能跳過去就放棄它直接pop掉,如果能跳就把石頭位置從隊尾push進去並pop掉隊...

NOIP模擬測試20

liu runda聚聚的饋贈 problem a 周 防自閉題?這道題讓我整個考試都很愉悅 搜就完事了 1 include 2 3intn 4 int a 20 b 20 c 20 d 20 5 long long ans 67 void dfs int day,long long oi,long ...