D
Strange_Fractions
令t=b/a,可以得到关于t的一元二次方程,用根的存在定理以及根是否为整数判断是否存在解,若有解,用求根方式求出t来,取t=(p+sqrt(p^2 -4q^2))/(2*q)(为了保证结果为正数),然后让a,b分别等于分子,分母
code:

#include <bits/stdc++.h>
#define DEBUG freopen("_in_.txt","r",stdin);
typedef long long ll;
using namespace std;ll t, p, q;int main()
{// DEBUG;scanf("%lld", &t);while (t--){scanf("%lld%lld", &p, &q);ll temp=p*p-4*q*q;if(temp<0){printf("0 0\n");continue;}ll c=(ll)sqrt(temp);if(c*c!=temp){printf("0 0\n");continue;}ll a=2*q;ll b=p+c;ll fen=__gcd(a,b);printf("%lld %lld\n",a/fen,b/fen);}
}

E
Strange_Integers
题目等价于在排序好的数组里找最多有多少相邻大于k的数,转化后就十分好写了

Code:

 #include<cstdio>#include<algorithm>using namespace std;int n,k,a[100010],ans;bool cmp(int a,int b){return a<b;}int main(){scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1,cmp);int temp=a[1];ans=1;for(int i=2;i<=n;i++) {if(a[i]-temp>=k){temp=a[i];ans++;}}printf("%d",ans);}

G
Edge Groups
思想是先将整个图划分成许多个块,每个块有一个中心点,所有边都连着这个中心点。划分方法就是按照拓扑排序的方法,从叶子节点开始,找到其父节点,但连接两者的边是归属于子节点还是父节点呢,就要看已经归属于子节点的边是奇数个还是偶数个,若为奇数个,归属到字节点,否则归属到父节点。划分好后,每个块内有多少方案就是n个数两两一组的方案,块与块之间相乘即可

Code:

#include<cstdio>
#include<algorithm>
#include<queue>
#define p 998244353
using namespace std;
long long n,b[100010],guishu[100010],du[100010],head[100010],k,sum,ans=1,J[100010];
queue<long long> q;
struct edge
{long long to,next;
} ed[400010];
long long kissme(long long x,long long k)
{long long sum=1,base=x;while(k){if(k&1){sum*=base;sum%=p;}base*=base;base%=p;k>>=1;}return sum;
}
long long Ni(long long x)
{return kissme(x,p-2);
}
void adde(long long u,long long v)
{ed[++k].to=v;ed[k].next=head[u];head[u]=k;
}
int main()
{//  freopen("text.txt","r",stdin);scanf("%lld",&n);J[0]=1;for(long long i=1;i<=n;i++)J[i]=J[i-1]*i%p;for(long long i=1;i<=n-1;i++){long long u,v;scanf("%lld%lld",&u,&v);adde(u,v);adde(v,u);du[u]++;du[v]++;}for(long long i=1;i<=n;i++)if(du[i]==1) q.push(i);//由于是无向图,叶子节点度数为1while(!q.empty()){long long u=q.front();q.pop();if(guishu[u]&1) {for(long long i=head[u];i;i=ed[i].next){long long v=ed[i].to;if(b[v]) continue;guishu[u]++;du[v]--;if(du[v]==1) q.push(v);}   b[u]=1;du[u]--;}else{for(long long i=head[u];i;i=ed[i].next){long long v=ed[i].to;if(b[v]) continue;guishu[v]++;du[v]--;if(du[v]==1) q.push(v);}    b[u]=1;du[u]--;}}for(long long i=1;i<=n;i++){if(!guishu[i]) continue;if(guishu[i]&1) printf("*");ans*=(J[guishu[i]]*(Ni(kissme(2,guishu[i]>>1))%p)%p*(Ni(J[guishu[i]>>1])%p))%p;ans=ans%p;}
//  printf("%lld\n",kissme(2,5));printf("%lld",ans); return 0;
}

H
Life is a Game
这场铜牌题,也是我们队最可惜的题,赛中有思路的时候已经很晚了,debug时间不够,赛后十几分钟过了,含泪打铁。。

可以用并查集做,首先将所有边去掉,整张图变成n个孤立的点,将所有边从小到大排序,用优先队列维护询问,当询问的点所在的块能量大于边权时,连上这条边,把边两端点合并到一个块,并更新块能量,直到所有边都连完

Code:

