日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EZ 2018 07 06 NOIP模拟赛

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EZ 2018 07 06 NOIP模拟赛 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

又是慈溪那邊給的題目,這次終于沒有像上次那樣尷尬了,

T1拿到了較高的暴力分,T2沒寫炸,然后T3寫了一個優雅的暴力就203pts,Rank3了。

聽說其它學校的分數普遍100+,那我們學校還不是強到飛起。

裝備(equipment.pas/cpp/c)

這題目出的真心長,讓我聯想到我們語文老師說的:

以后教育改革可能不只是語文,其他學科的考試題目字數都要顯著增加了,到時后數學大題你看都看不完。

原來連OI的題目都有這種趨勢。

我們精簡題意后發現:給你兩段序列,求兩兩乘積的第\(k\)大值。

然后瞄一眼數據范圍,然后我就想到了一種經典的的解決方法。

先排序,然后把所有的\(a_i\cdot b_1\)的值都扔到大根堆里,然后每次取出最大的值之后就把\(b_i\)的下標變成\(i+1\)再乘起來扔回去即可。

復雜度是\(O(q\cdot k\ log\ k)\)的,肯定會炸。

這里給出堆的代碼(至于又開了小根堆是為了在\(k\)\((b-a+1)(r-l+1)-k+1\)中取一個較小的)

53ptsCODE

#include<cstdio> #include<cctype> #include<algorithm> #include<queue> using namespace std; const int N=255,M=100005; int n,m,a[N],b[M],c[N],d[M],q,opt,L,R,l,r,k; struct Small {int x,y,s;bool operator <(const Small a) const { return a.s<s; } }; struct Big {int x,y,s;bool operator <(const Big a) const { return a.s>s; } }; priority_queue <Small> small; priority_queue <Big> big; inline char tc(void) {static char fl[100000],*A=fl,*B=fl;return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++; } inline void read(int &x) {x=0; char ch; while (!isdigit(ch=tc()));while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); } inline void write(int x) {if (x>9) write(x/10);putchar(x%10+'0'); } inline void copy(void) {register int i;for (i=l;i<=r;++i)c[i-l+1]=a[i];for (i=L;i<=R;++i)d[i-L+1]=b[i]; } inline bool small_cmp(int a,int b) {return a<b; } inline bool big_cmp(int a,int b) {return a>b; } inline void Big_solve(int k) {sort(c+1,c+r-l+2,big_cmp); sort(d+1,d+R-L+2,big_cmp);while (!big.empty()) big.pop();for (register int i=1;i<=r-l+1;++i)big.push((Big){i,1,c[i]*d[1]});for (;;){Big now=big.top(); big.pop();if (!(--k)) { write(now.s); putchar('\n'); return; }if (now.y^(R-L+1)) big.push((Big){now.x,now.y+1,c[now.x]*d[now.y+1]});} } inline void Small_solve(int k) {sort(c+1,c+r-l+2,small_cmp); sort(d+1,d+R-L+2,small_cmp);while (!small.empty()) small.pop();for (register int i=1;i<=r-l+1;++i)small.push((Small){i,1,c[i]*d[1]});for (;;){Small now=small.top(); small.pop();if (!(--k)) { write(now.s); putchar('\n'); return; }if (now.y^(R-L+1)) small.push((Small){now.x,now.y+1,c[now.x]*d[now.y+1]});} } int main() {freopen("equipment.in","r",stdin); freopen("equipment.out","w",stdout);register int i; read(n); read(m);for (i=1;i<=n;++i) read(a[i]);for (i=1;i<=m;++i) read(b[i]); read(q);while (q--){read(opt); read(l); read(r); read(L);if (opt){read(R); read(k); int tot=(r-l+1)*(R-L+1); copy();if (k<tot-k+1) Big_solve(k); else Small_solve(tot-k+1);} else{if (l) b[r]=L; else a[r]=L;}}return 0; }

其實這是一個經典的模板(我怎么沒聽說過),我們首先二分答案\(x\),然后對于其中一個數組排序。

之后對于另一個數組中的所有數只需要再次二分統計個數即可。

主要還是一個套路題。

CODE

