歷年NOI第一題解題報告

2022-09-12 22:51:27 字數 4124 閱讀 2026

由於不會正解,所以只打了暴力,最終得分:50pts

暴力模擬斐波那契數列的操作,加個高精就能過了,但是極其耗費碼力,所以說還是__int128爽。

這一題真沒什麼好說的,noi 出這題就是想讓人打暴力的,考場上正常人誰寫這麼複雜的東西。

由於本題中 m 的大小如果硬乘再模很明顯就會爆掉longlong,所以使用龜速乘法,用加法來代替乘法從而達到不爆longlong的目的。

外加本題中的遞推關係十分明顯,就直接用矩陣快速冪求解,可以十分迅猛的得到答案。

關於乙個向量而言,我們只用維護乙個字首和就可以了,而且我們發現該題的模數是 2 和 3 ,所以在一開始的時候就取模再進行加的操作就可以得到答案了,然後 \(o(d)\) 地掃一遍每個維數的字首,然後掃一遍每個陣列就可以了,整體的時間複雜度是 \(o(nd^2)\) 的,足夠通過本題。

其實用不著。

只用維護兩個量,乙個是 0,乙個是 -1,由於 -1 在二進位制下的數都是 1,所以說操作就是和 0 是反著來的, 貪心的說,如果說能換成1就換,不能換就不換,然後把每一位都跑一遍,就行了。

本題的標號有一點大,所以用離散化來進行查詢,先把 1 的都連起來,然後跑 0 的查詢,用並查集完成以上操作。

code :

#include#include#includeusing namespace std;

const int n = 2e5 + 1;

int n,m;

int f[n];

inline void resetset(const int s)

int findset(const int x)

int a[n];

struct node

}s[n];

inline void input()

inline void work() else

} return void(puts("yes"));

}int main()

}

反正我是用這玩意混過去的,用字串 hash 來判重,列舉a的長度之後,用二分查詢來找到可能的b的可能,然後一起加起來就可以了。

有人說字串hash跑不過去,我還真跑過去了。

#includeusing namespace std;

const int n = 4e4 + 1;

const long long mod = 1e9 + 7;

long long has[n],mo[n],u[n],v[n],ans;

int n;

char ch[n];

inline long long h(int l,int r)

inline void work()

hd = i - pos + 1;

l = 1,r = l,pos = 0;

while(l <= r)

tl = i + pos - 1;

hd = max(hd+l-1,i);

tl = min(tl,i+l-1);

if(hd <= tl)

} }ans = 0;

for(int i = 1; i <= n; i++) u[i] += u[i-1],v[i] += v[i - 1];

for(int i = 1; i < n; i++) ans += v[i] * u[i + 1];

printf("%lld\n",ans);

return;

}int main()

return 0;

}

這個玩意搞了我一整個上午,最後發現是add函式裡面uv寫了兩遍都是u連向v的,真是心態搞炸了。

code:

#include#define gc getchar()

#define rd read()

using namespace std;

const int n = 4e5 + 1;

const int m = 8e5 + 1;

inline long long read()

while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48),ch = gc;

return f ? x : -x;

}//complete

int n,m,cnt;

long long q,k,s;

struct nodee[n << 1];

bool cmp(node a,node b)

int hd[n],nxt[m],to[m],tot;

long long dis[m];//建圖

long long d[n],vis[n],ff[n];//kurskal重構樹

priority_queue>q;//dj

long long mi[n],val[n];

int f[n][23];//倍增

void add(const int u,const int v,const long long dist) //complete

inline void dijstra()

} }return ;

}//complete

int findset(const int x)

void dfs(const int u)

return ;

}void kruskal()

}//kruskal重構樹建圖

dfs(cnt);

}inline void input()

dijstra();

kruskal();

for(int i = 1; (1 << i) <= cnt; i++)

for(int u = 1; u <= cnt; u++)

f[u][i] = f[f[u][i-1]][i-1];

q = rd,k = rd,s = rd;

}inline void work()

printf("%lld\n",mi[vi]);

lst = mi[vi]; }}

int main()

return 0;

}

這道題,乃是noi近幾年來最水的水題,爆搜隨便加個剪枝就能過去,這波啊,這波是出題人的鍋。

直接暴力從第乙個點搜到最後乙個點,如果說能連在一起就連在一起,然後用calc算一下貢獻就可以了。

當然這個題有乙個剪枝,就是因為時間比較少,所以可以用記憶化搜尋,先記錄當前時間下最少需要多少煩躁值,然後往後面硬搜就可以了。

code :

#include#include#include#include#includeusing namespace std;

templateinline void cmin(t&x,t y)

const int n = 1e5 + 1;

const int m = 2e5 + 1;

const int t = 1e3 + 1;

int a,b,c;

int n,m;

int ans = 1e9 + 7;

int tim[n][t];

struct node

node(const int v,const int sd,const int et)

bool operator<(const node&tem) const

};vectore[n];

inline void input(void)

if(n > m) for(int i = m + 1; i <= n; i++)

}inline void dfs(const int t,const int now,const int val)

return;

}inline void work(void)

int main(void)

該題我只想出來了 \(o(nmt)\) 的暴力,所以說得分只有40pts,然後聽正解是矩陣快速冪優化 dp ,這個就是我不會的了,逃了逃了。

LeetCode 第一題TwoSum題解

1.暴力法求解 思想 利用兩個for迴圈對數字進行遍歷,第乙個for迴圈迴圈位置到nums.length 1,第二個for迴圈起始為i 1.時間複雜度 o n 2 空間複雜度 o 1 public static int twosum int nums,int target throw newille...

USACO 2020二月青銅第一題題解報告

farmer john 想要給他的奶牛們建造乙個三角形牧場。有 n 3 n 100 個柵欄柱子分別位於農場的二維平面上不同的點 x1,y1 xn,yn 他可以選擇其中三個點組成三角形牧場,只要三角形有一條邊與 x 軸平行,且有另一條邊與 y 軸平行。farmer john 可以圍成的牧場的最大面積是...

浙江十套 第一套 解題報告

如果 maxo 0 說明只有 x 答案就是 maxx 如果 x 不夠用,說明每次都是放 maxo 個 o 用乙個 x 隔開 oooooxooooox cdots 此時有 counto ge countx 1 maxo 因此,最大是 countx countx 1 maxo 注意更新 include ...