题面:https://www.cnblogs.com/Juve/articles/11626350.html

砖块:

直接模拟即可,map统计被覆盖的次数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int MAXN=1005;
int n,k,len,a,b,x,y,ans=0;//a,b:xia,x,y:shang
char opt[MAXN];
map< pair<int,int>,int>m;
void workN(int &a,int &b,int &x,int &y){
if(a==x){
if(b==y) ++b,y+=k;
else b=++y;
}else ++b,++y;
for(int i=a;i<=x;++i){
for(int j=b;j<=y;++j){
pair<int,int>pa=make_pair(i,j);
if(m.find(pa)!=m.end()) m[pa]++;
else m[pa]=1;
ans=max(ans,m[pa]);
}
}
}
void workS(int &a,int &b,int &x,int &y){
if(a==x){
if(b==y) --y,b-=k;
else y=--b;
}else --b,--y;
for(int i=a;i<=x;++i){
for(int j=b;j<=y;++j){
pair<int,int>pa=make_pair(i,j);
if(m.find(pa)!=m.end()) m[pa]++;
else m[pa]=1;
ans=max(ans,m[pa]);
}
}
}
void workW(int &a,int &b,int &x,int &y){
if(b==y){
if(a==x) --x,a-=k;
else x=--a;
}else--a,--x;
for(int i=a;i<=x;++i){
for(int j=b;j<=y;++j){
pair<int,int>pa=make_pair(i,j);
if(m.find(pa)!=m.end()) m[pa]++;
else m[pa]=1;
ans=max(ans,m[pa]);
}
}
}
void workE(int &a,int &b,int &x,int &y){
if(b==y){
if(a==x) ++a,x+=k;
else a=++x;
}else ++x,++a;
for(int i=a;i<=x;++i){
for(int j=b;j<=y;++j){
pair<int,int>pa=make_pair(i,j);
if(m.find(pa)!=m.end()) m[pa]++;
else m[pa]=1;
ans=max(ans,m[pa]);
}
}
}
int main(){
scanf("%d",&n);
while(n--){
scanf("%d%s",&k,opt+1);
len=strlen(opt+1);
a=b=x=y=0;
m.clear();
m[make_pair(0,0)]=ans=1;
for(int i=1;i<=len;++i){
if(opt[i]=='N') workN(a,b,x,y);
else if(opt[i]=='S') workS(a,b,x,y);
else if(opt[i]=='W') workW(a,b,x,y);
else if(opt[i]=='E') workE(a,b,x,y);
}
if(a==x){
for(int i=b;i<=y;++i) printf("%d ",a);
puts("");
for(int i=b;i<=y;++i) printf("%d ",i);
puts("");
printf("%d\n",ans);
}else{
for(int i=a;i<=x;++i) printf("%d ",i);
puts("");
for(int i=a;i<=x;++i) printf("%d ",b);
puts("");
printf("%d\n",ans);
}
}
return 0;
}

数字:

显然不会

粘个50分代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
int n,k,T,fac[];
signed main(){
fac[]=;
for(int i=;i<=;++i){
fac[i]=fac[i-]*i;
while(fac[i]%==&&fac[i]) fac[i]/=;
fac[i]%=;
}
scanf("%lld",&T);
while(T--){
scanf("%lld %lld",&n,&k);
while(fac[n]%==&&fac[n]) fac[n]/=;
if(k==) printf("%.1lld\n",fac[n]%);
if(k==) printf("%.2lld\n",fac[n]%);
if(k==) printf("%.3lld\n",fac[n]%);
}
return ;
}

甜圈:

考虑一种不完美的算法,对于每次修改,我们在线段树上区间加,最后统计叶节点的和是否为$\frac{k*(k+1)}{2}$,

但是会有顺序的影响,1+3+2也会被我们算为合法

为了排除顺序的影响,我们给它一个hash,每次区间加我们先让它乘上base,然后再加

