A. Dice Rolling
读题比写代码久系列
输出n/7+1就过了
有很多种方法,随便弄就完事了(雾
#include <bits/stdc++.h>
#define il inline
#define Max 100005
#define inf 0x3f3f3f3f
using namespace std;
il int read()
{
char c=getchar();
int x=0,f=1;
while(c>'9'||c<'0')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int n,m,a[Max];
int main()
{
m=read();
while(m--)
n=read(),cout<<n/7+1<<endl;
}
B. Letters Rearranging
特判全是一个字符的输出-1
其他的弄个桶排输出就完事了
#include <bits/stdc++.h>
#define il inline
#define Max 10005
#define inf 0x3f3f3f3f
using namespace std;
il int read()
{
char c=getchar();
int x=0,f=1;
while(c>'9'||c<'0')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
char c[Max];
int n,len,m,vst[Max];
int main()
{
m=read();
while(m--)
{
scanf("%s",c+1);
n=strlen(c+1);
int flag=0;
memset(vst,0,sizeof(vst));
if(n==1)
{
puts("-1");
continue;
}
for(int i=1;i<n;i++)
{
if(c[i]!=c[i+1])
{
flag=1;
}
vst[c[i]]++;
}
vst[c[n]]++;
if(!flag)
{
puts("-1");
continue;
}
for(int i=1;i<=300;i++)
{
if(vst[i])
for(int j=1;j<=vst[i];j++)
{
putchar(i);
}
}
puts("");
}
}
C. Mishka and the Last Exam
贪心乱搞,每次取满足要求最小的就好
#include <bits/stdc++.h>
#define il inline
#define Max 400005
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
il int read()
{
char c=getchar();
int x=0;
while(c>'9'||c<'0')
{
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x;
}
int a[Max],b[Max],n;
signed main()
{
n=read();
for(int i=1;i<=n/2;i++)
{
b[i]=read();
}
a[1]=0,a[n]=b[1];
for(int i=2;i<=n/2;i++)
{
int nw=max(a[i-1],b[i]-a[n-(i-1)+1]);
a[i]=nw,a[n-i+1]=b[i]-nw;
}
for(int i=1;i<=n;i++)
printf("%I64d ",a[i]);
}
以上为比赛25min写完的题
rating极其惨烈(
赛后↓
D. Beautiful Graph
二分图判定
把图分为二分图,左边为奇数,右边偶数
如果图为二分图,那么一定满足要求
设左边为a,右边为b
答案为
注意每个联通块跑出来的答案乘起来
一定要用ll,一定要用循环清零数组!!!
这题我就是这样就调完了整个比赛还没调出来的(
惨痛代码↓
#include <bits/stdc++.h>
#define il inline
#define Max 300005
#define int long long//注意这里!!!
#define ll long long
#define inf 0x3f3f3f3f
#define Mod 998244353
#define rg register
using namespace std;
il int read()
{
char c=getchar();
int x=0,f=1;
while(c>'9'||c<'0')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node
{
int t,nt;
}e[Max<<1];
int T,head[Max],vst[Max],tot,cnt,to[Max],c[5];
ll ans=1;
il void add(int u,int v)
{
e[++tot].t=v;
e[tot].nt=head[u];
head[u]=tot;
}
il ll qpw(int a,int b)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%Mod;
a=a*a%Mod;
b>>=1;
}
return res%Mod;
}
il bool dfs(int u,int cl)
{
vst[u]=cl;
c[cl]++;
int res=1;
for(rg int i=head[u];i;i=e[i].nt)
{
int v=e[i].t;
if(vst[v]==cl) return false;
if(!vst[v])
res&=dfs(v,cl^1);
}
return res;
}
signed main()
{
T=read();
while(T--)
{
int n=read(),m=read();
for(int i=1;i<=max(n,m);i++) e[i].t=e[i].nt=head[i]=vst[i]=0;//注意这里!
cnt=tot=0;
vst[0]=2;
ans=1;
for(rg int i=1;i<=m;i++)
{
rg int u=read(),v=read();
add(u,v),add(v,u);
}
for(rg int i=1;i<=n;i++)
{
if(vst[i]) continue;
c[2]=c[3]=0;
if(!dfs(i,2))
{
ans=0;
break;
}
else ans=ans*((qpw(2,c[2])+qpw(2,c[3]))%Mod)%Mod;
}
printf("%I64d\n",ans);
}
}
E. Intersection of Permutations
EFG至今没写
E据说是树套树
以下为paidy原话
我首先考虑对a的排列进行重排成1..n,b相应重排
然后考虑一个二维点阵(i,b[i])的值是1,其它的都是0
1操作相当于对横坐标lb..rb纵坐标la..ra的矩阵做一个求和
2操作相当于 (x,b[x])-- (y,b[y])-- (x,b[y])++ (y,b[x])++
所以随便拉个能维护二维区间和的数据结构就好
我只会树套树
二维区间和什么的,二维树状数组不就完事了吗(
F. Vasya and Array
F是这次比赛最难的题
以下为paidy原话
哦F题大概是这样
那个括号里要不要减是要判断能不能做到连续的len个相同,这个可以预处理
最后做的时候由于你只要一个总答案所以f是不必算的,只要算g和h就行了
paidy爷爷代码
#include <bits/stdc++.h>
#define mo 998244353
using namespace std;
inline int read(){
int x=0,f=1;char cc=getchar();
while(cc<'0' || cc>'9') {if(cc=='-') f=-1;cc=getchar();}
while(cc>='0' && cc<='9') {x=x*10+cc-'0';cc=getchar();}
return x*f;
}
int n,m,k,a[100010],num[110],v[100010];
int g[100010][110],h[100010];
int main(){
n=read();k=read();m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<m;i++) if(a[i]>0) num[a[i]]++;
for(int i=m;i<=n;i++){
if(a[i]>0)num[a[i]]++;if(a[i-m]>0)num[a[i-m]]--;
int flag=0;
for(int j=1;j<=k;j++) if(num[j]>0) flag++;
if(flag==1){
for(int j=1;j<=k;j++) if(num[j]>0) v[i]=j;
}
if(flag==0) v[i]=-1;
}
g[0][0]=1;h[0]=1;
for(int i=1;i<=n;i++){
if(a[i]==-1){
for(int j=1;j<=k;j++){
g[i][j]=h[i-1];
if((v[i]>0 && v[i]==j) || v[i]==-1) g[i][j]=(g[i][j]-h[i-m]+g[i-m][j])%mo;
if(g[i][j]<0) g[i][j]+=mo;
h[i]=(h[i]+g[i][j])%mo;
}
}
else{
for(int j=a[i];j<=a[i];j++){
g[i][j]=h[i-1];
if(v[i]) g[i][j]=(g[i][j]-h[i-m]+g[i-m][j])%mo;
if(g[i][j]<0) g[i][j]+=mo;
h[i]=(h[i]+g[i][j])%mo;
}
}
}
//for(int i=1;i<=n;i++){
// for(int j=1;j<=k;j++) printf("%d ",g[i][j]);
// printf("\n");
//}
printf("%d",h[n]);
}
于是我就这样跪在了paidy爷爷面前
G. Multidimensional Queries
paidy爷爷原话:
G题我考虑把绝对值展开,每个点有2^k种可能性,然后维护每种可能性的区间最大值,相反的一加就好
那这么说起来G题比E题容易
F题代码超容易,难想
代码就没了,自己找吧qwq
rating changes:
(离rating上升只差一个循环清空数组
最后一次更新于2021-09-28 02:20:45
0 条评论