• 22ccpc桂林E - Draw a triangle 向量求三角形面积,exgcd


    295B - Greg and Graph floyd

    由于对Floyd的本质还是不大清楚所以做这个题还是费了点功夫,可以把整个过程反过来,就变成了解锁每个点对当前已有点的影响,其实这样也就相当于一个floyd了,值得注意的是虽然有的点没有解锁,但是是可以参与转移的,只不过累加和的时候不能加上他,为什么可以参加转移呢?因为最开始的那个k循环实际的意义就是将k这个点作为中转点来更新i和j的最短路,k是被解锁的,所以如果i和j通过k转移也是合法的,这样还不会漏掉情况

    题解 P1119 【灾后重建】 - Time_Rune 的博客 - 洛谷博客 (luogu.com.cn)

    1. #include
    2. using namespace std;
    3. #define int long long
    4. //const int mod=1e9+7;
    5. const int inf=1e18;
    6. const int N = 2e6+100;
    7. int n,g[505][505],a[505][505],ans[505],b[505],vis[505];
    8. signed main()
    9. {
    10. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    11. //cout<<(1LL<<19)<
    12. cin>>n;
    13. for(int i=1;i<=n;i++)
    14. for(int j=1;j<=n;j++)
    15. {
    16. cin>>a[i][j];
    17. g[i][j]=a[i][j];
    18. }
    19. for(int i=1;i<=n;i++) cin>>b[i],vis[i]=0;
    20. for(int k=n;k>=1;k--)
    21. {
    22. vis[b[k]]=1;
    23. for(int i=1;i<=n;i++)
    24. for(int j=1;j<=n;j++)
    25. {
    26. g[i][j]=min(g[i][j],g[i][b[k]]+g[b[k]][j]);
    27. // if(k==2&&i==3&&j==4) cout<
    28. }
    29. int res=0;
    30. for(int i=1;i<=n;i++)
    31. for(int j=1;j<=n;j++)
    32. {
    33. //if(k==2) cout<
    34. if(vis[i]&&vis[j]) res+=g[i][j];
    35. }
    36. ans[k]=res;
    37. }
    38. for(int i=1;i<=n;i++) cout<" ";
    39. system("pause");
    40. return 0;
    41. }
    42. /*
    43. 4
    44. 0 57148 51001 13357
    45. 71125 0 98369 67226
    46. 49388 90852 0 66291
    47. 39573 38165 97007 0
    48. 2 3 1 4
    49. */

    D - Range and Partition 构造,双指针

    最关键的是找到合适的x,y,先假设已经找到了,考虑如何输出,设in为在值域里面的数的个数,out为不在的个数,那么只要in==out+1了就可以输出这个区间,最后一段直接输出就可以,一定是满足条件的,然后可以发现前k-1段都是in==out+1,后面那一段in>=out+1,所以总的就是in>=out+k,所以就可以按照这个条件去枚举了,可以双指针也可以二分

    Codeforces Round #768 (Div. 2) D(二分答案/双指针) - 知乎 (zhihu.com)

    1. #include
    2. using namespace std;
    3. #define int long long
    4. //const int mod=1e9+7;
    5. const int inf=1e18;
    6. const int N = 2e6+100;
    7. int t,n,k,a[N],sum[N],tx[N];
    8. bool check(int l,int r)
    9. {
    10. return (2LL*(sum[r]-sum[l-1])-n>=k);
    11. }
    12. void print(int x,int y)
    13. {
    14. int in=0,out=0,l=1,cnt=1;
    15. for(int i=1;i<=n&&cnt
    16. {
    17. if(a[i]>=x&&a[i]<=y) in++;
    18. else out++;
    19. if(in>out)
    20. {
    21. cout<" "<
    22. l=i+1;cnt++;in=0,out=0;
    23. }
    24. }
    25. cout<" "<
    26. }
    27. signed main()
    28. {
    29. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    30. //cout<<(1LL<<19)<
    31. cin>>t;
    32. while(t--)
    33. {
    34. cin>>n>>k;
    35. for(int i=0;i<=n;i++) sum[i]=tx[i]=0;
    36. for(int i=1;i<=n;i++) cin>>a[i],tx[a[i]]++;
    37. for(int i=1;i<=n;i++)
    38. sum[i]=sum[i-1]+tx[i];
    39. int ansl=1,ansr=n;
    40. for(int i=1,l=1;i<=n;i++)
    41. {
    42. while(l<=i&&check(l,i))
    43. {
    44. if(ansr-ansl>i-l)
    45. {
    46. ansr=i,ansl=l;
    47. }
    48. l++;
    49. }
    50. }
    51. cout<" "<
    52. print(ansl,ansr);
    53. }
    54. system("pause");
    55. return 0;
    56. }

    P5656 【模板】二元一次不定方程 (exgcd) 

    求x,y的最小正整数解,一开始看了一个没有代码的题解越算越不对直接emo了

    【题解】【P5656-【模板】二元一次不定方程(exgcd)】 - 古明地觉世界第一! - 洛谷博客

    1. #include
    2. using namespace std;
    3. #define int long long
    4. //const int mod=1e9+7;
    5. const int inf=1e18;
    6. const int N = 2e6+100;
    7. int exgcd(int a,int b,int &x,int &y)
    8. {
    9. if(b==0)
    10. {
    11. x=1;y=0;
    12. return a;
    13. }
    14. int r=exgcd(b,a%b,x,y);
    15. int temp=y;
    16. y=x-(a/b)*y;
    17. x=temp;
    18. return r;
    19. }
    20. signed main()
    21. {
    22. //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    23. //cout<<(1LL<<19)<
    24. int t,a,b,c;
    25. cin>>t;
    26. while(t--)
    27. {
    28. cin>>a>>b>>c;
    29. int g=__gcd(a,b);
    30. if(c%g)
    31. {
    32. cout<<"-1\n";
    33. continue;
    34. }
    35. int x,y,p=b/g,q=a/g,k;
    36. exgcd(a,b,x,y);
    37. x*=c/g;y*=c/g;
    38. if(x<0) k=ceil((1.0-x)/p),x+=p*k,y-=q*k;
    39. else if(x>=0) k=(x-1)/p,x-=p*k,y+=q*k;
    40. //上面的操作都是将x变为最小正整数
    41. if(y>0)
    42. {
    43. int num=(y-1)/q+1;//就是看看y可以减多少次q,但是一开始的y也是一个解所以要加1
    44. int minx=x;
    45. int miny=(y-1)%q+1;//这一步我的理解是y可能是q的倍数,为了取余q不等于0所以只要减到y==q就可以了
    46. int maxx=x+(y-1)/q*p;//y可以减多少次q,x就可以加多少次p
    47. int maxy=y;
    48. cout<" "<" "<" "<" "<
    49. }
    50. else
    51. {
    52. int minx=x;
    53. int miny=y+q*ceil((1.0-y)/q);
    54. cout<" "<
    55. }
    56. }
    57. system("pause");
    58. return 0;
    59. }

    E - Draw a triangle 向量求三角形面积,exgcd

    设第三个点的坐标为x3,y3,则可以求出两条向量A(x2-x1,y2-y1),B(x3-x1,y3-y1),然后两个向量叉乘的模的一半就是三角形的面积S=-(y2-y1)*(x3-x1)+(x2-x1)*(y3-y1),设x=x3-x1,y=y3-y1,a=-(y2-y1),b=(x2-x1),那么式子就变成了S=ax+by,然后就是求x,y让S最小,结论是S为gcd(a,b)时是最小的,所以直接扩展欧几里得算就可以,最后exgcd好像不能算负数的系数,所以就先转化成正的,然后求得的x和y再取个反就行

    E. Draw a triangle(计算几何+EXGCD)_追随远方的某R的博客-CSDN博客

    1. #include
    2. using namespace std;
    3. #define int long long
    4. //const int mod=1e9+7;
    5. const int inf=1e18;
    6. const int N = 2e6+100;
    7. int exgcd(int a,int b,int &x,int &y)
    8. {
    9. if(b==0)
    10. {
    11. x=1;y=0;
    12. return a;
    13. }
    14. int r=exgcd(b,a%b,x,y);
    15. int temp=y;
    16. y=x-(a/b)*y;
    17. x=temp;
    18. return r;
    19. }
    20. signed main()
    21. {
    22. //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    23. //cout<<(1LL<<19)<
    24. int t;
    25. cin>>t;
    26. while(t--)
    27. {
    28. int x1,y1,x2,y2,x3,y3;
    29. cin>>x1>>y1>>x2>>y2;
    30. int a=-(y2-y1),b=x2-x1;
    31. int f1=1,f2=1;
    32. if(a<=0)
    33. {
    34. f1=-1;
    35. a*=f1;
    36. }
    37. if(b<=0)
    38. {
    39. f2=-1;
    40. b*=f2;
    41. }
    42. exgcd(a,b,x3,y3);
    43. x3*=f1;y3*=f2;
    44. x3+=x1;
    45. y3+=y1;
    46. cout<" "<
    47. }
    48. system("pause");
    49. return 0;
    50. }

    D-史莱姆的战术训练_并查集

    先计算出每一种的粘度然后从大到小排序,可以发现只要从大到小遍历就只要管这个地方访没访问到就可以了,因为后来的一定比不上之前的粘度大,一个一个找的话会很慢,这时候又可以用并查集来辅助跳跃了,这个只要管行之间的跳跃就可以,不然写代码有点太麻烦了,,,

    为了更加的优化,列最好是要比行多的,所以如果n>m就交换一下

    齐鲁工业大学第四届程序设计竞赛题解_牛客博客 (nowcoder.net)

    1. #include
    2. using namespace std;
    3. #define endl '\n'
    4. #define int long long
    5. //const int mod=1e9+7;
    6. const int inf=1e18;
    7. const int N = 1e7+100;
    8. int n,m,p,c,a,b,s[N],col[N],vis[N],ori[N],ans[N];
    9. int findd(int x){return x==s[x]?x:s[x]=findd(s[x]);}
    10. struct node
    11. {
    12. int x1,y1,x2,y2,co;
    13. bool operator<(const node &a)const
    14. {
    15. return co>a.co;
    16. }
    17. }q[N];
    18. signed main()
    19. {
    20. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    21. cin>>n>>m>>p>>c>>a>>b;
    22. int flag=0;
    23. if(n>m) swap(n,m),flag=1;
    24. for(int i=1;i<=c;i++)
    25. {
    26. cin>>col[i];
    27. ori[col[i]]=i;
    28. //cout<
    29. col[i]=a*col[i]+b;
    30. }
    31. for(int i=1;i<=p;i++)
    32. {
    33. if(flag) cin>>q[i].y1>>q[i].x1>>q[i].y2>>q[i].x2>>q[i].co;
    34. else cin>>q[i].x1>>q[i].y1>>q[i].x2>>q[i].y2>>q[i].co;
    35. q[i].co=col[q[i].co];
    36. }
    37. sort(q+1,q+p+1);
    38. for(int i=1;i<=n*m+5;i++) s[i]=i;
    39. for(int i=1;i<=p;i++)
    40. {
    41. int x1=q[i].x1,x2=q[i].x2,y1=q[i].y1,y2=q[i].y2,co=q[i].co;
    42. if(co<=0) continue;
    43. for(int j=x1;j<=x2;j++)
    44. {
    45. for(int k=findd((j-1)*m+y1);k<=((j-1)*m+y2);k=findd(k+1))
    46. {
    47. ans[k]=ori[(co-b)/a];
    48. //cout<
    49. s[k]=k+1;
    50. }
    51. }
    52. }
    53. if(flag)
    54. {
    55. for(int i=1;i<=m;i++)
    56. {
    57. for(int j=1;j<=n;j++) cout<-1)*m+i]<<" ";//这个地方值得注意一下,交换nm后该如何输出
    58. cout<
    59. }
    60. }
    61. else
    62. {
    63. for(int i=1;i<=n;i++)
    64. {
    65. for(int j=1;j<=m;j++) cout<-1)*m+j]<<" ";
    66. cout<
    67. }
    68. }
    69. system("pause");
    70. return 0;
    71. }

  • 相关阅读:
    influxdb2如何同时应用多个聚合函数
    电磁场与电磁波part1--矢量分析
    Python时间序列分析库介绍:statsmodels、tslearn、tssearch、tsfresh
    【虹科分享】什么是Redis数据集成(RDI)?
    硬实力+软实力!2023功能测试进阶之路!
    芯邦'CBM2099E
    yolo-目标检测算法简介
    代码随想录day52|300. 最长递增子序列674. 最长连续递增序列718. 最长重复子数组
    单臂路由 - 实验配置
    多线程adsfasdfasdf
  • 原文地址:https://blog.csdn.net/weixin_52621204/article/details/127664328