2017 10 29離線賽總結

2021-08-10 00:01:33 字數 3208 閱讀 2936

思路:強模擬…

思路:暴力分還是挺多的,s=t,w=0,s=1,t=1,list時,滿打滿算還有80分,但功底還是差了點啊,實際上s=1,t=1時,暴力會超時,也就是說必須要用正解了。

仔細理解題意,乙個玩家從a 到 b, 沿途到達點的時間為0,1,2,…,b-a,而每個點的觀察員只在wi時觀察,也就是說,若想要被觀察員觀察到,就必須是

wi+i 或 wi-i,那麼這個就有點像樹上差分了。

#include

#define rep(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)

#define drep(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)

#define ll long long

#define inf 0x3f3f3f3f

#define n 300005

using

namespace

std;

int n,m;

struct nodea[n];

vector

e[n],vis[n];

int w[n],ans[n],sum[n];

int d[n],fa[n],top[n],sz[n],son[n];

struct p1

}p1;

struct p2else

}rep(i,1,n)

rep(j,0,vis2[i].size()-1)

if (i-w[i]>=1) ans[i]+=sum1[i-w[i]];

if (i+w[i]<=n) ans[i]+=sum2[i+w[i]];

}rep(i,1,n-1)printf("%d ",ans[i]);

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

}}p2;

struct p3

rep(i,0,vis[x].size()-1)sum[a[vis[x][i]].s]++;

if(d[x]-w[x]>0)ans[x]+=sum[d[x]-w[x]];

}void solve()

}p3;

struct p4

for (int i=0;i<(int)vis[x].size();i++)sum[d[a[vis[x][i]].s]]++;

if (d[x]+w[x]<=n)ans[x]+=sum[d[x]+w[x]];

}void solve()

}p4;

struct p5;

vector

q1[n],q2[n];

int sum1[n],sum2[n*2];

void dfs1(int x,int f)

}void dfs2(int x,int tp)

}int lca(int a,int b)

rep(i,0,q1[x].size()-1)

rep(i,0,q2[x].size()-1)

if(d[x]+w[x]<=n)ans[x]+=sum1[d[x]+w[x]];

ans[x]+=sum2[d[x]-w[x]+n];

}void solve());

q1[a[i].lca].push_back((node));

q2[a[i].t].push_back((node));

q2[fa[a[i].lca]].push_back((node));

}dfs(1,0);

rep(i,1,n)printf("%d ",ans[i]);

puts("");

}}p5;

int main()

rep(i,1,n)scanf("%d",&w[i]);

rep(i,1,m)scanf("%d%d",&a[i].s,&a[i].t);

if(n==991 || n==992)p1.solve();// s=t w=0

else

if(n==99994)p2.solve();// list

else

if(n==99995)p3.solve();// s=1

else

if(n==99996)p4.solve();// t=1

else p5.solve(); // ac code

return

0;}

思路:這題的暴力分也不少…,m=0,1,2時,滿打滿算也有68分(不贅述了),而正解顯然是dp,但這裡是期望dp。

#include

#define rep(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)

#define drep(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)

#define ll long long

#define db double

#define n 2005

using namespace std;

int n,m,v,e;

int c[n],d[n];

db inf,p[n],dis[n][n],dp[n][n][2],ans;

void floyd()

struct p2

printf("%.2lf\n",tot);

}}p2;

struct p3

}printf("%.2lf\n",tot);

}}p3;

struct pac

if(dp[i][j][1]!=inf)

}rep(i,0,m)ans=min(ans,min(dp[n][i][0],dp[n][i][1]));

printf("%0.2lf\n",ans);

}}p100;

int main()

floyd();

rep(i,2,n)ans+=dis[c[i-1]][c[i]];

if(!m)printf("%.2lf\n",ans);

else

if(m==1)p2.solve();

else

if(m==2 && n<10)p3.solve();

else p100.solve();

}

小結:去年的暴力分真心是多,100+35+68=203,而其中第2題s=1,t=1稍微想想應該也就有45…看來**的功底還有待提高呀…

2017 7 29 離線賽 總結

本著貪心的思想,我先斜著走到頂,然後直走到終點,顯然這是最優的,但是我忽視了斜著走的最後一步可以和直著走的第一步合併,我錯誤地把兩個過程分開了。假如我當時多找幾組資料來模擬說不定能找到這個錯誤,我也沒敲個暴力來對拍 因為暴力太長了 我得到的教訓是 不能肯定自己演算法的正確性是,不如敲個暴力對拍一下,...

離線賽20171006總結

這次考得還不錯,頗有些遺憾的是因為第一題我離正解已經很近了,可惜考試畢竟是考試,一開始的題目看錯沒看到相鄰的條件浪費了很多時間,到後來就沒有時間去寫正解了。這畢竟也是一種實力,不能說題目看錯失誤問題就不大。上次的考試兩個輸出只能模乙個沒看到導致少了70分。這種失誤還是太低階了,也太致命了。這種題目看...

2017 10 7離線賽總結

失分小結 估分 玄學 實際分數 300 收穫 寫題前仔細分析題目,好好思考 考試過程 第一題真的想不到,只好打個表,結果由於資料半天沒輸出來,心態 有前前後後折騰了半個小時 第二題先是打了個n n暴力,又調了半天,這時考試只剩下兩個小時 第三題思考了大約十分鐘,然後想到了正解,實現比較快,乙個小時就...