国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

CF#398(Div.2) 解題報告

2019-11-08 02:38:36
字體:
供稿:網(wǎng)友

A

題意簡述

有n個大小為1..n的物品,每一天會得到一個,物品必須由下而上按照從大到小的順序擺放 每一天會將已有的物品盡量擺放,問這n天的擺放方案

數(shù)據(jù)范圍

1≤n≤100000

題解

只有一個物品只有當(dāng)比它大的所有物品都得到時才能擺放 模擬即可

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<queue>#include<ctime>#include<cmath>#include<map>using namespace std;#define N 100005int n,x,now;bool vis[N];int main(){ scanf("%d",&n); now=n; for (int i=1;i<=n;++i) { scanf("%d",&x); vis[x]=1; while (vis[now]) B

題意簡述

接待處服務(wù)時間為0點之后ts~tf-1,每一個人需要的服務(wù)時間為t 有一些人在某一個時刻來并且排隊 V也會在某一個時間來,如果這個時間也有別人來,他會排在這些人的后面 求V的最小等待時間

數(shù)據(jù)范圍

0≤n≤100000,ts,tf,t≤1012

題解

首先判斷服務(wù)是否有斷層,如果有的話即在那個時刻來 如果沒有斷層,枚舉V在哪一個時間點來,有價值的時間點只有n個時間點以及兩個時間點之間的斷點 預(yù)處理時間點ai來的人需要辦理服務(wù)到什么時間 注意n=0需要特判 算是貪心吧

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<queue>#include<ctime>#include<cmath>#include<map>using namespace std;#define LL long long#define N 100005const LL inf=1e18;int n,Max;LL s,t,l;LL now,a[N],ed[N],ans,ansp;int main(){ scanf("%I64d%I64d%I64d",&s,&t,&l);--t; scanf("%d",&n); if (!n) {printf("%I64d/n",s);return 0;} for (int i=1;i<=n;++i) scanf("%I64d",&a[i]); now=s;Max=n; for (int i=1;i<=n;++i) { if (a[i]<=now) now+=l,ed[i]=now-1; else {printf("%I64d/n",now);return 0;} if (now>t-l+1) {Max=i;break;} } if (ed[Max]<t-l+1) {printf("%I64d/n",ed[Max]+1LL);return 0;} ans=inf; for (int i=Max-1;i>=1;--i) if (a[i]==a[i+1]) ed[i]=max(ed[i],ed[i+1]); if (a[1]>0) { now=s-(a[1]-1LL); if (now<ans) ans=now,ansp=a[1]-1LL; } for (int i=1;i<=Max;++i) { if (ed[i]<t-l+1) { now=ed[i]+1LL-a[i]; if (now<ans) ans=now,ansp=a[i]; } if (i==Max||a[i+1]-a[i]<=1LL) continue; else { now=ed[i]+1LL-(a[i+1]-1LL); if (now<ans) ans=now,ansp=a[i+1]-1LL; } } printf("%I64d/n",ansp); return 0;}

C

題意簡述

一棵有根樹每一個節(jié)點有一個權(quán)值 需要將這棵樹斷開兩條邊變成三棵樹,并滿足三棵樹的權(quán)值和相等 無解-1 注意:只能將某一個節(jié)點與其父親相連的那條邊斷開

數(shù)據(jù)范圍

3≤n≤106,?100≤ti≤100

題解

首先總權(quán)值和被3整除 可以滿足條件的只有兩種情況 1、兩棵子樹權(quán)值和為sum3,并且互不包含 2、一棵子樹權(quán)值和為2?sum3,一棵子樹權(quán)值和為sum3并且前者包含后者 dfs即可

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<queue>#include<ctime>#include<cmath>#include<map>using namespace std;#define N 1000005int n,fa,root,sum,id;int tot,point[N],nxt[N],v[N];int size[N],ans[5];bool pd,flag[N];void add(int x,int y){ ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}void findse(int x){ for (int i=point[x];i;i=nxt[i]) { if (size[v[i]]==sum/3) { ans[2]=v[i]; printf("%d %d/n",ans[1],ans[2]); exit(0); } findse(v[i]); }}void findsy(int x){ if (pd) return; if (size[x]==sum/3) { ans[++id]=x; pd=1; return; } for (int i=point[x];i;i=nxt[i]) findsy(v[i]);}void dfs(int x){ int cnt=0; for (int i=point[x];i;i=nxt[i]) { dfs(v[i]); size[x]+=size[v[i]]; if (flag[v[i]]) ++cnt; } if (cnt>=2) { id=0; for (int i=point[x];i;i=nxt[i]) if (flag[v[i]]) { pd=0; findsy(v[i]); if (id==2) break; } printf("%d %d/n",ans[1],ans[2]); exit(0); } if (x!=root&&(cnt||size[x]==sum/3)) flag[x]=1; if (x!=root&&size[x]==sum/3*2&&flag[x]) { ans[1]=x; findse(x); }}int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) { scanf("%d%d",&fa,&size[i]); sum+=size[i]; if (fa) add(fa,i); else root=i; } if (sum%3!=0) {puts("-1");return 0;} dfs(root); if (ans[1]&&ans[2]) printf("%d %d/n",ans[1],ans[2]); else puts("-1");}

一點總結(jié)。。。

感覺最近各種傻逼→_→ ①認真讀題!認真看數(shù)據(jù)范圍!尤其是極限的情況(不光包括上界也包括下界) ②要認真想不合法的情況,加特判 ③想清楚再寫,非常麻煩的題不要慌,一點一點寫


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黎川县| 甘孜县| 巴东县| 斗六市| 德格县| 景谷| 民勤县| 锦州市| 蓬溪县| 沁水县| 邢台市| 潞城市| 四子王旗| 阜阳市| 博兴县| 富裕县| 新绛县| 五华县| 鄂托克前旗| 渝中区| 英超| 沛县| 乌苏市| 新郑市| 紫阳县| 上虞市| 安龙县| 辽阳县| 化德县| 分宜县| 耒阳市| 阆中市| 濮阳市| 宁强县| 鹤峰县| 宁晋县| 元谋县| 资阳市| 马公市| 体育| 宁武县|