NOIP2018 簡要題解(部分)

2021-09-01 03:04:46 字數 3352 閱讀 3401

目錄

[noip2018]簡要題解(部分)

pj:t1 標題統計

t2 龍虎鬥

t3 擺渡車

t4 對稱二叉樹 tg

day1

t1 鋪設道路

t2 貨幣系統

t3 賽道修建

day2

t1 旅行

t2 填數遊戲

t3 保衛王國

入門難度

#includeusing namespace std;

int main()

printf("%d\n",ans);

}

掃了判斷完事

#includeusing namespace std;

const int n=1e5+5;

typedef long long ll;

int n;

ll s[n],ans1,ans2;

int main()

ll ans=-1;int p=0;

for(int i=1;i<=n;i++)else p=i,ans=abs(r-l);

}cout《普及這麼難了嗎。

這dp還是不太好想啊。首先我們考慮t太大了不能設為狀態,然後就考慮前兩個資料。

然後我們發現2*m的等待時間是不可能達到的。然後就dpij表示第i個人等了j的時間的最小總等待時間。

轉移見**。

#includeusing namespace std;

const int n=510,m=110;

int n,m;

int f[n][m*2];int t[n];

const int inf=0x3f3f3f3f;

int main()}}

}int ans=inf;

for(int i=0;i<2*m;i++)

cout《當左右兒子sz相等時暴力chk就行了,當然你寫hash或者其他奇奇怪怪的我也攔不了你。

#includeusing namespace std;

const int n=1e6+5;

int val[n],ch[n][2];

int sz[n];

int n,ans=1;

bool dfs2(int lt,int rt)

return lt==-1&&rt==-1;

}void dfs(int x)

if(~ch[x][1])

if(~l&&~r&&l==r&&sz[x]>ans)

}int main()

printf("%d\n",ans);

}

一定是選乙個子集更優。然後就想到去排序然後做揹包就行了。

#includeusing namespace std;

bool vis[250010];

int t,n,a[110];

int main()

}printf("%d\n",ans);

}}

二分答案肯定是對的,考慮去找一下性質。發現dp的時候如果是一條鏈它越在底端答案一定更優。然後考慮合併的時候發現還需要盡量讓剩下的最大長度變得更大。在這個地方按照長度排序然後每個長度找最小的可行的配對。

#includeusing namespace std;

const int n=5e4+5,m=1e5+5;

int n,m,cnt,hed[n],to[m],nxt[m],val[m];

void adde(int u,int v,int w)

int mxp[n],f[n];

int stk[n],top,stk2[n],top2;

bool vis[n];

inline void dfs(int x,int pre,int len)

top=0;

int dpsum=0;

for(int i=hed[x];i;i=nxt[i])

if(top)

int main()

printf("%d",l);

}

判環dfs可以n方,然而被卡常。

懶得掛**了。咕咕咕

不會。咕咕咕

動態dp來著。。

存個2*2矩陣(0/1,0/1)表示當前的下面取0/1,上面取0/1的貢獻,然後就可以倍增了。相見**

#includeusing namespace std;

const int n=1e5+5,m=2e5+5;

int n,m;char s[5];

int hed[n],to[m],nxt[m],cnt;

typedef long long ll;

const ll inf=1ll<<60;

void adde(int u,int v)

int fa[n][20],dep[n];

ll p[n];

ll f[n][2],g[n][2];//g表示去掉當前子樹。

ll dp[n][20][2][2];

void dfs(int x,int fa,int d)

}void dfs_2(int x)

}template inline void read(t& a)

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

a*=flag;return;

}inline void init()

for(int i=1;(1<>st;

ll solve(int x,int a,int y,int b)

tx[0]=nx[0],tx[1]=nx[1],x=fa[x][i];}}

if(x==y)

return tx[b]+g[x][b];

for(int i=19;~i;i--)

}tx[0]=nx[0],tx[1]=nx[1],x=fa[x][i];

ty[0]=ny[0],ty[1]=ny[1],y=fa[y][i];}}

int lca=fa[x][0];

ll ans0=f[lca][0]-f[x][1]-f[y][1]+tx[1]+ty[1]+g[lca][0];

ll ans1=f[lca][1]-min(f[x][0],f[x][1])-min(f[y][0],f[y][1])+min(tx[0],tx[1])+min(ty[0],ty[1])+g[lca][1];

return min(ans0,ans1);

}int main()

dfs(1,0,1);dfs_2(1);

init();

while(m--)

return 0;

}

NOIp 2018 旅行 題解

題目傳送門 題目大意 現在有一棵樹或一張只有乙個環的圖 連通 要求遍歷一遍這個圖,遍歷的順序即為乙個長度為 n nn 的序列,要求字典序最小的序列。假如是一棵樹的話,顯然貪心即可,從 1 11 出發,每次往編號小的走就好了。假如只是多一條邊的話,列舉刪掉那一條邊,然後變成一棵樹來做。因為每次都要往編...

競賽題解 NOIP2018 旅行

坑還得一層一層的填 填到day2t1了洛谷 p5022 以下copy自洛谷,有刪減 修改 小 y 是乙個愛好旅行的 oier。她來到 x 國,打算將各個城市都玩一遍。小y了解到,x國的 n 個城市之間有 m 條雙向道路。每條雙向道路連線兩個城市。不存在兩條連線同一對城市的道路,也不存在一條連線乙個城...

競賽題解 NOIP2018 賽道修建

額 考試的時候大概猜到正解,但是時間不夠了,不敢寫,就寫了騙分qwq 現在把坑填好了 copy from 洛谷 c 城將要舉辦一系列的賽車比賽。在比賽前,需要在城內修建 m 條賽道。c 城一共有 n 個路口,這些路口編號為 1,2,n 有 n 1 條適合於修建賽道的雙向通行的道路,每條道路連線著兩個...