#include <bits/stdc++.h>
// #define DEBUG freopen("_in.txt", "r", stdin);
#define DEBUG freopen("_in.txt", "r", stdin), freopen("_out.txt", "w", stdout);
typedef long long ll;
using namespace std;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll maxn = 3e5 + 10;
const ll maxm = 2e4 + 10;
const ll mod = 998244353;ll n,m,q;
ll arr[maxn],f[maxn],zhi[maxn];struct Edge
{ll u,v,w;bool operator<(Edge other)const{return w<other.w;}
}edges[maxn];struct Node
{ll val,st,tmp,id;bool operator<(Node other)const{return val>other.val;}
}nodes[maxn];priority_queue<Node> que;ll fd(ll x)
{if(f[x]==x) return x;else return f[x]=fd(f[x]);
}void hb(ll x,ll y)
{ll fx=fd(x),fy=fd(y);if(fx==fy) return;zhi[fx]+=zhi[fy];// zhi[fy]=0;f[fy]=f[fx];
}bool cmp(Node a,Node b)
{return a.id<b.id;
}ll ans[maxn];int main()
{scanf("%lld%lld%lld",&n,&m,&q);for(ll i=1;i<=n;i++){scanf("%lld",&arr[i]);f[i]=i;zhi[i]=arr[i];}for(ll i=1;i<=m;i++){ll u,v,w;scanf("%lld%lld%lld",&u,&v,&w);edges[i]={u,v,w};}sort(edges+1,edges+m+1);edges[m+1].w=INF;for(ll i=1;i<=q;i++){scanf("%lld%lld",&nodes[i].st,&nodes[i].val);nodes[i].id=i;que.push(nodes[i]);}ll cnt=1;while(!que.empty()){Node temp=que.top();que.pop();while(temp.val>=edges[cnt].w){hb(edges[cnt].u,edges[cnt].v);cnt++;}temp.val-=temp.tmp;temp.tmp=zhi[fd(temp.st)];temp.val+=temp.tmp;ans[temp.id]=temp.val;if(temp.val>=edges[cnt].w){que.push(temp);}}for(ll i=1;i<=q;i++){printf("%lld\n",ans[i]);}}

I
Steadily Growing Steam
背包,dp[i][j][k]表示当到第i张牌时,A,B差为j,用了k次翻倍魔法,用滚动数组优化

Code:

#include <bits/stdc++.h>
// #define DEBUG freopen("_in_.txt", "r", stdin);
#define DEBUG freopen("_in_.txt", "r", stdin),freopen("_out_.txt", "w", stdout);
typedef long long ll;
using namespace std;
const ll maxn = 1e2 + 10;
const ll maxm = 2e4 + 10;ll n, m,F;
ll val[maxn], poi[maxn];
ll dp[2][maxm][maxn];
ll ans=0;int main()
{// DEBUG;scanf("%lld%lld", &n, &m);for (ll i = 1; i <= n; i++){scanf("%lld%lld", &val[i], &poi[i]);}memset(dp, -63, sizeof(dp));dp[0][(ll)1e4][0] = 0;dp[1][(ll)1e4][0] = 0;for (ll i = 1; i <= n; i++){F^=1;for (ll j = 1e4 - 3000; j <= 1e4 + 3000; j++){for (ll k = m; k>=0 ; k--){dp[F][j][k]=max(dp[F][j][k],dp[F^1][j][k]);dp[F][j][k]=max(dp[F][j][k],dp[F^1][j+poi[i]][k]+val[i]);dp[F][j][k]=max(dp[F][j][k],dp[F^1][j-poi[i]][k]+val[i]);if(!k) continue;dp[F][j][k]=max(dp[F][j][k],dp[F^1][j+poi[i]*2][k-1]+val[i]);dp[F][j][k]=max(dp[F][j][k],dp[F^1][j-poi[i]*2][k-1]+val[i]);}}}for(int i=0;i<=m;i++){ans=max(ans,dp[F][(ll)1e4][i]);}printf("%lld",ans);return 0;
}

