NOIP模拟63
T1 电压机制
解题思路
先找出这个图的一个生成树,然后没有称为树边的边就都是返祖边了。
对于一个边是合法的当且仅当它属于所有的奇数环并且不属于任何一个偶数环。
可以利用树上差分进行修改,更改一个返祖边的两个点的奇偶数环的值。
对于只有一个奇数环的情况,显然那一条返祖边也是一条合法的边。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e5+10,M=2e5+10;
int n,m,ans,all,odd[N],even[N],fa[N],dep[N];
int tot=1,head[N],nxt[M<<1],ver[M<<1],edge[M<<1];
bool vis[N];
void add_edge(int x,int y)
{
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x)
{
dep[x]=dep[fa[x]]+1; vis[x]=true;
for(int i=head[x];i;i=nxt[i])
{
int to=ver[i];
if(!vis[to]) fa[to]=x,edge[i]=edge[i^1]=true,dfs(to);
}
}
void dfs2(int x)
{
vis[x]=true;
for(int i=head[x];i;i=nxt[i])
if(fa[ver[i]]==x&&!vis[ver[i]])
dfs2(ver[i]),odd[x]+=odd[ver[i]],even[x]+=even[ver[i]];
if(x!=1&&odd[x]==all&&!even[x]) ans++;
}
signed main()
{
freopen("a.in","r",stdin); freopen("a.out","w",stdout);
n=read(); m=read();
for(int i=1,x,y;i<=m;i++)
x=read(),y=read(),
add_edge(x,y),add_edge(y,x);
dfs(1);
for(int i=1;i<=m;i++)
{
int x=ver[i<<1],y=ver[i<<1|1];
if(edge[i<<1]) continue;
if(dep[x]<dep[y]) swap(x,y);
if((dep[x]-dep[y]+1)&1) odd[x]++,odd[y]--,all++;
else even[x]++,even[y]--;
}
memset(vis,false,sizeof(vis)); dfs2(1);
printf("%lld",ans+(all==1));
return 0;
}
T2 括号密码
大坑未补
T3 排列
解题思路
这个题可就真有意思了。。
测试点分治模板题?? 对于每一个排列进行计算。
以排列 1 2 3 4 为例,我们枚举相应比例为 4 的数下标记为 r 所表示的数字是 \(s_r\) 。
然后枚举相应比例为 2 的数下标记为 l 所表示的数字是 \(s_l\) 。
对于 \([1,l-1]\) 以及 \([l+1,r-1]\) 这两个区间某个值域的数字可以用前缀和或者线段树求出来。
于是我们假设下标在 \([1,l-1]\) 权值在 \([1,s_l-1]\) 的数字的个数为 \(sum_1\) 。
假设下标在 \([l+1,r-1]\) 权值在 \([s_l+1,s_r-1]\) 的数字的个数为 \(sum_2\) 。
那么当前的 l 和 r 的贡献就是 \(sum_1\times sum_2\)
但是锁定这两个位置的并不是普遍适用的,因此我们也可以锁定相对位置为 2 , 3 的数查询两边合法的数字。
还有一种特例 2 4 1 3 我们选择枚举相对大小是 3 的数字,从左向右枚举相对大小是 4 的数字(记下标为 \(l\) )
考虑 一个数字 \(x\) 从 \(l\) 的右侧变为 \(l\) 左侧的点的贡献 其实就是在 \([l,r]\) 区间中 值域在 \([1,x-1]\) 相对于 x 产生了贡献。
位置在 \([1,l-1]\) 区间中大于 \(x+1\) 相对于 x 产生的贡献消失了。
于是我们直接 12 分治解决掉这个题。
也许时间稍大一些但是空间绝对最优。。