#include<cstdio> #include<cctype> #include<algorithm> using namespace std; const int N=255,M=100005; int n,m,a[N],b[M],c[M],q,opt,L,R,l,r,k; inline char tc(void) {static char fl[100000],*A=fl,*B=fl;return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++; } inline void read(int &x) {x=0; char ch; while (!isdigit(ch=tc()));while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); } inline void write(int x) {if (x>9) write(x/10);putchar(x%10+'0'); } inline bool cmp(int a,int b) {return a>b; } inline void copy(void) {register int i;for (i=L;i<=R;++i)c[i-L+1]=b[i]; sort(c+1,c+R-L+2,cmp); } inline int check(int x) {int rk=0;for (register int i=l;i<=r;++i){int l_=1,r_=R-L+1;while (l_<=r_){int mid=l_+r_>>1;if (c[mid]*a[i]<x) r_=mid-1; else l_=mid+1;}rk+=r_;}return rk; } inline void solve(void) {int l=1,r=2e9;while (l<=r){int mid=(r-l>>1)+l;if (check(mid)<k) r=mid-1; else l=mid+1;}write(r); putchar('\n'); } int main() {freopen("equipment.in","r",stdin); freopen("equipment.out","w",stdout);register int i; read(n); read(m);for (i=1;i<=n;++i) read(a[i]);for (i=1;i<=m;++i) read(b[i]); read(q);while (q--){read(opt); read(l); read(r); read(L);if (opt) read(R),read(k),copy(),solve(); else l?b[r]=L:a[r]=L;}return 0; }

又見食物鏈(chain.pas/cpp/c)

經典水題,據說是NOI的題目。良心簽到不解釋

對于這種層級分明的關系,考慮拓撲+DP轉移。

我們令\(f_i\)表示以\(i\)結尾的食物鏈的條數,發現轉移時:

\(f_{son[i]}+=f_i\)

然后寫一個拓撲轉移即可,最后對于出度為\(0\)的點進行特判即可。

但是注意一點:單節點不構成食物鏈

CODE

#include<cstdio> #include<cctype> #include<cstring> using namespace std; const int N=100005; struct edge {int to,next; }e[N<<1]; int head[N],in[N],out[N],q[N],n,m,x,y,cnt; unsigned long long f[N],ans; inline char tc(void) {static char fl[100000],*A=fl,*B=fl;return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++; } inline void read(int &x) {x=0; char ch; while (!isdigit(ch=tc()));while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); } inline void add(int x,int y) {e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt; } inline void reset(int now) {for (register int i=head[now];i!=-1;i=e[i].next)++f[e[i].to]; } inline void top_sort(void) {register int i; int H=0,T=0;for (i=1;i<=n;++i)if (!in[i]) q[++T]=i,reset(i);while (H<T){int now=q[++H];for (register int i=head[now];i!=-1;i=e[i].next){f[e[i].to]+=f[now];if (!(--in[e[i].to])) q[++T]=e[i].to;}} } int main() {freopen("chain.in","r",stdin); freopen("chain.out","w",stdout);register int i; read(n); read(m);memset(head,-1,sizeof(head)); memset(e,-1,sizeof(e));for (i=1;i<=m;++i){read(x); read(y);add(x,y); ++in[y]; ++out[x];}for (top_sort(),i=1;i<=n;++i)if (!out[i]) ans+=f[i];return printf("%lld",ans),0; }

OJ 中的目錄 (oj.pas/cpp/c)

我去題目怎么又是那么長。

但是讀懂題意之后你就會發現,這道題就是NOI2010 超級鋼琴的樹上版本。

對于超級鋼琴,不會的同學可以看一下sol,這里就不再贅述。

然后在樹上怎么弄,很簡單的套路倍增。

考慮維護兩個東西\(father_{i,j}\)表示\(i\)向上\(2^j\)個點的節點,\(f_{i,j}\)同理,表示的是最大值。

然后我們確定這條鏈下方的點,那么對于上面的點就要求\(sum_{father_{i,0}}\)最小了。還是倍增\(log\)級別解決。

后面的堆等操作大同小異,其實關于樹的題目倍增真的很萬能。

CODE

