西南科技大學第十三屆程式設計競賽賽後總結

2021-09-18 09:13:11 字數 4070 閱讀 4079

這次的校賽沒有能延續之前的傳統體驗到封榜後過題的快樂…… ——是有原因的

117分鐘的時候,我們就已經過了7道題了,那之後我們就是在盲目目的地尋找著下一道可以做的題了,或許這就是沒人帶榜的尷尬所在了吧,然後我們就開始分題,我拿了b、h題(因為看上去像是資料結構),然後gyf去看了g,zxd開了k,因為那是道莫比烏斯問題,然後我們就開始各自開了,gyf先有了思路,跟我說了一番之後,覺得利用單調棧維護的分塊可以去搞g,然後我們就先開了g,利用乙個o(n*sqrt(n))的分塊去寫,寫完之後再去看了下在跳入不同的塊的時候一些小bug,然後過了我們手動的測試樣例,交……t3,於是乎就大致知道,還是被卡了,這個方法不行,列印出來好好想想再做吧。

然後我上手去敲b,b題就是乙個求樹的中心然後再從樹的中心出發,選取(k-1)個點的求聯通塊出發達到的最遠距離最小的這樣乙個問題,**量有點大,然後我又沒有聽隊友的話去敲樹的直徑的模版,而是想更快的求出樹的中心,然後自己想了個樹鏈剖分的兩個dfs()的做法,這也是自己給自己埋坑了,封榜前20分鐘的時候開始敲這道題,大致在封榜後20分鐘不到的時候就敲完了這道題,然後就是去想辦法debug,從後往前的看,發現優先佇列那塊並沒有寫錯,然後再去找,發現樹的中心沒有求對,然後我根據我的思路不斷的去debug,這時候,發現在往下走的時候,可能不是已經求得完全的最遠距離值,中心點找錯了,這時候,賽場那頭,有個跟我們一樣過了7題的隊伍過了第8個題…… 開始有些些焦慮了吧,需要靜下來好好想想,喝了杯水,抓緊時間去廁所洗了個臉,回來繼續debug。時間就這樣一分一秒的流逝,逐漸的發現我這樣的去求樹的中心遠沒有先求樹的直徑再求樹的中心來的方便,還剩10分鐘…… 盡力改回來吧,但是或許自己也知道最後是無力回天了。

一意孤行成了最後沒能過第八題的最大的因果,這時候其實應該跟隊友有更多的交流,是這次的教訓,賽後花了大概兩個小時的時間去敲了b、g兩道題,很快的就寫了出來,而求g還要比標程快了乙個logn的倍數。

這次的院賽是乙個很好的經驗教訓,我們各自都從這次的比賽中吸取到了自己的教訓,也有了自己的收穫吧,去更多的相信隊友,去在更加合適的時機去做更加正確的敲手,在發現bug以及找出自己演算法的優劣勢上還需要更多的經驗教訓,總之,下個月的校賽,加油!

#include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )

#define pi 3.141592653589793

#define e 2.718281828459045

#define esp 1e-6

#define inf 0x3f3f3f3f3f3f3f3f

#define half (l + r)>>1

#define lsn rt<<1

#define rsn rt<<1|1

#define lson lsn, l, mid

#define rson rsn, mid+1, r

#define ql lson, ql, qr

#define qr rson, ql, qr

#define myself rt, l, r

using namespace std;

typedef unsigned long long ull;

typedef long long ll;

const int maxn = 1e5 + 7;

int n, k, head[maxn], cnt;

struct eddge

}edge[maxn<<1];

inline void addeddge(int u, int v, ll w)

int a, b;

ll maxx;

inline void dfs_b(int u, int fa, ll val)

for(int i=head[u], v; ~i; i=edge[i].nex)

}int fa[maxn];

ll to_fa_dis[maxn];

inline void dfs_a(int u, int up, ll val)

for(int i=head[u], v; ~i; i=edge[i].nex)

}int mid; ll minn;

inline void dfs_mid(int u, ll val)

if(fa[u] == -1) return;

dfs_mid(fa[u], val + to_fa_dis[u]);

}ll dfs_sum_edge(int u, int rt)

return ans;

}struct node

friend bool operator < (node e1, node e2)

};priority_queueq;

bool inque[maxn];

inline void init()

int main()

init();

for(int i=1, u ,v, w; i#include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )

#define pi 3.141592653589793

#define e 2.718281828459045

#define esp 1e-6

#define inf 0x3f3f3f3f3f3f3f3f

#define half (l + r)>>1

#define lsn rt<<1

#define rsn rt<<1|1

#define lson lsn, l, mid

#define rson rsn, mid+1, r

#define ql lson, ql, qr

#define qr rson, ql, qr

#define myself rt, l, r

using namespace std;

typedef unsigned long long ull;

typedef long long ll;

const int maxn = 1e5 + 7;

int n, q, a[maxn], trie[maxn], ans[maxn];

struct question

}op[maxn];

bool cmp(question e1, question e2)

inline void update(int i, int x)

}inline int query(int i)

return ans;

}struct node

};stackst;

int to[maxn]; //上乙個比它大的節點的所在位置,為0就是沒了

int behind[maxn]; //在下乙個比它大的數之前,有幾個數比它小或者等於

inline void init()

int main()

sort(op + 1, op + q + 1, cmp);

init();

to[1] = 0;

st.push(node(1, a[1]));

for(int i=2; i<=n; i++)

else st.pop();

}st.push(node(i, a[i]));

}int l = n, r = n;

for(int q=1; q<=q; q++)

while(l >= op[q].l)

ans[op[q].id] = query(op[q].r) - query(op[q].l - 1);

}for(int i=1; i<=q; i++) printf("%d\n", ans[i]);

}return 0;}/*

19 7

5 7 6 2 6 6 2 7 8

6 95 7

9 91 4

5 94 7

2 9*/

題解與思路均放在超連結中了。

福州大學第十三屆程式設計競賽 重現

problem c 平行四邊形數 accept 71 submit 345 time limit 2000 msec memory limit 32768 kb problem description 在乙個平面內給定n個點,任意三個點不在同一條直線上,用這些點可以構成多少個平行四邊形?乙個點可以同...

西南科技大學21屆新生同步賽 更新中

注意 公式推導n方的前n項和 n n 1 2n 1 6 除法的取餘 逆元 mod必須是乙個素數 include using namespace std typedef long long ll ll ans 0 const ll mod 998244353 ll fast ll a,ll b ret...

第十四屆華中科技大學程式設計競賽決賽同步賽

題意 長度為 n 的序列,沒告訴你具體數是多少。只給出 m 個查詢,表示區間 l,r 的異或和為 k 但是第 i 個查詢如果和前面的查詢有矛盾,那就是錯誤的。輸出所有的錯誤查詢。tags 對於乙個查詢,我們知道 sum r sum l 1 k 建成圖就是 r l 1 但要快速地求出異或值,就要用帶權...