开场被A劝退,写了得有50min于是不敢交了。unrated了喜闻乐见。

  A:瞎猜都能猜到如果要走到那条直线上,进入直线的点横坐标或纵坐标与起点相同,离开直线的点横坐标或纵坐标与终点相同,证明脑补一下比较显然(事实上也就是以起点终点为对角点构成的矩形与该直线的交点)。看错题以为到直线上的那个点必须是整点,于是搞了半天exgcd。然而就算这样也不至于写这么长时间啊根本不知道自己在干啥。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define double long double
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
double ans,A,B,C,lx,ly,rx,ry;
double dis_m(double x,double y,double p,double q){return fabs(x-p)+fabs(y-q);}
double dis_o(double x,double y,double p,double q){return sqrt((p-x)*(p-x)+(y-q)*(y-q));}
struct data{double x,y;
}a[],b[];
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
A=read(),B=read(),C=read();
lx=read(),ly=read(),rx=read(),ry=read();
ans=fabs(rx-lx)+fabs(ry-ly);
if (A&&B)
{
a[].x=lx,a[].y=(-C-A*lx)/B;
a[].y=ly,a[].x=(-C-B*ly)/A;
b[].x=rx,b[].y=(-C-A*rx)/B;
b[].y=ry,b[].x=(-C-B*ry)/A;
for (int i=;i<;i++)
for (int j=;j<;j++)
ans=min(ans,dis_m(lx,ly,a[i].x,a[i].y)+dis_o(a[i].x,a[i].y,b[j].x,b[j].y)+dis_m(b[j].x,b[j].y,rx,ry));
}
printf("%.6Lf\n",ans);
return ;
}

  B:题意比较奇怪,做法相当显然,肯定要保证所有满足询问给出的条件的子集都只包含同一单一数字,类似背包的算一发方案数就行了,可以取个模。看起来询问补集也是一种询问方式,不过稍微想一下就知道是没有必要的。但这带来一种特殊情况,即只有两种数字时输出n。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 110
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N],ans;
int f[N][N*N],C[N][N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
f[][]=;
for (int i=;i<=n;i++)
for (int k=i;k>=;k--)
for (int j=;j>=a[i];j--)
f[k][j]=(f[k][j]+f[k-][j-a[i]])%P;
C[][]=;
for (int i=;i<=n;i++)
{
C[i][]=C[i][i]=;
for (int j=;j<i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%P;
}
sort(a+,a+n+);
int cnt=;
for (int i=;i<=n;i++)
{
int t=i;
cnt++;
while (t<n&&a[t+]==a[i]) t++;
for (int j=i;j<=t;j++)
if (C[t-i+][j-i+]==f[j-i+][(j-i+)*a[i]]) ans=max(ans,j-i+);
i=t;
}
if (cnt==) {cout<<n;return ;}
cout<<ans;
return ;
}

  C:考虑清楚最大匹配唯一究竟是什么。冷静分析能够发现其充要条件是该树只包含一个点或存在完美匹配。充分性比较显然,对于必要性,考虑如果不存在完美匹配,最大匹配中未匹配点的周围一定存在匹配点,可以将该匹配点改为与未匹配点匹配而匹配数不变,于是方案不唯一。那么就可以瞎dp了,我自己的做法是设f[i][0/1/2]分别表示 割开i与父亲的边,子树内的森林都满足条件/不割开i与父亲的边,i不与子树内点匹配/不割开i与父亲的边,i与子树内点匹配 的删边方案数,比较显然的有f[i][2]=Σ(f[k][1]·∏(f[son][0]+f[son][2])) (k为i某个儿子,son为除k以外i的儿子们) f[i][0]=f[i][2]+∏f[son][0] f[i][1]=∏(f[son][0]+f[son][2])。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 300010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,p[N],f[N][],pre[N],suf[N],t;
struct data{int to,nxt;
}edge[N<<];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs(int k,int from)
{
f[k][]=f[k][]=;f[k][]=;int son=;pre[]=;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=from) dfs(edge[i].to,k);
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=from) pre[++son]=(f[edge[i].to][]+f[edge[i].to][])%P;
suf[son+]=;for (int i=;i<=son;i++)suf[i]=pre[i];
for (int i=;i<=son;i++) pre[i]=1ll*pre[i-]*pre[i]%P;
for (int i=son;i>=;i--) suf[i]=1ll*suf[i+]*suf[i]%P;
int cnt=;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=from)
{
cnt++;
f[k][]=(f[k][]+1ll*f[edge[i].to][]*pre[cnt-]%P*suf[cnt+])%P;
f[k][]=1ll*f[k][]*f[edge[i].to][]%P;
}
f[k][]=(f[k][]+f[k][])%P;
f[k][]=pre[son];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
n=read();
for (int i=;i<n;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
dfs(,);
cout<<f[][];
return ;
}

  D:https://www.cnblogs.com/Gloid/p/9874122.html 可能和这个题比较相似。倍增算出每只鹦鹉的影响区间扩展2k次能到哪即可。只是口胡,不知道有没有锅。