这样就是一个支持区间加,区间乘的线段树

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ull unsigned long long
using namespace std;
const int base=31;
const int MAXN=200005;
int n,k,t;
ull tot;
struct node{
ull laz_add,laz_mul,sum;
node(){laz_add=sum=0,laz_mul=1;}
}tr[MAXN<<2];
void down(int k,int l,int r){
int mid=(l+r)>>1;
if(tr[k].laz_mul!=1){
int mid=(l+r)>>1;
tr[k<<1].sum*=tr[k].laz_mul;
tr[k<<1|1].sum*=tr[k].laz_mul;
tr[k<<1].laz_mul*=tr[k].laz_mul;
tr[k<<1|1].laz_mul*=tr[k].laz_mul;
tr[k<<1].laz_add*=tr[k].laz_mul;
tr[k<<1|1].laz_add*=tr[k].laz_mul;
tr[k].laz_mul=1;
}
if(tr[k].laz_add!=0){
tr[k<<1].sum+=(mid-l+1)*tr[k].laz_add;
tr[k<<1|1].sum+=(r-mid)*tr[k].laz_add;
tr[k<<1].laz_add+=tr[k].laz_add;
tr[k<<1|1].laz_add+=tr[k].laz_add;
tr[k].laz_add=0;
}
}
void update(int k,int l,int r,int opl,int opr,int val){
if(opl<=l&&r<=opr){
(tr[k].sum*=base)+=(r-l+1)*val;
tr[k].laz_mul*=base;
(tr[k].laz_add*=base)+=val;
return ;
}
down(k,l,r);
int mid=(l+r)>>1;
if(opl<=mid) update(k<<1,l,mid,opl,opr,val);
if(opr>mid) update(k<<1|1,mid+1,r,opl,opr,val);
tr[k].sum=(tr[k<<1].sum+tr[k<<1|1].sum);
}
int query(int k,int l,int r){
if(l==r){
if(tr[k].sum==tot) return 1;
else return 0;
}
down(k,l,r);
int mid=(l+r)>>1;
return query(k<<1,l,mid)+query(k<<1|1,mid+1,r);
}
signed main(){
scanf("%d%d%d",&n,&k,&t);
for(int i=1;i<=k;++i) tot=tot*base+i;
while(t--){
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
update(1,1,n,l,r,x);
}
printf("%d\n",query(1,1,n));
return 0;
}

另:区间加和区间乘的线段树板子:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+5;
int n,m,p,a[MAXN];
struct node{
int sum,laz_add,laz_mul;
}tr[MAXN<<2];
void build(int k,int l,int r){
tr[k].laz_add=0,tr[k].laz_mul=1;
if(l==r){
tr[k].sum=a[l]%p;
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid),build(k<<1|1,mid+1,r);
tr[k].sum=(tr[k<<1].sum+tr[k<<1|1].sum)%p;
}
void down(int k,int l,int r){
int mid=(l+r)>>1;
if(tr[k].laz_mul!=1){
int mid=(l+r)>>1;
(tr[k<<1].sum*=tr[k].laz_mul%p)%=p;
(tr[k<<1|1].sum*=tr[k].laz_mul%p)%=p;
(tr[k<<1].laz_mul*=tr[k].laz_mul%p)%=p;
(tr[k<<1|1].laz_mul*=tr[k].laz_mul%p)%=p;
(tr[k<<1].laz_add*=tr[k].laz_mul%p)%=p;
(tr[k<<1|1].laz_add*=tr[k].laz_mul%p)%=p;
tr[k].laz_mul=1;
}
if(tr[k].laz_add!=0){
(tr[k<<1].sum+=(mid-l+1)*tr[k].laz_add%p)%=p;
(tr[k<<1|1].sum+=(r-mid)*tr[k].laz_add%p)%=p;
(tr[k<<1].laz_add+=tr[k].laz_add)%=p;
(tr[k<<1|1].laz_add+=tr[k].laz_add)%=p;
tr[k].laz_add=0;
}
}
void update_add(int k,int l,int r,int opl,int opr,int val){
if(opl<=l&&r<=opr){
(tr[k].sum+=(r-l+1)*val%p)%=p;
(tr[k].laz_add+=val)%=p;
return ;
}
down(k,l,r);
int mid=(l+r)>>1;
if(opl<=mid) update_add(k<<1,l,mid,opl,opr,val);
if(opr>mid) update_add(k<<1|1,mid+1,r,opl,opr,val);
tr[k].sum=(tr[k<<1].sum+tr[k<<1|1].sum)%p;
}
void update_mul(int k,int l,int r,int opl,int opr,int val){
if(opl<=l&&r<=opr){
(tr[k].sum*=val%p)%=p;
(tr[k].laz_mul*=val%p)%=p;
(tr[k].laz_add*=val%p)%=p;
return ;
}
down(k,l,r);
int mid=(l+r)>>1;
if(opl<=mid) update_mul(k<<1,l,mid,opl,opr,val);
if(opr>mid) update_mul(k<<1|1,mid+1,r,opl,opr,val);
tr[k].sum=(tr[k<<1].sum+tr[k<<1|1].sum)%p;
}
int query(int k,int l,int r,int opl,int opr){
if(opl<=l&&r<=opr) return tr[k].sum%p;
down(k,l,r);
int mid=(l+r)>>1,res=0;
if(opl<=mid) (res+=query(k<<1,l,mid,opl,opr))%=p;
if(opr>mid) (res+=query(k<<1|1,mid+1,r,opl,opr))%=p;
return res;
}
signed main(){
//freopen("seq2.in","r",stdin);
scanf("%lld%lld",&n,&p);
for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
build(1,1,n);
scanf("%lld",&m);
for(int i=1,opt,t,g,c,tot=0;i<=m;++i){
scanf("%lld%lld%lld",&opt,&t,&g);
if(opt==1){
scanf("%lld",&c);
update_mul(1,1,n,t,g,c);
}
else if(opt==2){
scanf("%lld",&c);
update_add(1,1,n,t,g,c);
}
else{
printf("%lld\n",query(1,1,n,t,g)%p);
}
}
return 0;
}