code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
#define ls x<<1
#define rs x<<1|1
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=2e3+10;
struct Segment_Tree
{
int tre[N<<2];
void push_up(int x){tre[x]=tre[ls]+tre[rs];}
void build(int x,int l,int r)
{
if(l==r) return tre[x]=0,void();
int mid=(l+r)>>1; tre[x]=0;
build(ls,l,mid); build(rs,mid+1,r);
}
void insert(int x,int l,int r,int pos,int val)
{
if(l==r) return tre[x]+=val,void();
int mid=(l+r)>>1;
if(pos<=mid) insert(ls,l,mid,pos,val);
else insert(rs,mid+1,r,pos,val);
push_up(x);
}
int query(int x,int l,int r,int L,int R)
{
if(L>R) return 0;
if(L<=l&&r<=R) return tre[x];
int mid=(l+r)>>1,sum=0;
if(L<=mid) sum+=query(ls,l,mid,L,R);
if(R>mid) sum+=query(rs,mid+1,r,L,R);
push_up(x); return sum;
}
}T1,T2;
int n,ans,a[10],s[N];
void SPJ()
{
for(int r=4;r<=n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int l=2;l<=r-1;l++) T2.insert(1,1,n,s[l],1);
for(int l=2;l<=r-2;l++)
{
T2.insert(1,1,n,s[l],-1);
ans+=T1.query(1,1,n,1,s[l]-1)*T2.query(1,1,n,s[l]+1,s[r]-1);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ2()
{
for(int r=4;r<=n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int l=2;l<=r-1;l++) T2.insert(1,1,n,s[l],1);
for(int l=2;l<=r-2;l++)
{
T2.insert(1,1,n,s[l],-1);
ans+=T1.query(1,1,n,s[r]+1,s[l]-1)*T2.query(1,1,n,1,s[r]-1);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ3()
{
for(int r=4;r<=n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int l=2;l<=r-1;l++) T2.insert(1,1,n,s[l],1);
for(int l=2;l<=r-2;l++)
{
T2.insert(1,1,n,s[l],-1);
if(s[l]<=s[r])ans+=T1.query(1,1,n,1,s[l]-1)*T2.query(1,1,n,s[r]+1,n);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ4()
{
for(int r=4;r<=n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int l=2;l<=r-1;l++) T2.insert(1,1,n,s[l],1);
for(int l=2;l<=r-2;l++)
{
T2.insert(1,1,n,s[l],-1);
if(s[r]<= s[l])ans+=T1.query(1,1,n,1,s[r]-1)*T2.query(1,1,n,s[l]+1,n);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ5()
{
for(int r=4;r<=n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int l=2;l<=r-1;l++) T2.insert(1,1,n,s[l],1);
for(int l=2;l<=r-2;l++)
{
T2.insert(1,1,n,s[l],-1);
ans+=T1.query(1,1,n,1,s[r]-1)*T2.query(1,1,n,s[r]+1,s[l]-1);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ6()
{
for(int r=4;r<=n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int l=2;l<=r-1;l++) T2.insert(1,1,n,s[l],1);
for(int l=2;l<=r-2;l++)
{
T2.insert(1,1,n,s[l],-1);
ans+=T1.query(1,1,n,s[l]+1,s[r]-1)*T2.query(1,1,n,1,s[l]-1);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ7()
{
for(int r=3;r<n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int i=r+1;i<=n;i++) T2.insert(1,1,n,s[i],1);
for(int l=2;l<=r-1;l++)
{
if(s[l]>=s[r])ans+=T1.query(1,1,n,1,s[r]-1)*T2.query(1,1,n,s[l]+1,n);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ8()
{
for(int r=3;r<n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int i=r+1;i<=n;i++) T2.insert(1,1,n,s[i],1);
for(int l=2;l<=r-1;l++)
{
if(s[l]>=s[r])ans+=T1.query(1,1,n,1,s[r]-1)*T2.query(1,1,n,s[r]+1,s[l]-1);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ9()
{
for(int r=3;r<n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int i=r+1;i<=n;i++) T2.insert(1,1,n,s[i],1);
for(int l=2;l<=r-1;l++)
{
if(s[l]<=s[r])ans+=T1.query(1,1,n,s[l]+1,s[r]-1)*T2.query(1,1,n,s[r]+1,n);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ10()
{
for(int r=3;r<n;r++)
{
T1.build(1,1,n); T2.build(1,1,n); T1.insert(1,1,n,s[1],1);
for(int i=r+1;i<=n;i++) T2.insert(1,1,n,s[i],1);
for(int l=2;l<=r-1;l++)
{
if(s[l]>=s[r])ans+=T1.query(1,1,n,s[r]+1,s[l]-1)*T2.query(1,1,n,s[l]+1,n);
T1.insert(1,1,n,s[l],1);
}
}
}
void SPJ11()
{
for(int r=3;r<n;r++)
{
T1.build(1,1,n); T2.build(1,1,n);
for(int i=r+1;i<=n;i++) T2.insert(1,1,n,s[i],1);
for(int i=1;i<=r-1;i++) T1.insert(1,1,n,s[i],1);
for(int l=1;l<=r-2;l++)
{
T1.insert(1,1,n,s[l],-1);
if(s[l]>s[r]) ans+=T1.query(1,1,n,1,s[r]-1)*T2.query(1,1,n,s[l]+1,n);
}
}
}
void SPJ12()
{
for(int r=4;r<=n;r++)
{
int sum=0; T1.build(1,1,n); T2.build(1,1,n);
for(int i=1;i<=r-1;i++) T2.insert(1,1,n,s[i],1);
for(int l=1;l<=r-2;l++)
if(s[l]>s[r]) ans+=sum;
else
{
sum+=T2.query(1,1,n,1,s[l]-1);
sum-=T1.query(1,1,n,s[l]+1,n);
T1.insert(1,1,n,s[l],1);
T2.insert(1,1,n,s[l],-1);
}
}
}
signed main()
{
freopen("c.in","r",stdin); freopen("c.out","w",stdout);
n=read();
for(int i=1;i<=4;i++) a[i]=read();
for(int i=1;i<=n;i++) s[i]=read();
if(a[1]==1&&a[2]==2&&a[3]==3&&a[4]==4) SPJ();//1 2 3 4
if(a[1]==4&&a[2]==3&&a[3]==2&&a[4]==1) reverse(s+1,s+n+1),SPJ();
if(a[1]==3&&a[2]==4&&a[3]==1&&a[4]==2) SPJ2();//3 4 1 2
if(a[1]==2&&a[2]==1&&a[3]==4&&a[4]==3) reverse(s+1,s+n+1),SPJ2();
if(a[1]==1&&a[2]==2&&a[3]==4&&a[4]==3) SPJ3();//1 2 4 3
if(a[1]==3&&a[2]==4&&a[3]==2&&a[4]==1) reverse(s+1,s+n+1),SPJ3();
if(a[1]==1&&a[2]==3&&a[3]==4&&a[4]==2) SPJ4();//1 3 4 2
if(a[1]==2&&a[2]==4&&a[3]==3&&a[4]==1) reverse(s+1,s+n+1),SPJ4();
if(a[1]==1&&a[2]==4&&a[3]==3&&a[4]==2) SPJ5();//1 4 3 2
if(a[1]==2&&a[2]==3&&a[3]==4&&a[4]==1) reverse(s+1,s+n+1),SPJ5();
if(a[1]==3&&a[2]==2&&a[3]==1&&a[4]==4) SPJ6();//3 2 1 4
if(a[1]==4&&a[2]==1&&a[3]==2&&a[4]==3) reverse(s+1,s+n+1),SPJ6();
if(a[1]==1&&a[2]==3&&a[3]==2&&a[4]==4) SPJ7();//1 3 2 4
if(a[1]==4&&a[2]==2&&a[3]==3&&a[4]==1) reverse(s+1,s+n+1),SPJ7();
if(a[1]==1&&a[2]==4&&a[3]==2&&a[4]==3) SPJ8();//1 4 2 3
if(a[1]==3&&a[2]==2&&a[3]==4&&a[4]==1) reverse(s+1,s+n+1),SPJ8();
if(a[1]==2&&a[2]==1&&a[3]==3&&a[4]==4) SPJ9();//2 1 3 4
if(a[1]==4&&a[2]==3&&a[3]==1&&a[4]==2) reverse(s+1,s+n+1),SPJ9();
if(a[1]==2&&a[2]==3&&a[3]==1&&a[4]==4) SPJ10();//2 3 1 4
if(a[1]==4&&a[2]==1&&a[3]==3&&a[4]==2) reverse(s+1,s+n+1),SPJ10();
if(a[1]==3&&a[2]==1&&a[3]==2&&a[4]==4) SPJ11();//3 1 2 4
if(a[1]==4&&a[2]==2&&a[3]==1&&a[4]==3) reverse(s+1,s+n+1),SPJ11();
if(a[1]==2&&a[2]==4&&a[3]==1&&a[4]==3) SPJ12();//2 4 1 3
if(a[1]==3&&a[2]==1&&a[3]==4&&a[4]==2) reverse(s+1,s+n+1),SPJ12();
printf("%lld",ans); return 0;
}
T4 B关系
大坑未补
NOIP模拟63的更多相关文章
- Noip模拟63 2021.9.27(考场惊现无限之环)
T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...
- NOIP模拟17.9.22
NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
随机推荐
- js 使用flow
前言 what is flow?我想是的,很多人都没有接触过,的确,他是一个新的项目,是的facebook开发的东西,一般还是可以的,有必要去学习一下,在react还是比较重要的. 它做的一件事叫做静 ...
- 记一次 .NET某炉膛锅炉检测系统 崩溃分析
一:背景 1. 讲故事 上个月有个朋友在微信上找到我,说他们的软件在客户那边隔几天就要崩溃一次,一直都没有找到原因,让我帮忙看下怎么回事,确实工控类的软件环境复杂难搞,朋友手上有一个崩溃的dump,刚 ...
- SSM整合项目中使用百度Ueditor遇到的问题。
问题描述:无法上传图片,提示配置项加载有问题 大致情形:直接下载的ue编辑器,放在了/resources/ 目录下,也就是静态资源路径,然后更改web.xml,将tomcat默认拦截器配置放到所有 ...
- linux中nginx的https证书过期替换
linux中nginx的https证书过期替换 工作记录,不然老是忘 一般提示这个就说明过期了 首先把新的证书换上去,最好和之前的文件名字一样,这样就不用改配置文件了 路径就自己找了需要,不过一般挺好 ...
- 第十課-Change Mirth Connect To Mariadb
随着接口部署数量和交互数据越来越多,原来基于Mirth Connect默认derby嵌入式数据库下运行越来越不能满足高性能.高可靠等线上刚性需求:故需要切换Mirth Connect的运行后台数据库. ...
- 写给大家看的“不负责任” K8s 入门文档
前言 2019 年下半年,我做了一次转岗,开始接触到 Kubernetes,虽然对 K8s 的认识还非常的不全面,但是非常想分享一下自己的一些收获,希望通过本文能够帮助大家对 K8s 有一个入门的了解 ...
- 云原生应用实现规范 - 初识 Operator
简介: 本文我们将首先了解到 Operator 是什么,之后逐步了解到 Operator 的生态建设,Operator 的关键组件及其基本的工作原理,下面让我们来一探究竟吧. 作者 | 匡大虎.阚俊宝 ...
- 划重点|iOS15正式发布, 全新的通知推送系统,你必须要知道!
简介: 今年友盟+联合达摩院决策智能实验室讲算法技术,推出国内首个智能推送功能,帮助产品运营人员实现一键式触达的精细化运营.通过精心打磨的在线学习与优化算法,对推送人群与推送文案进行精准匹配,最大化 ...
- 业内首款云原生技术中台产品云原生 Stack 来了!
简介: 云原生 Stack 满足了各种典型场景下客户对于线下高集成平台的诉求,让企业数字话转型不受技术约束,专注业务本身,加速企业数字化迭代. 今天,企业数字化转型依然面临很大的挑战,虽然有很多新技术 ...
- [FAQ] wechaty 与 wechaty-puppet-padplus 生态安全吗
答案是肯定有风险. 非技术角度讲,使用这种方式登录微信存在被微信官方风控的可能性,需要特别注意. 另外,以下是 wechaty 项目说明文件中截取的内容: 我们可以看到,除了微信官方方面的风险,我们的 ...