Codeforces Round #522 Div. 1 没打记的更多相关文章

  1. Codeforces Round #518 Div. 1没翻车记

    A:设f[i][j][0/1]为前i个数第i位为j且第i位未满足/已满足限制的方案数.大力dp前缀和优化即可. #include<iostream> #include<cstdio& ...

  2. Educational Codeforces Round 58 Div. 2 自闭记

    明明多个几秒就能场上AK了.自闭. A:签到. #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  3. Codeforces Round#402(Div.1)掉分记+题解

    哎,今天第一次打div1 感觉头脑很不清醒... 看到第一题就蒙了,想了好久,怎么乱dp,倒过来插之类的...突然发现不就是一道sb二分吗.....sb二分看了二十分钟........ 然后第二题看了 ...

  4. Codeforces Round #554 (Div. 2)自闭记

    A 签到 #include<bits/stdc++.h> using namespace std; ],t[],ans; int main() { scanf("%d%d&quo ...

  5. Codeforces Round #530 Div. 1 自闭记

    A:显然应该让未确定的大小尽量大.不知道写了啥就wa了一发. #include<iostream> #include<cstdio> #include<cmath> ...

  6. Codeforces Round #528 Div. 1 自闭记

    整天自闭. A:有各种讨论方式.我按横坐标排了下然后讨论了下纵坐标单调和不单调两种情况.写了15min也就算了,谁能告诉我printf和cout输出不一样是咋回事啊?又调了10min啊?upd:突然想 ...

  7. Codeforces Round #526 Div. 1 自闭记

    日常猝死. A:f[i]表示子树内包含根且可以继续向上延伸的路径的最大价值,统计答案考虑合并两条路径即可. #include<iostream> #include<cstdio> ...

  8. Codeforces Round #525 Div. 2 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  9. Codeforces Round #406 (Div. 2)滚粗记

    A 一看到题,不是一道解不定方程的裸题吗,调了好久exgcd. 其实一个for就好了啊 B 一直WA ON TEST 7真是烦,一想会不会是编号太大了,又写了一个map版本,无用. 调了好久好久才发现 ...

随机推荐

  1. 使用putty远程登录Ubuntu时,报Network error:Connection refused错误及解决

    putty远程登录Ubuntu,弹出Network error:Connection refused的错误提示框,就是因为Ubuuntu没有安装ssh服务. 执行命令: sudo apt instal ...

  2. 北京Uber优步司机奖励政策(1月16日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 北京Uber优步司机奖励政策(12月26日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  4. MySql 使用explain分析查询

    今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义函数对查询的影响情况 •EXPLAIN不 ...

  5. java 字符串与整型相互转换

    如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer. parseInt ([String]); 或 i = Integer.parseInt ( ...

  6. 利用Powershell查询AD中账号属性

    标签:AD账号信息 最后登录时间 最后修改密码.SID 账号SID 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://hubuxcg ...

  7. 编译Chromium出现warning C4819的解决办法

    编译Chromium时出现 warning C4819: The file contains a character that cannot be represented in the current ...

  8. Katalon 学习笔记(一)

      工具介绍: Katalon Studio是一个能提供一整套功能来实现Web,API和Mobile的全自动测试解决方案的自动化测试平台.Katalon Studio构建于开源Selenium和App ...

  9. 获取App的PackageName包名和LauncherActivity启动页

    第一种情况: 查看手机里面已经安装的App: 用数据线连接手机, 打开开发者模式, 并赋予相关权限: 1. 清除日志: adb logcat -c 2. 启动日志: adb logcat Activi ...

  10. 初学Direct X(5)

    初学Direct X(5) 前面学习了使用表面绘制屏幕,但这种方法与另一种比较起来,有着绘图速度颇慢以及缺乏对任何透明类型的支持,这就是前面的篮框以及炸弹会有黑色背景的原因,这种方法就是纹理.他可以绘 ...