diff --git a/20240919/CSP常考算法模板/BFS.cpp b/20240919/CSP常考算法模板/BFS.cpp new file mode 100644 index 0000000..83620aa --- /dev/null +++ b/20240919/CSP常考算法模板/BFS.cpp @@ -0,0 +1,73 @@ +#include +using namespace std; + +struct node { + int x, y, s; +}; + +queue q; +int a[51][51]; +int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; // +bool flag = false, book[51][51]; +int n, m, sx, sy, ex, ey; + +void bfs(int sx,int sy) +{ + q.push({sx, sy, 0}); // ֮, ԭ + book[sx][sy] = true; + + while(!q.empty() && !flag) { + node temp = q.front(); + q.pop(); + for(int i=0; i<4;i++) { + //µλ + int nx = temp.x + dir[i][0]; + int ny = temp.y + dir[i][1]; + //жµλǷԽ + if(nx<1 || nx > n || ny < 1 || ny > m) + continue; + // µλƽ û߹ + if(a[nx][ny]==0 && !book[nx][ny]) { + q.push({nx, ny, temp.s+1}); + book[nx][ny] = true; + // µλǷΪյ + if(nx==ex && ny==ey) { + flag = true; + cout<>n>>m; + for(int i=1; i<=n; i++) { + for(int j=1; j<=m; j++) { + cin>>a[i][j]; + } + } + + cin>>sx>>sy>>ex>>ey; + + bfs(sx,sy); + + if(!flag) + cout<<"no"; + return 0; +} + +/* +5 4 +0 0 1 0 +0 0 0 0 +0 0 1 0 +0 1 0 0 +0 0 0 1 +1 1 4 3 + + +7 +*/ diff --git a/20240919/CSP常考算法模板/DFS.cpp b/20240919/CSP常考算法模板/DFS.cpp new file mode 100644 index 0000000..f106c85 --- /dev/null +++ b/20240919/CSP常考算法模板/DFS.cpp @@ -0,0 +1,61 @@ +#include +using namespace std; + +int n,m,p,q,minn=INT_MAX; +int a[51][51]; +bool book[51][51]; +// +int dir[4][2]={ {0,1} , // + {1,0} , // + {0,-1}, // + {-1,0} } ;// + +void dfs(int x,int y,int step){ + // жǷյ + if(x==p && y==q){ + minn = min(minn, step); + return; + } + + // ֦ + if(step>=minn) // δյ㲽Ѿﵽ򳬹Сֵͷء + return; + + // öÿһ + for(int i=0; i<=3; i++){ + //һ + int nx=x+dir[i][0]; + int ny=y+dir[i][1]; + + // жǷԽ + if(nx<1 || nx>n || ny<1 || ny>m) + continue; + + if(a[nx][ny]==0 && !book[nx][ny]){ + book[nx][ny]=true; + dfs(nx,ny,step+1); + book[nx][ny]=false; // + } + } + +} + +int main(){ + ios::sync_with_stdio(false); + cin.tie(0); + + int i ,j,startx,starty; + cin>>n>>m; + //Թ + for(i=1;i<=n;i++) + for(j=1;j<=m;j++) + cin>>a[i][j]; + + cin>>startx>>starty>>p>>q; + + book[startx][starty]=true; + dfs(startx,starty,0); + + cout< +using namespace std; + +const int N = 500001; + +struct Edge { + int to; + int nxt; +} e[2*N]; + +int n,m,s; +int depth[N], Log[N]; +int dbl[N][20]; // +int head[N], tot; + +void addEdge(int x,int y) { + e[++tot].to=y; + e[tot].nxt=head[x]; + head[x]=tot; +} + +void dfs(int cur, int fa) { + depth[cur]=depth[fa]+1; + dbl[cur][0]=fa; + for(int i=1; (1<0; i=e[i].nxt) { + if(e[i].to != fa) // ӽڵ + dfs(e[i].to, cur); + } +} + +int lca(int x,int y) { + // ͬһ߶ȣһ + if(depth[x]depth[y]) { + x=dbl[x][Log[depth[x]-depth[y]]]; + } + + if(x==y) + return x; + + // ͬʱLCAһΪֹ + for(int i=Log[depth[x]]; i>=0; i--) + if(dbl[x][i] != dbl[y][i]) { + x=dbl[x][i]; + y=dbl[y][i]; + } + + return dbl[x][0]; +} + +/* +㷨ʱ临ӶO(nlogn) +*/ +int main() { + scanf("%d%d%d",&n,&m,&s); + for(int i=1; i<=n-1; i++) { + int x,y; + scanf("%d%d",&x,&y); + addEdge(x,y); + addEdge(y,x); + } + dfs(s,0); // + + // ԤŻ + for(int i=2; i<=n; i++) { + Log[i]=Log[i>>1] + 1; + } + + for(int i=1; i<=m; i++) { + int x, y; + scanf("%d%d", &x, &y); + printf("%d\n", lca(x, y)); + } + return 0; +} + diff --git a/20240919/CSP常考算法模板/P3379【模板】LCA_倍增 -邻接表.cpp b/20240919/CSP常考算法模板/P3379【模板】LCA_倍增 -邻接表.cpp new file mode 100644 index 0000000..049d98a --- /dev/null +++ b/20240919/CSP常考算法模板/P3379【模板】LCA_倍增 -邻接表.cpp @@ -0,0 +1,87 @@ +#include +using namespace std; + +const int N = 500001; + +int n,m,s; +int depth[N], Log[N]; +int dbl[N][20]; // +int tot; +vector graph[N]; + +void dfs(int cur, int fa) { + //todo + depth[cur]=depth[fa]+1; + dbl[cur][0]=fa; + for(int i=1;(1<depth[y]) + { + int h=Log[depth[x]-depth[y]]; + x=dbl[x][h]; + } + + if(x==y) + return x; + + // ͬʱLCAһΪֹ + // TODO + int h=Log[depth[x]]; + for(int i=h;i>=0;i--) + { + if(dbl[x][i]!=dbl[y][i]) + { + x=dbl[x][i]; + y=dbl[y][i]; + } + } + return dbl[x][0]; +} + +/* +㷨ʱ临ӶO(nlogn) +*/ +int main() { + scanf("%d%d%d",&n,&m,&s); + for(int i=1; i<=n-1; i++) { + int x,y; + scanf("%d%d",&x,&y); + //todo + graph[x].push_back(y); + graph[y].push_back(x); + } + dfs(s,0); // + + // ԤŻ + for(int i=2; i<=n; i++) { + //todo + Log[i]=Log[i/2]+1; + } + + for(int i=1; i<=m; i++) { + int x,y; + scanf("%d%d",&x,&y); + printf("%d\n",lca(x,y)); + } + return 0; +} + diff --git a/20240919/CSP常考算法模板/P3379【模板】LCA_倍增 -邻接表_todo.cpp b/20240919/CSP常考算法模板/P3379【模板】LCA_倍增 -邻接表_todo.cpp new file mode 100644 index 0000000..3bb9c75 --- /dev/null +++ b/20240919/CSP常考算法模板/P3379【模板】LCA_倍增 -邻接表_todo.cpp @@ -0,0 +1,53 @@ +#include +using namespace std; + +const int N = 500001; + +int n,m,s; +int depth[N], Log[N]; +int dbl[N][20]; // +int tot; +vector graph[N]; + +void dfs(int cur, int fa) { + //todo +} + +int lca(int x,int y) { + // ͬһ߶ȣһ + // TODO + + if(x==y) + return x; + + // ͬʱLCAһΪֹ + // TODO + + return dbl[x][0]; +} + +/* +㷨ʱ临ӶO(nlogn) +*/ +int main() { + scanf("%d%d%d",&n,&m,&s); + for(int i=1; i<=n-1; i++) { + int x,y; + scanf("%d%d",&x,&y); + //todo + } + dfs(s,0); // + + // ԤŻ + for(int i=2; i<=n; i++) { + //todo + } + + for(int i=1; i<=m; i++) { + int x,y; + scanf("%d%d",&x,&y); + printf("%d\n",lca(x,y)); + } + return 0; +} + diff --git a/20240919/CSP常考算法模板/RMQ.cpp b/20240919/CSP常考算法模板/RMQ.cpp new file mode 100644 index 0000000..28baf7c --- /dev/null +++ b/20240919/CSP常考算法模板/RMQ.cpp @@ -0,0 +1,39 @@ +#include +using namespace std; + +const int N = 1e6 + 5; +const int LOGN = 20; + +int Log[N] = {-1}, f[N][LOGN + 1], a[N]; // f[i][j] 洢[i, i+2^j-1]ֵ֮ +int n, m; + +int main() { + ios::sync_with_stdio(false); + cin.tie(0), cout.tie(0); + + cin>>n>>m; + for(int i=1; i<=n; ++i) { + cin>>a[i]; + } + + for(int i=1; i<=n; ++i) { + f[i][0]=a[i]; + Log[i]=Log[i>>1] + 1; // ԤΪ1~nlogֵ + } + + for(int j=1; j<=LOGN; j++) { // עj + for(int i=1; i+(1<>x>>y;//3 8 + int s=Log[y-x+1]; + cout< +using namespace std; + +int a[11]={5, 13, 19, 21, 37, 56, 64, 75, 80, 88, 92}; + +int main() +{ + int x; + cin>>x; + int l=0,r=10; + int ans; + while(l<=r) + { + int mid=(l+r)/2; + if(x==a[mid]) + { + cout< +using namespace std; + +int n, tmax; +int t[10001]; + +bool check(int k) { + priority_queue, greater > pq; + for(int i=0; i 1) { + pq.pop(); + } + return tmax >= pq.top(); +} + +int main() { +// freopen("cowdance.in","r",stdin); +// freopen("cowdance.out","w",stdout); +// + ios::sync_with_stdio(false); + cin.tie(0); + + cin>>n>>tmax; + for(int i=0; i>t[i]; + } + int left = 1, right = n, ans = n; + while(left<=right) { + int mid = (left+right)/2; + if(check(mid)) { + ans = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + cout< +using namespace std; +int x[4][5] = {{},{0,3,2,1,5},{0,7,1,2,8},{0,1,3,4,6}}; +int prefix[4][5]; +int sum[4][5]; +int main() +{ + + for(int i=1;i<=3;i++) + { + for(int j=1;j<=4;j++) + { + //todo + prefix[i][j]=prfix[i-1][j]+prefix[i][j-1]-prefix[i-1][j-1]+x[i][j]; + } + } + for(int i=1;i<=3;i++) + { + for(int j=1;j<=4;j++) + { + cout< +using namespace std; +bool book[10]; //falseʾûù +int a[10]; + +void print() +{ + for(int i=1;i<=4;i++) + { + cout< +using namespace std; + +int n, a[1001], prefix[1001]; + +int main() +{ + freopen("bcount.in","r",stdin); + freopen("bcount.out","w",stdout); + cin>>n; + + for(int i=1; i<=n; i++) + { + cin>>a[i]; + //todo + prefix[i]=prefix[i-1]+a[i]; + } + + int ans = INT_MIN; + for(int i=1;i<=n;i++) //begin location + { + for(int j=i;j<=n;j++) //end location + { + ans=max(ans,prefix[j]-prefix[i-1]); + } + } + + + cout< +using namespace std; + +int a[101]; +int sum[101]; // prefix sum +int f[101][101]; +/* +䶯̬滮ⲽ裺 +1.Ʋdp[i][j]ĺ +ǣѵ1ѵnʯӺϳһѣСĵ÷ +dp[i][j]ĺ壺ѵiѵjʯӺϳһѣСĵ÷ +2.ݹƳdp[i][j]״̬תƹʽ +i-j֮ѡһмֵk +dp[i][j]=dp[i][k]+dp[k+1][j]+(sum[j]-s[i-1]); +3.߽⣨趨dp[0][0],dp[0][j],dp[i][0],dp[i][j],dp[i][i]ʼֵ + +*/ + +/* +input +7 +13 +7 +8 +16 +21 +4 +18 + +output +239 +*/ +int main() { + ios::sync_with_stdio(false); + cin.tie(0); + int n; + cin>>n; + + for(int i=1; i<=n; i++) { + cin>>a[i]; + sum[i] = sum[i-1] + a[i]; + } + + for(int i=n-1; i>=1; i--) { //һҪ + for(int j=i+1; j<=n; j++) { + f[i][j] = INT_MAX; + for(int k=i; k<=j-1; k++) { + f[i][j] = min(f[i][j], f[i][k]+f[k+1][j] + sum[j]-sum[i-1]); + } + } + } + + cout< +using namespace std; +vector graph[101]; + +int main() +{ + int n,m,x,y; + cin>>n>>m; + for(int i=1;i<=m;i++) + { + cin>>x>>y; + //todo + graph[x].push_back(y); + graph[y].push_back(x); + } + for(int i=1;i<=n;i++) + { + //todo +// for(int j=0;j +using namespace std; +int n,m,p; +int f[5001]; + +int find(int x) +{ + if(x==f[x]) + { + return x; + } + return f[x]=find(f[x]); +} + +void merge(int u, int v) +{ + int fu=find(u); + int fv=find(v); + if(fu!=fv) + { + f[fu]=fv; + } +} + +int main() +{ + cin>>n>>m>>p; + for(int i=1;i<=n;i++) + { + f[i]=i; + } + for(int i=1;i<=m;i++) + { + int a,b; + cin>>a>>b; + merge(a,b); + } + + for(int i=1;i<=p;i++) + { + int a,b; + cin>>a>>b; + if(find(a)==find(b)) + { + cout<<"Yes"< +using namespace std; +int n,m,p; +int f[5001]; + +int find(int x) +{ + if(x==f[x]) + { + return x; + } + return find(f[x]); +} + +void merge(int u, int v) +{ + int fu=find(u); + int fv=find(v); + if(fu!=fv) + { + f[fu]=fv; + } +} + +int main() +{ + cin>>n>>m>>p; + for(int i=1;i<=n;i++) + { + f[i]=i; + } + for(int i=1;i<=m;i++) + { + int a,b; + cin>>a>>b; + merge(a,b); + } + + for(int i=1;i<=p;i++) + { + int a,b; + cin>>a>>b; + if(find(a)==find(b)) + { + cout<<"Yes"< +using namespace std; + +int b, p, k; + +/* +ԭa*b%k=(a%k)*(b%k)%k +κһȻp=2*(p/2)+p%2 +*/ +int f(int p) { + if(p==0) // b^0%k + return 1%k; + int t=f(p/2)%k; + t=(t*t)%k; // b^p%k=(b^(p/2))^2%k + if(p%2==1) + t=(t*b)%k; // pΪb^p%k=((b^(p/2))^2)*b%k + return t; +} + +int main(){ + cin>>b>>p>>k; + int tmpb=b; + b%=k; + printf("%d^%d mod %d=%d", tmpb, p, k, f(p)); + return 0; +} diff --git a/20240919/CSP常考算法模板/拓扑排序.cpp b/20240919/CSP常考算法模板/拓扑排序.cpp new file mode 100644 index 0000000..35ec145 --- /dev/null +++ b/20240919/CSP常考算法模板/拓扑排序.cpp @@ -0,0 +1,36 @@ +#include +using namespace std; +const int MAX_A=100005; +int to[MAX_A]; +int inDegree[MAX_A]; + +int main() { + int n; + cin>>n; + for (int i=1; i<=n; i++) { + cin>>to[i]; + inDegree[to[i]]++; + } + queue q; + int cnt = 0; + for (int i=1; i<=n; i++) { + if (inDegree[i]==0) { + q.push(i); + cnt++; + } + } + while (q.size()>0) { + int t=q.front(); + q.pop(); + int v = to[t]; + inDegree[v]--; + if (inDegree[v]==0) { + q.push(v); + cnt++; + } + } + cout< +using namespace std; + +struct edge { + int to, w; +} a[10001]; + +int dis[101]; +int ans, cnt; +vector graph[101]; +bool visit[101]; +struct cmp //º +{ + bool operator()(const edge &a, const edge &b) { + return a.w > b.w; + } +}; +priority_queue, cmp> pq; +int main() { + int n,m,k; + cin>>n>>m; + + for (int j = 1; j <= m; j++) { + int a,b,c; + cin>>a>>b>>c; + graph[a].push_back({b,c}); + graph[b].push_back({a,c}); + } + for (int i = 1; i <= n; i++) { + dis[i]=INT_MAX/2; + } + visit[1]=true; + for(int i=0;i +using namespace std; + +struct edge { + int x, y, w; +} a[10001]; + +int f[101]; +int ans, cnt; + +bool cmp(edge x, edge y) { + return x.w < y.w; +} + +//int getDistance(int x1, int y1, int x2, int y2) { +// return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); // Ҫƽ +//} + +int n, m; +int find(int x) { + if (x == f[x]) + return x; + return f[x]=find(f[x]); +} + +void merge(int x, int y) { + int fx = find(x); + int fy = find(y); + if (fx != fy) { + //һ + f[fy] = fx; + } +} +void kruskal() +{ + for (int i = 1; i <= n; i++) { + f[i] = i; + } + for (int i = 1; i <= m; i++) { + int u=a[i].x; + int v=a[i].y; + if(find(u)!=find(v)) + { + cnt++; + ans+=a[i].w; + merge(u,v); + } + if(cnt==n-1) + { + break; + } + } +} + +int main() { + + cin>>n>>m; + + for (int j = 1; j <= m; j++) { + cin>>a[j].x>>a[j].y>>a[j].w; + } + sort(a + 1, a + m + 1, cmp); // + kruskal(); + cout << ans << endl; + return 0; +} + +/* +6 9 +2 4 11 +3 5 13 +4 6 3 +5 6 4 +2 3 6 +4 5 7 +1 2 1 +3 4 9 +1 3 2 +*/ + + + diff --git a/20240919/CSP常考算法模板/最短路径/单源最短路径Dijkstra.cpp b/20240919/CSP常考算法模板/最短路径/单源最短路径Dijkstra.cpp new file mode 100644 index 0000000..c4ee647 --- /dev/null +++ b/20240919/CSP常考算法模板/最短路径/单源最短路径Dijkstra.cpp @@ -0,0 +1,65 @@ +#include +using namespace std; + +const int N = 2501; +const int M = 15001; + +struct point { + int id; + int len; +}; + +vector g[N]; +int t, c, ts, te; +int rs, re, ci; +int dis[N]; +bool vis[N]; + +struct cmp //º +{ + bool operator()(point a, point b) { + return a.len > b.len; //priority_queuesortĹ෴ + } +}; + +priority_queue, cmp> pq; + +void Dijkstra() +{ + memset(dis, 0x3f, sizeof(dis)); + dis[ts] = 0; // ע ʼts + pq.push({ts, 0}); + + while (pq.size()>0) { + int id = pq.top().id; // ȡǰԴĵ + pq.pop(); + + if (vis[id]) continue; + vis[id] = 1; + + for (point e:g[id]) { + + if (dis[e.id] > dis[id] + e.len) { + dis[e.id] = dis[id] + e.len; + pq.push({e.id, dis[e.id]}); + } + } + } +} + +int main() { + ios::sync_with_stdio(false); + cin.tie(0); + + cin >> t >> c >> ts >> te; + for (int i = 0; i < c; i++) { + cin >> rs >> re >> ci; + g[rs].push_back({re,ci}); + g[re].push_back({rs,ci}); + } + + Dijkstra(); + + cout << dis[te] << endl; + return 0; +} diff --git a/20240919/CSP常考算法模板/最短路径/单源最短路径SPFA(有负边).cpp b/20240919/CSP常考算法模板/最短路径/单源最短路径SPFA(有负边).cpp new file mode 100644 index 0000000..776a56f --- /dev/null +++ b/20240919/CSP常考算法模板/最短路径/单源最短路径SPFA(有负边).cpp @@ -0,0 +1,61 @@ +#include +using namespace std; +int dis[2501]; +bool exist[2501];//ÿǷqueue +struct point +{ + int to; + int w; +}; +int n,m,s,t; +vector graph[2501]; + +void SPFA() +{ + memset(dis, 0x3f, sizeof(dis)); + dis[s] = 0; // ע ʼs + queue q; + q.push(s); + exist[s]=1; + + while(q.size()>0) + { + int from=q.front(); + q.pop(); + exist[from]=0; + for(int i=0;i> n >> m >> s >> t; + for (int i = 1; i <=m ; i++) { + int a,b,c; + cin >> a >> b >> c; + graph[a].push_back({b,c}); + graph[b].push_back({a,c}); + } + + SPFA(); + + cout << dis[t] << endl; + return 0; +} diff --git a/20240919/CSP常考算法模板/最短路径/多源最短路径Floyed.cpp b/20240919/CSP常考算法模板/最短路径/多源最短路径Floyed.cpp new file mode 100644 index 0000000..605fcae --- /dev/null +++ b/20240919/CSP常考算法模板/最短路径/多源最短路径Floyed.cpp @@ -0,0 +1,58 @@ +#include +using namespace std; + +int a[101][3]; +double f[101][101]; +int n,i,j,k,x,y,m,s,e; +int main() +{ +// freopen("short.in","r",stdin); +// freopen("short.out","w",stdout); + cin >> n; + for (i = 1; i <= n; i++) + cin >> a[i][1] >> a[i][2]; + cin >> m; + memset(f,0x7f,sizeof(f)); //ʼfΪֵ + + //Ԥxy +// for (i = 1; i <= m; i++) +// { +// cin >> x >> y; +// f[y][x] = f[x][y] = sqrt(pow(a[x][1]-a[y][1],2)+pow(a[x][2]-a[y][2],2)); +// //pow(x,y)ʾx^yx,yΪdoubleͣҪcmath +// } + + for (i = 1; i <= n; i++) + f[i][i]=0; + cin >> s >> e; + for (k = 1; k <= n; k++) //kʾת //floyed ·㷨 + { + for (i = 1; i <= n; i++) + { + for (j = 1; j <= n; j++) + { + if (f[i][k]+f[k][j] < f[i][j]) + f[i][j] = f[i][k] + f[k][j]; + } + } + } + printf("%.2lf\n",f[s][e]); + return 0; +} +/* +5 +0 0 +2 0 +2 2 +0 2 +3 1 +5 +1 2 +1 3 +1 4 +2 5 +3 5 +1 5 +*/ + + diff --git a/20240919/CSP常考算法模板/树上问题_dfs.cpp b/20240919/CSP常考算法模板/树上问题_dfs.cpp new file mode 100644 index 0000000..5a916c1 --- /dev/null +++ b/20240919/CSP常考算法模板/树上问题_dfs.cpp @@ -0,0 +1,54 @@ +#include +using namespace std; + +const int MAXN = 1e5 + 5; + +//dep[u]u +//leaf[u]uΪУdzǸҶӽڵȡ +int n , m , rt , leaf[MAXN] , dep[MAXN]; + +vector graph[MAXN]; + +// dep[u]leaf[u] +int dfs(int u, int fa) { // ؾuҶӽڵ + dep[u] = dep[fa] + 1; + // uҶӽڵ + if(graph[u].size()==1) { + leaf[u] = dep[u]; + return leaf[u]; + } + for(int v : graph[u]) { + if(v == fa) continue; + + leaf[u] = min(dfs(v , u) , leaf[u]); + } + return leaf[u]; +} + +// ڵuܹfarmer +int dfs2(int u, int fa) { + if(dep[u] - 1 >= leaf[u] - dep[u]) return 1; + int cnt = 0; + for (int v : graph[u]) { + if (v == fa) continue; + cnt += dfs2(v, u); + } + return cnt; +} + +int main() { + // freopen("atlarge.in", "r", stdin); + // freopen("atlarge.out", "w", stdout); + + memset(leaf , 0x3f , sizeof(leaf)); + scanf("%d%d" , &n, &rt); + for(int i = 0; i < n - 1 ; i++) { + int u, v; + scanf("%d%d" , &u , &v); + graph[u].push_back(v); + graph[v].push_back(u); + } + dfs(rt , 0); + printf("%d\n" , dfs2(rt, 0)); + return 0; +} diff --git a/20240919/CSP常考算法模板/树状数组/树状数组( 单点修改 区间查询).cpp b/20240919/CSP常考算法模板/树状数组/树状数组( 单点修改 区间查询).cpp new file mode 100644 index 0000000..e4d072c --- /dev/null +++ b/20240919/CSP常考算法模板/树状数组/树状数组( 单点修改 区间查询).cpp @@ -0,0 +1,46 @@ +#include +#define ll long long +using namespace std; + +const int MAXN = 1e6 + 10; +ll c[MAXN]; +int n, q, k, a, b; + +int lowbit(int x) { + return x&(-x); +} + +void update(int x, int v) { + for(int i=x;i<=n;i+=lowbit(i)) + c[i]+=v; +} + +ll getSum(int x) { + ll ans=0; + for(int i=x; i>0; i-=lowbit(i)) + ans+=c[i]; + return ans; +} + +int main() { + ios::sync_with_stdio(false); + cin.tie(0); + + int v; + cin>>n>>q; + for(int i=1; i<=n; i++) { + cin>>v; + update(i, v); + } + + for(int i=1; i<=q; i++) { + cin>>k>>a>>b; + if(k==1) { + update(a, b); + } else { + cout< +using namespace std; + +void preOrder(string in,string post){ + if(in.length() == 0) { + return; + } + char root=post[post.size()-1]; + cout<>inOrder>>postOrder; + preOrder(inOrder, postOrder); + cout< +using namespace std; + +vector g[200010]; + +long long hay[200010]; +struct node +{ + int to; + long long w; +}; +vector m[200010]; +long long avg = 0; +int ans = 0; +int indegree[200010]; + +void dfs(int u, int f) { + for (int v : g[u]) { + if (v != f) + { + dfs(v, u); + } + } + if(hay[u]==avg) + return; + + ans++; + if (hay[u] > avg) { + m[u].push_back({f, hay[u] - avg}); + hay[f] += hay[u] - avg; + indegree[f]++; + } else { + hay[f] -= avg-hay[u]; + m[f].push_back({u, avg-hay[u]}); + indegree[u]++; + } +} + + +/* +dfsҵÿ߰٣Ȼиϸֱָܳ +Ҫһbfsȴûȵĵ㿪ʼߣ +*/ +int main() { + int n; + cin >> n; + for (int i = 1; i <= n; i++) { + scanf("%lld", &hay[i]); + avg += hay[i]; + } + + avg /= n; + for (int i = 1; i < n; i++) { + int a, b; + cin>>a>>b; + g[a].push_back(b); + g[b].push_back(a); + } + + dfs(1, 0); + cout << ans << endl; + queue q; + + for (int i = 1; i <= n; i++) + { + if (indegree[i] == 0) + { + q.push(i); + } + } + while(q.size()>0) + { + int cur=q.front(); + q.pop(); + for(node i:m[cur]) + { + cout< +using namespace std; +int m, n; +int w[31], c[31], p[31]; +int f[201]; + +/* +10 3 +2 1 0 +3 3 1 +4 5 4 +*/ + +int main(){ + scanf("%d%d",&m,&n); + for (int i = 1; i <= n; i++) + scanf("%d%d%d",&w[i],&c[i],&p[i]); + for (int i = 1; i <= n; i++) + if (p[i] == 0) { //ȫ + for (int j = w[i]; j <= m; j++) + f[j] = max(f[j], f[j-w[i]]+c[i]); + } + else { + for (int j = 1; j <= p[i]; j++) //01Ͷر + for (int k = m; k >= w[i]; k--) + f[k] = max(f[k],f[k-w[i]]+c[i]); + } + + printf("%d",f[m]); + return 0; +} + diff --git a/20240919/CSP常考算法模板/线性dp_求最长不下降序列_逆推.cpp b/20240919/CSP常考算法模板/线性dp_求最长不下降序列_逆推.cpp new file mode 100644 index 0000000..b03762a --- /dev/null +++ b/20240919/CSP常考算法模板/线性dp_求最长不下降序列_逆推.cpp @@ -0,0 +1,62 @@ +#include +using namespace std; + +int a[100], dp[100], trace[100]; + +/* +14 +13 7 9 16 38 24 37 18 44 19 21 22 63 15 + + +max=8 +7 9 16 18 19 21 22 63 +*/ +int main() +{ + int n; + cin>>n; + for(int i=1; i<=n; i++) + { + cin>>a[i]; // ԭʼ + dp[i]=1; // LIS + trace[i]=0; // һλ + } + + // LIS + for(int i=n-1; i>=1; i--) + { + int maxlis=0; + int maxindex=0; + for(int j=i+1; j<=n; j++) + { + if(a[j]>a[i] && dp[j]>maxlis) + { + maxlis=dp[j]; + maxindex=j; + } + } + + if(maxlis>0) + { + dp[i]=maxlis+1; + trace[i]=maxindex; + } + } + + int pos=1; + for(int i=2; i<=n; i++) + { + if(dp[i]>dp[pos]) + pos=i; + } + cout<<"max="< +using namespace std; +#define LL long long + +const int SIZE = 1e6; + +struct node{ + int l, r; + LL w; // +}; + +node tree[4*SIZE + 1]; // 4С + +inline void build(int k, int l, int r) { // kǰڵ + tree[k].l = l; + tree[k].r = r; + if (l == r) { // Ҷӽڵ + scanf("%lld", &tree[k].w); + return; + } + int mid = l + r >> 1; // ൱ (l + r) >> 1 k + int lc = k << 1, rc = lc | 1; + build(lc, l, mid); // + build(rc, mid + 1, r); // + tree[k].w = tree[lc].w + tree[rc].w; +} + +// ޸ +inline void changePoint(int k, int x, int c) { + if (tree[k].l == tree[k].r) { // ҵҶӽڵ + tree[k].w += c; + return; + } + int mid = tree[k].l + tree[k].r >> 1; + int lc = k << 1, rc = lc | 1; + if (x <= mid) + changePoint(lc, x, c); + else + changePoint(rc, x, c); + tree[k].w = tree[lc].w + tree[rc].w; +} + +// ѯ +inline LL queryInterval(int k, int L, int R) { + if (tree[k].l >= L && tree[k].r <= R) + return tree[k].w; + + int mid = tree[k].l + tree[k].r >> 1; + int lc = k<<1, rc = lc | 1; + LL ans = 0; + if (L <= mid) + ans += queryInterval(lc, L, R); + if (R > mid) + ans += queryInterval(rc, L, R); + return ans; +} + +int main() { + int n, q; + scanf("%d%d", &n, &q); + build(1, 1, n); + for (int i = 1; i <= q; i++) { + int opt, x, y; + scanf("%d%d%d", &opt, &x, &y); + if (opt == 1) + changePoint(1, x, y); + if (opt == 2) + printf("%lld\n", queryInterval(1, x, y)); + } + return 0; +} diff --git a/20240919/CSP常考算法模板/背包问题_01.cpp b/20240919/CSP常考算法模板/背包问题_01.cpp new file mode 100644 index 0000000..466d5d7 --- /dev/null +++ b/20240919/CSP常考算法模板/背包问题_01.cpp @@ -0,0 +1,32 @@ +#include +using namespace std; + +const int maxm = 201, maxn = 31; +int m, n; +int w[maxn], c[maxn]; +int f[maxn][maxm]; + +/* +10 4 +2 1 +3 3 +4 5 +7 9 +*/ +int main(){ + ios::sync_with_stdio(false); + cin.tie(0); + + cin>>m>>n; //mƷn + for (int i = 1; i <= n; i++) //ڳʼѭ֣һʼ + cin>>w[i]>>c[i]; //ÿƷͼֵ + for (int i = 1; i <= n; i++) // f[i][v]ʾǰiƷvżֵ + for (int v = m; v > 0; v--) + if (w[i] <= v) + f[i][v] = max(f[i-1][v],f[i-1][v-w[i]]+c[i]); + else + f[i][v] = f[i-1][v]; + cout< +using namespace std; + +int v[10001],w[10001]; +int f[6001]; +int n,m,n1; + +/* + +5 1000 +80 20 4 +40 50 9 +30 50 7 +40 30 6 +20 20 1 + +1040 + +*/ +int main() { + scanf("%d%d",&n,&m); + for(int i=1;i<=n;i++){ + int x,y,s,t=1; + scanf("%d%d%d",&x,&y,&s); + while (s>=t) { + v[++n1]=x*t; //൱n1++; v[n1]=x*t; + w[n1]=y*t; + s-=t; + t*=2; + } + //s2ֶָѣ1242^(k-1)s-2^k+1, + if(s>0) { + v[++n1]=x*s; + w[n1]=y*s; + } + } + + for(int i=1;i<=n1;i++) + for(int j=m;j>=v[i];j--) + f[j]=max(f[j],f[j-v[i]]+w[i]); + printf("%d\n",f[m]); + + return 0; +} + + diff --git a/20240919/CSP常考算法模板/背包问题_完全.cpp b/20240919/CSP常考算法模板/背包问题_完全.cpp new file mode 100644 index 0000000..ea62b7b --- /dev/null +++ b/20240919/CSP常考算法模板/背包问题_完全.cpp @@ -0,0 +1,20 @@ +#include +using namespace std; +const int maxm=2001,maxn=31; +int n,m,v,i; +int c[maxn],w[maxn]; +int f[maxm]; + +int main() +{ + scanf("%d%d",&m,&n); //mƷn + for(i=1;i<=n;i++) + scanf("%d%d",&w[i],&c[i]); + for(i=1;i<=n;i++) + for(v=w[i];v<=m;v++) // f[v]ʾvֵ + if(f[v-w[i]]+c[i]>f[v]) + f[v]=f[v-w[i]]+c[i]; + printf("max=%d\n",f[m]); // f[m]ΪŽ + return 0; +} +