第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(上海)DEGHI相关推荐

  1. 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)

    有时候,很简单的模板题,可能有人没有做出来,(特指 I ),到时候一定要把所有的题目全部看一遍 文章目录 B 题解 E F 题解 H I 题解&代码 J B 输入样例 3 2 1 2 1 2 ...

  2. 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(上海)(热身赛(A/B) + 正式赛(D/E))

    热身赛 A. 虽然计算几何学了和没学差不多,但是板子题还是要会的(火速去补) 一定能形成折线,所以选最长的两个删掉就可以了 struct node {double dist;int x; };int ...

  3. 第42届ACM国际大学生程序设计竞赛 亚洲区域赛 西安站 总结

    今年暑假集训结束的时候我们队在UESTC-ACM Div.1里排名第6,所以获得一场ICPC和一场CCPC的现场赛资格. 由于上半年5月打过西安的邀请赛并取得了一块银牌,笔者那次毕竟是第一次打区域赛级 ...

  4. 2018ACM-ICPC国际大学生程序设计竞赛亚洲区域赛(青岛站)赛后总结

    这是今年最后一次打铁,我已经打了一年的铁了. 还是想写一个总结,不然,什么都会没留下. 实际上在去青岛之前,我已经一个月都没有严格地训练自己了,从9月份CCPC秦皇岛站打铁之后,我就基本上开始怀疑自己 ...

  5. 计算机信息科学亚洲赛区冠军,祝贺竺院学子在ACM国际大学生程序设计竞赛亚洲赛区获得冠军...

    原标题:祝贺竺院学子在ACM国际大学生程序设计竞赛亚洲赛区获得冠军 Write the code. Change the World. 热烈祝贺竺可桢学院求是科学班(计算机)1601 陈靖邦.叶梓成, ...

  6. 中国矿业大学计算机学院张铖,中国矿大在第41届ACM国际大学生程序设计竞赛中国区决赛中荣获银奖...

    12月10-11日,第41届ACM国际大学生程序设计竞赛中国区决赛(ACM-ICPC Asia China-Final Contest)在上海大学举办.中国矿业大学计算机学院由刘厚泉教授担任领队,由杨 ...

  7. 【Java/补题/牛客/ACM赛制】2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛(正式赛)

    文章目录 题目链接 知识一览 题目列表 快输 C - GCD(数论分块) 题目链接 2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛(正式赛) 知识一览 01-数论分块 题目列 ...

  8. 大连,第36届ACM国际大学生程序设计竞赛,亚洲区大连赛区预选赛

    大连,第36届ACM国际大学生程序设计竞赛,亚洲区大连赛区预选赛 第一天 出发去大连 去大连理工大学参加ACM/ICPC比赛. 在长白路临时候车室,很多人,像农村赶集一样.空气里充满了白酒和熟食的气 ...

  9. 第44届ICPC国际大学生程序设计亚洲区域赛(南京站)心得体会

    2019年10月27日在南京航天航空大学举行第44届ICPC国际大学生程序设计亚洲区域赛(南京站).我有幸能与袁应师兄.胡富云一起去参赛.这一次比赛深感愧疚,我们队没能做出一个题,还有自身实力太弱. ...

最新文章

  1. 【Android】5.3 单选和复选
  2. sicily vector有序插入
  3. 第十一章 “她”值多少钱
  4. adb 最大连接_手机触屏失效的抢救办法,以及如何利用adb实现PC与手机交互
  5. 乐观锁的两种实现方式
  6. linux操作系统下建用户,如何用Linux操作系统批量建立用户的shell
  7. 唐山师范学院计算机科学与技术地址,2021年唐山师范学院有几个校区,大一新生在哪个校区...
  8. 疯狂ios讲义之实例:通过旋转手势旋转图片
  9. jquery页面隐藏和展开之间切换
  10. si4438+efm32g210f128
  11. C28x FIR - Filter 示例汇编代码解读
  12. RestTemplate设置Headers
  13. Kotlin工程项目下的不同的源文件图标
  14. CPU卡指令文件读取算法
  15. photoshop发光线条教程集
  16. 针式打印机偏移测试软件,精打教程(3)打印机打印偏移设置
  17. jquery 监听input输入停止,实现文本框自动跳转
  18. 2021年中国养老保险参保人数、基金收入、基金支出及未来发展趋势分析[图]
  19. Android--经典蓝牙(文件传输--socket通信)
  20. Java web应用 开发与实践

热门文章

  1. java开发微信公众号支付
  2. 请记住这个数字-2147483648到2147483647
  3. (超全)下载、寻找资源的经典方法
  4. SQL Assistant简介
  5. Windows安装TensorFlow教程(国内源安装附上各大镜像网站网址)
  6. consul重启导致服务必须跟着重启解决方案
  7. linux aux是什么命令,Linux命令ps aux详细解释
  8. 数据结构------顺序结构
  9. springboot中ElasticSearch入门与进阶:组合查询、聚合查询
  10. Cesium 通过scaleByDistance设置远小近大的广告牌图形视觉效果