noip28
东方专场?
T1
%%%WYZG
话说我考场上还想二维hash来着
考虑只记录弹幕中x的相对位置。
先选定弹幕一个点作为基准点(第一个出现的x即可),然后,枚举其他的x,记录下坐标差,然后去方格图中枚举,每找到一个x就去用坐标差计算出其他可能的x坐标,然后判断计算出的位置上是否有x,如果有,就消掉,下回不再枚举,没有,就说明不符合题目要求,输出No。
记得特判没有x的情况。
代码一些小细节可能没考虑到,但数据水,能过。
Code
#include<cstdio>
#define MAX 1010
#define re register
namespace OMA
{
int t,n,m,a,b;
struct node
{
int x,y;
}pair[MAX*MAX];
inline int read()
{
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*w;
}
signed main()
{
t = read();
while(t--)
{
bool flag1 = false;
char s1[MAX][MAX],s2[MAX][MAX];
n = read(),m = read(),a = read(),b = read();
for(re int i=1; i<=n; i++)
{
scanf("%s",s1[i]+1);
if(!flag1)
{
for(re int j=1; j<=m; j++)
{ if(s1[i][j]=='x'){ flag1 = true; break ; } }
}
}
bool flag2 = true;
int cnt = 0,x1 = 0,y1 = 0;
for(re int i=1; i<=a; i++)
{
scanf("%s",s2[i]+1);
if(flag2)
{
for(re int j=1; j<=b; j++)
{
if(s2[i][j]=='x')
{ x1 = i,y1 = j,flag2 = false; break ; }
}
}
}
if((!x1||!y1)&&flag1)
{ printf("No\n"); continue ; }
if((!x1||!y1)&&!flag1)
{ printf("Yes\n"); continue ; }
for(re int i=1; i<=a; i++)
{
for(re int j=1; j<=b; j++)
{
if(s2[i][j]=='x')
{
if(i==x1&&j==y1)
{ continue ; }
pair[++cnt] = (node){i-x1,j-y1};
}
}
}
flag1 = true;
for(re int i=1; i<=n; i++)
{
for(re int j=1; j<=m; j++)
{
if(s1[i][j]=='x')
{
s1[i][j]=='.';
for(re int k=1; k<=cnt; k++)
{
if(s1[i+pair[k].x][j+pair[k].y]!='x')
{ printf("No\n"); flag1 = false; break ; }
s1[i+pair[k].x][j+pair[k].y] = '.';
}
}
if(!flag1)
{ break ; }
}
if(!flag1)
{ break ; }
}
if(flag1)
{ printf("Yes\n"); }
}
return 0;
}
}
signed main()
{ return OMA::main(); }
T2
又又又读题死亡,奇数位置指的是位置的编号,不是坐标大小。
小球进洞模型,然而我都不知道有这玩意
考虑dp,设 \(dp_{n,i}\) 表示给定 \(n\)时 ,\(x_{i}-x_{i-1}\) 的贡献,转移时枚举第一次选了那个球,它往那边滚了,直接转移 \(O(n^{3})\)。
实际上我们并不需要枚举它往那边滚了,第一次选的球只有在 “i的旁边” 和 “不在i的旁边” 两种。所以复杂度 \(O(n^{2})\) 可过。
附80pts直接转移code
Code
#include<cstdio>
#define MAX 3100
#define re register
#define int long long
namespace OMA
{
int n,x[MAX<<1],ans;
int dp[MAX][MAX<<1];
const int p = 998244353;
inline int read()
{
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*w;
}
inline int quickpow(int a,int b)
{
int ans = 1;
while(b)
{
if(b&1)
{ ans = ans*a%p; }
a = a*a%p;
b >>= 1;
}
return ans;
}
signed main()
{
n = read();
for(re int i=1; i<=n*2+1; i++)
{ x[i] = read(); }
for(re int i=1; i<=n; i++)
{
int inv1 = quickpow(i,p-2),inv2 = quickpow(i*2,p-2);
for(re int j=2; j<=2*i+1; j++)
{
int calc = (i*2-j+1)/2;
if(j&1)
{ (dp[i][j] += dp[i-1][j-2]%p*inv2%p) %= p; }
else
{ (dp[i][j] += dp[i-1][j]%p*inv2%p) %= p; }
(dp[i][j] += ((dp[i-1][j]*calc%p*inv1%p+dp[i-1][j-1]*inv2%p)%p+(i-calc-1)*dp[i-1][j-2]%p*inv1%p+inv2%p)) %= p;
/*for(re int k=1; k<=i; k++)
{
if(2*k>j)
{ (dp[i][j] += dp[i-1][j]*inv1%p) %= p; }
else if(2*k==j-1)
{ (dp[i][j] += dp[i-1][j-1]*inv2%p+dp[i-1][j-2]*inv2%p+inv2) %= p; }
else if(2*k<j)
{ (dp[i][j] += dp[i-1][j-2]*inv1%p) %= p; }
else
{ (dp[i][j] += dp[i-1][j]*inv2%p+dp[i-1][j-1]*inv2%p+inv2) %= p; }
}*/
}
}
for(re int i=2; i<=n*2+1; i++)
{ (ans += dp[n][i]*(x[i]-x[i-1])%p) %= p; /*printf("%lld\n",dp[n][i]);*/ }
printf("%lld\n",ans);
return 0;
}
}
signed main()
{ return OMA::main(); }
T3
注意到边的类型是单调变小的,考虑用两个并查集来维护边的种类,一个表示1类边,另一个表示1类边+2类边。
再维护需要经过3类边的点的个数,在维护修改时大力更新即可。
具体见代码。
初始化写锅调了好久QAQ
Code
#include<cstdio>
#define MAX 300010
#define re register
namespace OMA
{
int n,m,num[MAX];
struct graph
{
int next;
int to;
int w;
}edge[MAX<<1];
int cnt=1,head[MAX];
inline void add(int u,int v,int w)
{ edge[++cnt] = (graph){head[u],v,w},head[u] = cnt; }
struct DSU
{
int fa[MAX],size[MAX];
inline void start()
{
for(re int i=1; i<=n; i++)
{ fa[i] = i,size[i] = 1; }
}
inline int find(int x)
{ return x!=fa[x]?fa[x] = find(fa[x]):fa[x]; }
inline void merge(int x,int y)
{
int r1 = find(x),r2 = find(y);
if(r1!=r2)
{ fa[r1] = r2,size[r2] += size[r1]; }
}
}dsu1,dsu2;
int fa[MAX],sta[MAX];
inline void dfs(int u,int die,int state)
{
fa[u] = die,sta[u] = state;
for(re int i=head[u],v; i; i=edge[i].next)
{
v = edge[i].to;
if(v!=die)
{ dfs(v,u,edge[i].w); }
}
}
struct stream
{
template<typename type>inline stream &operator >>(type &s)
{
int w=1; s=0; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*=w,*this;
}
}cin;
inline void swap(int &a,int &b)
{ int t=a; a=b; b=t; }
signed main()
{
cin >> n >> m;
for(re int i=1,u,v,w; i<=n-1; i++)
{ cin >> u >> v >> w; add(u,v,w),add(v,u,w); }
dfs(1,0,0);
dsu1.start(),dsu2.start();
for(re int i=1; i<=n; i++)
{
if(sta[i]==1)
{ dsu1.merge(i,fa[i]); }
if(sta[i]!=3)
{ dsu2.merge(i,fa[i]); }
}
for(re int i=1; i<=n; i++)
{
if(sta[i]==3)
{ num[dsu1.find(fa[i])] += dsu2.size[i]; }
}
//for(re int i=1; i<=n; i++)
//{ printf("sta[%d]=%d,num[%d]=%d %d %d\n",i,sta[i],i,num[i],dsu1.size[i],dsu2.size[i]); }
for(re int i=1,a,b,s,t; i<=m; i++)
{
cin >> a >> b >> s >> t;
if(fa[a]==b)
{ swap(a,b); }
if(sta[b]==2)
{
num[dsu1.find(a)] += num[b];
dsu1.merge(b,a);
}
if(sta[b]==3)
{
num[dsu1.find(a)] -= dsu2.size[b];
num[dsu1.find(fa[dsu2.find(a)])] += dsu2.size[b];
dsu2.merge(b,a);
}
if(sta[b]!=1)
{ sta[b]--; }
bool flag = false;
if(dsu2.find(s)==dsu2.find(t))
{ flag = true; }
if(dsu1.find(s)==dsu1.find(fa[dsu2.find(t)]))
{ flag = true; }
if(dsu2.find(fa[dsu1.find(s)])==dsu2.find(t))
{ flag = true; }
int ans = num[dsu1.find(s)]+dsu2.size[dsu2.find(s)];
if(sta[dsu1.find(s)]==3)
{ ans += dsu2.size[dsu2.find(fa[dsu1.find(s)])]; }
printf("%d %d\n",flag?1:0,ans);
}
return 0;
}
}
signed main()
{ return OMA::main(); }
noip28的更多相关文章
随机推荐
- Linux学习之路第四天(运行级别)
linux 实用指令 指定运行级别 运行级别说明 0 :关机 1:单用户(找回丢失密码) 2.多用户状态没有网络服务 3.多用户状态有网络服务 4.系统未保留给用户 5.图形界面 6.系统重启 常用的 ...
- 一款不错的 Go Server/API boilerplate,使用 K8S+DDD+CQRS+ES+gRPC 最佳实践构建
Golang API Starter Kit 该项目的主要目的是使用最佳实践.DDD.CQRS.ES.gRPC 提供样板项目设置. 为开发和生产环境提供 kubernetes 配置.允许与反映生产的 ...
- ESP32 ADF windows开发环境搭建 适配ADF到ESP32A1S(转)
搭建ESP32A1S的ADF开发环境 一,获取IDF和IDF-TOOL adf是乐鑫的音频开发框架,里面有许多乐鑫的音频开发API,同时ADF是基于IDF的.这一部分可以按照官网的教程一步一步来.官网 ...
- 4.Java基础
为了项目方便管理,创建空项目 一.注释 平时编写代码,在代码量比较少的时候,还可以看懂自己写的,但是当项目结构一复杂起来,我们就需要用到注释了 注释并不会被执行,是给写代码的人看的 书写注释是一个非常 ...
- 小白都能理解的TCP三次握手四次挥手
前言 TCP在学习网络知识的时候是经常的被问到知识点,也是程序员必学的知识点,今天小杨用最直白的表述带大家来认识认识,喜欢的朋友记得点点关注哈. 何为TCP 上点官方的话:是一种面向连接(连接导向)的 ...
- SpringMVC架构(一)
SpringMVC架构 1.1Spring web mvc介绍 Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来 ...
- java课堂动手动脑及课后实验总结
动手动脑一:枚举 输出结果: false false true SMALL MEDIUM LARGE 分析和总结用法 枚举类型的使用是借助ENUM这样一个类,这个类是JAVA枚举类型的公共基本 ...
- 【LeetCode】389.找不同
389.找不同 知识点:哈希表.抵消思想: 题目描述 给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. ...
- 安装geatpy库到指定的conda虚拟环境中
在Anaconda Prompt中输入conda install geatpy,提示找不到这个库: 输入pip install geatpy,安装成功:但是安装在默认conda环境下(以下为pycha ...
- vue3 自学(一)基础知识学习和搭建一个脚手架
两年前曾自学过几天vue,那时候版本还是vue2,但后来项目中一直没用到,当时也觉得学习成本太高,便没有继续学习下去.初学者可以看下链接文章以前的吐槽~~ 学习 Vue ,从入门到放弃 最近部门决定升 ...