NOIP模擬賽D2T1自己的解題思路
阿新 • • 發佈:2018-11-08
T1題目在此:
數軸上有n個球,每個球直徑為1,第 ii 個球的左端點為pi即佔據了數軸上[pi,pi+1][pi,pi+1])。在 P位置有一堵牆。
有q個操作,每次要麼以x位置為左端點放一個新球(如果有了就不管),
要麼把最左邊的球往右推。一個球碰到另一個的時候,舊球停下來,新球繼續滾。球碰到牆的時候就停下來。
最後你需要輸出所有球的位置。
然後開始想:我的媽這不是一道水題麼;然後用筆推算了一陣子,得出自己的結論:
連結串列可以快速插入一個元素; 為了快速放入元素,使用二分查詢法,因為連結串列在未連線之前已排好序,找到之後插入; 操作2直接讓其右端點等於下一個的左端點即可,在連結串列最後一位的必定撞牆
然後突然發現自己不會寫連結串列QAQ,涼了
於是打暴力QAQ絕對不滿分,還可能爆零的那種(\\\A\\\)
#include<iostream> #include<algorithm> using namespace std; const int N=500010; struct ball{ double l,r; ball *next; }b[N]; int n,q,p; int pp=0; bool cmp(ball b1,ball b2); void insertball(int l,int r,int x); void simulate();int main() { cin>>n>>q>>p; for(int i=1;i<=n;i++) { cin>>b[i].l; b[i].r=b[i].l+1; } sort(b+1,b+1+n,cmp); for(int i=1;i<=q;i++) { int t; cin>>t; switch(t) { case 1:int x; cin>>x; pp++; b[n+pp].l=x; b[n+pp].r=x+1; sort(b+1,b+1+n+pp,cmp); break; case 2: simulate(); break; } } for(int i=1;i<=n+pp;i++) { cout<<b[i].l<<" "; } cout<<endl; return 0; } bool cmp(ball b1,ball b2) { return b1.r<b2.r; } void simulate() { for(int i=1;i<=n+pp-1;i++) { b[i].r=b[i+1].l; b[i].l=b[i].r-1; } b[n+pp].r=p; b[n+pp].l=p-1; }
等我找到了正解之後再扔上來QwQ