csp-s模拟测试61砖块, 数字,甜圈题解的更多相关文章

  1. [考试反思]1005csp-s模拟测试61:休止

    连续不知道多少场了,都是一场10名以内一场20以外...波动极大...还极有规律... 拿到这套题,看到T1大模拟无话可说. 然后考场上我觉得T2很简单....然后就码了两个半小时. T3数据水了暴力 ...

  2. csps-s模拟测试62,63Graph,Permutation,Tree,Game题解

    题面:https://www.cnblogs.com/Juve/articles/11631298.html permutation: 参考:https://www.cnblogs.com/clno1 ...

  3. csp-s模拟测试56Merchant, Equation,Rectangle题解

    题面:https://www.cnblogs.com/Juve/articles/11619002.html merchant: 二分答案,贪心选前m大的 但是用sort复杂度不优,会T掉 我们只是找 ...

  4. csp-s模拟测试54x,y,z题解

    题面:https://www.cnblogs.com/Juve/articles/11606834.html x: 并差集,把不能分到两个集合里的元素和并到一起,设连通块个数为cnt,则答案为:$2^ ...

  5. csp-s模拟测试53u,v,w题解

    题面:https://www.cnblogs.com/Juve/articles/11602450.html u: 用差分优化修改 二维差分:给(x1,y1),(x2,y2)加上s: $d[x1][y ...

  6. csp-s模拟测试51(b)attack,tree题解

    题面:https://www.cnblogs.com/Juve/articles/11598286.html attack: 支配树裸题? 看一下支配树是什么: 问题:我们有一个有向图(可以有环),定 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  8. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  9. csp-s模拟测试94

    csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间, ...

随机推荐

  1. RHEL / CentOS Linux Install Core Development Tools Automake, Gcc (C/C++), Perl, Python & Debuggers

    how do I install all developer tools such as GNU GCC C/C++ compilers, make and others, after install ...

  2. webstorm快捷键、支持vue文件等部分使用技巧

    转载:https://www.cnblogs.com/seven077/p/9771474.html 1.常用快捷键 shift+↑ 向上选取代码块shift+↓ 向下选取代码块ctrl+/ 注释/取 ...

  3. (转)python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    阅读目录 1.1.1导入模块 1.1.2__name__ 1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代 ...

  4. uoj118 【UR #8】赴京赶考

    题目 不难发现我们直接走过去就行了 考虑到第\(i\)行的构造方法就是把\(b\)数组作为模板,每个数和\(a_i\)异或一下就可以了 于是不难发现对于一段连续相等的\(a\),它们在矩阵上就形成了完 ...

  5. USACO2008 Roads Around The Farm /// queue oj23321

    题目大意: N (1 ≤ N ≤ 1,000,000,000)牛群在遇到岔路时,若能分为恰好相差 K (1 ≤ K ≤ 1000)的两路,则持续分裂(假设会一直遇到岔路),否则停止开始吃草. Inpu ...

  6. NEO4J中文分词全文索引自动更新解决方案

    NEO4J中文分词全文索引自动更新解决方案 一.样例数据 二.英文与中文全文索引差别 1.创建NEO4J默认索引 2.删除索引 3.创建支持中文分词的索引 三.APOC自带英文全文索引过程(可自动更新 ...

  7. Spark运行基本流程

  8. postman在有登录认证的情况下进行接口测试!!!

    1.启动自己的项目之后直接使用浏览器进行登录,登陆之后随意点击一个请求,F12找到该请求中请求头的Cookie键值对. 2.将该键值对复制粘贴到postman中的请求Headers中,如下图. 3,请 ...

  9. JAVA数据结构之红-黑树

    本篇博客我会重点介绍对红-黑树的理解,重点介绍红-黑树的查找,这里我们将要讨论的算法称为自顶向下插入,也就是把沿着树向下查找插入点 Ⅰ.平衡树和非平衡树 平衡树和非平衡树:当插入一组数据关键字是按照升 ...

  10. 关于如何正确打开.wlf文件

    只简单说明一下保存/打开.wlf需要注意的内容. (1) 保存 在GUI界面保存时,先切换到sim窗口: 用命令行保存时,其格式为: vsim –wlf <wave_file> … (2) ...