ACM周赛&ICPC昆明资格赛
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM周赛&ICPC昆明资格赛相关的知识,希望对你有一定的参考价值。
文章目录
A.kaptree
Code:
// 考点树的深度 难度 ⭐
// 保证树的根为1
// 标程
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
const int N = 2105;
struct Node
int l,r;
tree[N];
int max_len(int root,int cnt)
if(root == 0)
return cnt-1;
else
return max(max_len(tree[root].l,cnt+1),max_len(tree[root].r,cnt+1));
int min_len(int root,int cnt)
if(root == 0)
return cnt-1;
else
//printf("root = %d, cnt == %d\\n",root,cnt);
int l = min_len(tree[root].l,cnt+1);
int r = min_len(tree[root].r,cnt+1);
return min(l,r);
int main()
int u,v,n;
scanf("%d",&n);
for(int i = 0;i < n; ++i)
scanf("%d%d",&u,&v);
if(tree[u].l == 0)
tree[u].l = v;
else
tree[u].r = v;
int k1 = min_len(1,0);
int k2 = max_len(1,0);
printf("%d\\n",k2 + k1);
return 0;
B.十字路口
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define N 301
int mp[N][N];
int main()
int n,m;
scanf("%d %d",&n,&m);
memset(mp,inf,sizeof mp);
for(int i=0;i<m;++i)
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
//mp[x][y]=z;mp[y][x]=mp[x][y];
//卡点一,去重取小值
mp[x][y]=min(mp[x][y],z);mp[y][x]=mp[x][y];
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
printf("%d\\n",mp[1][n]%10);
//双手合十,无妨10次提交也可
return 0;
C.七段的符号
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int f[][4]=0,0,0,0,2,6,0,0,1,3,7,0,2,4,7,0,3,5,0,0,4,6,7,0,1,5,7,0,2,3,5,6;
int a[8],vis[8];
bool BFS(int p)
queue<int>q;
q.push(p);
while(q.size())
int x=q.front();
q.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=0;i<4;++i)
int y=f[x][i];
if(y==0)break;
if(!vis[y]&&a[y])
q.push(y);
int kkk=0;
for(int i=1;i<=7;++i)
kkk+=a[i];
if(a[i]!=vis[i])
return false;
if(kkk==4)return false;//只能有一部分连通,结果验证
return true;
bool find()
memset(vis,0,sizeof vis);
for(int i=1;i<=7;++i)
if(a[i])return BFS(i);
return false;
int main()
int num=0,ci=0;
for(a[1]=0;a[1]<=1;a[1]++)
for(a[2]=0;a[2]<=1;a[2]++)
for(a[3]=0;a[3]<=1;a[3]++)
for(a[4]=0;a[4]<=1;a[4]++)
for(a[5]=0;a[5]<=1;a[5]++)
for(a[6]=0;a[6]<=1;a[6]++)
for(a[7]=0;a[7]<=1;a[7]++)
if(find())num++;
printf("%d\\n",num);
return 0;
//题解有多种,其他解可百度“E七段码”
D.Xor Query
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 500005;
ll a[N],tree[N<<2];
int n,q;
int lowbit(int x)
return -x & x;
void updata(int loc,int x)
while(loc <= n)
tree[loc] ^= x;
loc += lowbit(loc);
ll get(int loc)
ll ans = 0;
while(loc > 0)
ans ^= tree[loc];
loc -= lowbit(loc);
return ans;
int main()
scanf("%d%d",&n,&q);
for(int i = 1; i <= n; ++i)
scanf("%lld",&a[i]);
updata(i,a[i]);
int u,v,w;
while(q--)
scanf("%d%d%d",&u,&v,&w);
if(u == 1)
updata(v,w);
else
printf("%lld\\n",get(w) ^ get(v-1));
return 0;
E.A hard working man
/**
* @Author: Mangata
* @Date: 2021-02-28 15:50:13
* @PID: 104
* @Result: Accepted
* Powered By DOJ
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#define ll long long
#include <map>
using namespace std;
bool dp[100][100] = 0; // i, j 代表m n ,值代表输赢
int main()
dp[1][1] = false;
for(int k = 3; k < 99; k++)
for(int n = 1; n < k; n++)
int m = k - n;
bool &w = dp[n][k - n];
w = false;
for(int i = 1; i < n; i++) // 清空右边的,并从左边的放i 个过来
if(!dp[i][n - i]) w = true; // 如果下一个阶段为必败点,则当前为必胜点
for(int i = 1; i < m; i++)
if(!dp[i][m - i]) w = true;
int t;
cin >> t;
int a, b;
for(int i = 1; i <= t; i++)
cin >> a >> b;
cout << dp[a][b] << endl;
return 0;
F.red bags
#include <bit/stdc++.h>
using namespace std;
int main()
int b[]=1,2,3,4,5,6,7,8,9,10,i,count=0;
while(next_permutation(b,b+10))
for(i=0;i<9;i++)
if(abs(b[i]-b[i+1])==1) break;
if(i==9) count++;
cout<<count<<endl;
return 0;
以上是关于ACM周赛&ICPC昆明资格赛的主要内容,如果未能解决你的问题,请参考以下文章
第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明),签到题4题
第 46 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明),签到题3题