1. 程式人生 > >NOIP模擬賽D2T1自己的解題思路

NOIP模擬賽D2T1自己的解題思路

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