沒什麼好說的,不講了
很後悔的是其實考場上不僅想出了正解的方程,甚至連優化都想到了,卻因為碼力不足只打了\(o(n^2)\)暴力,甚至還因為細節掛成了\(40\ pts\)
以後還是應該多寫一下碼農題
規定一下,下面的\(j\)沒有特殊說明,取值範圍預設在\(1, i - 1\)
考慮什麼情況是合法的,首先最後對答案有貢獻的元素組成的序列一定是嚴格上公升的,即\(a_i > a_j\)
然後考慮還有沒有別的限制呢
放乙個圖
看到我們的對答案有貢獻的序列和其對應的座標的連邊一定是乙個越來越傾斜(並且逆時針旋轉)的過程,思考一下為什麼,發現如果不滿足前面那個條件的話實際上是沒法通過題目的變換方法得到最終對應的序列
舉個例子
1 2 3 5 2
其中的3和5並不能同時對答案作出貢獻
所以又有了乙個限制條件\(i - a[i] > = j - a[j]\)
看一下兩個條件\[a_i > a_j\]
\[i - a[i] > = j - a[j]\]
發現是乙個二維偏序
考慮一維一維的處理,先按第乙個條件排一下序,然後在排序後的序列上處理後面那個條件,樹狀陣列維護一下
#include#define n (100000 + 10)
#define lowbit(x) (x & (-x))
using namespace std;
inline int read()
while (isdigit(c))
return cnt * f;
}int n, tot, w, ans, gmax, bit[n];
void modify(int x, int g)
int query(int x)
struct node a[n];
bool cmp(node a, node b)
int main()
sort (a + 1, a + tot + 1, cmp);
for (register int i = 1; i <= tot; ++i) printf("%d\n", ans);
return 0;
}
感覺題解很好理解,但就是想不到
先說一下演算法流程
分別按\(x\)排乙個序,\(y\)排乙個序,然後相鄰的連上邊,跑最短路即可
說一下為什麼是正確的
首先\(min(|x[i] - x[j]|, |y[i] - y[j]|)\)這個條件是完全不用考慮的,因為最短路本身就是找\(min\)的過程,就算兩條邊都連上也可以得到正確答案
考慮\(o(n^2)\)暴力,即每個點往其他所有點連邊,然後這樣顯然跑不動
怎麼優化呢
上面那個演算法很巧妙的一點是,因為我們排過序了,所以兩個點之間的連邊一定已經是不可以分拆的最小單位了,並且用這些最小單位邊一定可以組成其他的邊,相當於去除了暴力連邊中的重複資訊,於是複雜度優化為\(o(nlog(n))\)
#include#define n (1001000 + 10)
using namespace std;
inline int read()
while (isdigit(c))
return cnt * f;
}int n, z;
struct node a[n];
bool cmp(node a, node b)
bool cmp2(node a, node b)
int first[n], nxt[n << 1], to[n << 1], w[n << 1], tot;
long long d[n];
bool vis[n];
void add(int x, int y, int z)
priority_queue < pair> q;
void dijkstra() }}
}int main()
sort (a + 1, a + n + 1, cmp2);
for (register int i = 1; i < n; ++i) {
int z = a[i + 1].y - a[i].y;
// cout<
2019 10 17 CSP模擬 總結
沒什麼好說的,不講了 很後悔的是其實考場上不僅想出了正解的方程,甚至連優化都想到了,卻因為碼力不足只打了 o n 2 暴力,甚至還因為細節掛成了 40 pts 以後還是應該多寫一下碼農題 規定一下,下面的 j 沒有特殊說明,取值範圍預設在 1,i 1 考慮什麼情況是合法的,首先最後對答案有貢獻的元素...
CSP3 模擬總結
這道題目在考試中是沒有做出來的,感覺自己的思維水平還是差一些,對於這道題而言,對於一些規則的理論性的演算法考察的並不多,主要是乙個思維上的擴散,總體來說自己在做題過程中有些思維固化。一開始見到這個題目的時候,感覺這是一道dp問題,但嘗試了很多,總是有漏洞存在,於是便採用了一種暴力的n2的方法,但顯然...
csp模擬補題
咕咕東是個貪玩的孩子,有一天,他從上古遺跡中得到了乙個神奇的圓環。這個圓環由字母表組成首尾相接的環,環上有乙個指標,最初指向字母a。咕咕東每次可以順時針或者逆時針旋轉一格。例如,a順時針旋轉到z,逆時針旋轉到b。咕咕東手裡有乙個字串,但是他太笨了,所以他來請求你的幫助,問最少需要轉多少次。解題過程 ...