#include<cstdio> #include<cctype> #include<queue> using namespace std; const int N=500005,P=25; int n,m,l,r,sum[N],father[N][P],dep[N]; long long ans; struct data {int s,l,r,t;bool operator <(const data x) const { return sum[x.s]-sum[father[x.t][0]]>sum[s]-sum[father[t][0]]; } }; struct RMQ {int x,num; }f[N][P]; priority_queue<data> big; inline char tc(void) {static char fl[100000],*A=fl,*B=fl;return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++; } inline void read(int &x) {x=0; char ch; int flag=1; while (!isdigit(ch=tc())) flag=ch^'-'?1:-1;while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); x*=flag; } inline int min(int a,int b) {return a<b?a:b; } inline void RMQ_init(void) {register int i,j;for (j=1;j<P;++j)for (i=1;i<=n;++i)father[i][j]=father[father[i][j-1]][j-1];for (j=1;j<P;++j)for (i=1;i<=n;++i)if (dep[i]>=1<<j) f[i][j]=f[i][j-1].x<f[father[i][j-1]][j-1].x?f[i][j-1]:f[father[i][j-1]][j-1]; } inline int getfa(int x,int y) {for (register int i=P-1;i>=0;--i)if (y&(1<<i)) x=father[x][i];return x; } inline int getmin(int x,int y) {RMQ MIN=f[x][0];for (register int i=P-1;i>=0;--i)if (dep[father[y][i]]>=dep[x]) MIN=MIN.x<f[y][i].x?MIN:f[y][i],y=father[y][i];return MIN.num; } int main() {freopen("oj.in","r",stdin); freopen("oj.out","w",stdout);register int i; read(n);for (i=1;i<=n;++i) read(father[i][0]);for (i=1;i<=n;++i) {read(sum[i]); sum[i]+=sum[father[i][0]]; dep[i]=dep[father[i][0]]+1; f[i][0]=(RMQ){sum[father[i][0]],i};}read(m); read(l); read(r); RMQ_init();for (i=1;i<=n;++i)if (dep[i]>=l){int L=getfa(i,min(r-1,dep[i]-1)),R=getfa(i,l-1);big.push((data){i,L,R,getmin(L,R)});}while (m--){data now=big.top(); big.pop(); ans+=sum[now.s]-sum[father[now.t][0]];if (now.l^now.t) big.push((data){now.s,now.l,father[now.t][0],getmin(now.l,father[now.t][0])});if (now.r^now.t) {int next=dep[now.s]-dep[now.t]; next=getfa(now.s,next-1);big.push((data){now.s,next,now.r,getmin(next,now.r)});}}return printf("%lld",ans),0; }

轉載于:https://www.cnblogs.com/cjjsb/p/9278025.html

總結

以上是生活随笔為你收集整理的EZ 2018 07 06 NOIP模拟赛的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩一区二区三区在线观看视频 | 黑人黄色片 | 中文字幕在线视频一区二区 | 免费黄色成人 | 大陆极品少妇内射aaaaaa | 欧美性生活视频 | 日本做爰高潮又黄又爽 | 成年网站免费在线观看 | 国产精品成人无码免费 | 久久99精品久久久久久琪琪 | 冈本视频在线观看 | 巨胸喷奶水www久久久免费动漫 | 特大黑人娇小亚洲女 | 国产一区二区视频在线观看 | 国产乱码精品一区二区三区亚洲人 | 日韩精品电影一区二区三区 | 精品人妻无码一区二区三区换脸 | 老湿机69福利 | 修仙淫交(高h)h文 | 91精品国产99久久久久久 | 无码国产精品一区二区免费16 | 国精产品一区一区三区有限公司杨 | 国产三级视频在线 | 欧美精品区 | 奇米亚洲 | 久草网在线| 拔插拔插海外华人永久免费 | 青青伊人网| 国产精品精品视频 | 奇米影视999 | 欧美精品性生活 | 先锋资源一区二区 | 最近最好的2019中文 | 日韩性xxxx | 女十八毛片 | 国产睡熟迷奷系列精品视频 | 91涩涩视频 | 天堂网资源 | 超碰在线进入 | 国产视频一区二区三区四区 | 亚洲第1页 | 久久综合久久鬼色 | 久久综合成人网 | 欧美老女人性视频 | 天堂av2021| 婷婷激情在线 | 少妇人妻偷人精品视频蜜桃 | 老公吃小头头视频免费观看 | 中文毛片无遮挡高潮免费 | 亚洲视频一二三区 | 亚洲成av人片一区二区梦乃 | 日本一区中文字幕 | 亚洲国产精品无码久久久久高潮 | 欧美成人小视频 | 少妇无码一区二区三区 | 国产性猛交普通话对白 | 免费的性爱视频 | 黄网站免费大全入口 | 久久久一二三四 | 国产女人18毛片水真多18精品 | 国产理论精品 | 91丝袜一区二区三区 | 色网址在线观看 | 亚洲中文字幕一区二区 | 久草免费在线色站 | 久操视频免费 | 亚洲视频在线观看网站 | 国产乱码精品一区二区三区忘忧草 | 97超碰人人在线 | 久久爱伊人 | 国产精品啊啊啊 | 国产+高潮+白浆+无码 | av一区在线观看 | 久久aaa| 精品国产理论 | 亚洲欧美一区二区三区四区 | 96福利视频 | 日本高清网站 | 天堂av一区 | 色www亚洲国产张柏芝 | free性娇小hd第一次 | 久久这里都是精品 | 精品久久久久久久久久久久久久久 | 中文字幕乱码在线人视频 | 激情视频免费观看 | 国产人妖ts | 天天天综合网 | 视频一区二区在线 | 亚洲欧美精品一区 | 国产精品久久久久一区二区 | 亚洲精品激情视频 | 99久久99| 国产911| 欧美va视频 | 国产亚洲AV无码成人网站在线 | 极度诱惑香港电影完整 | 免费看黄色大片 | 人妻精品久久久久中文字幕 | 久久香蕉精品视频 |