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的更多相关文章

  1. Noip模拟63 2021.9.27(考场惊现无限之环)

    T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...

  2. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  3. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  4. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  8. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  9. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  10. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

随机推荐

  1. native react 代码智能提示

    背景 在vscode 中,虽然有插件可以达到代码提示的效果但是不是很嗨. 所以加上这些: 全局安装typings: npm install typings -g 1 安装react和react-nat ...

  2. 必须经典GPT4.0

    学习C#编程,有一些经典的教材和资源值得关注.下面列出了一些建议供你参考: 1. <C# 编程黄皮书>(C# Programming Yellow Book):Rob Miles 编著的这 ...

  3. Asp-Net-Core开发笔记:使用alpine镜像并加入健康检查

    前言 使用 docker 部署 AspNetCore 应用已经是标配了,之前我一直使用 mcr.microsoft.com/dotnet/aspnet:8.0 这类镜像,简单粗暴,不过可以使用 alp ...

  4. React纯组件的使用

    1. 有无必要使用纯组件 如果应用不是很大型,页面渲染效率使用纯组件与非纯组件差别不大,尽量使用组件 应用一定注意,setState时子组件依赖渲染的属性一定要传递给子组件,不然父组件setState ...

  5. 淘宝推荐、视频搜索背后的检索技术竟是它!深度揭秘达摩院向量检索引擎Proxima

    简介: 淘宝搜索推荐.视频搜索的背后使用了什么样的检索技术?非结构化数据检索,向量检索,以及多模态检索,它们到底解决了什么问题?今天由阿里巴巴达摩院的科学家从业务问题出发,抽丝剥茧,深度揭秘达摩院内部 ...

  6. 自己动手写符合自己业务需求的eslint规则

    ​简介:eslint是构建在AST Parser基础上的规则扫描器,缺省情况下使用espree作为AST解析器.rules写好对于AST事件的回调,linter处理源代码之后会根据相应的事件来回调ru ...

  7. 云原生消息、事件、流超融合平台——RocketMQ 5.0 初探

    简介: 今天分享的主题是云原生消息事件流超融合平台 RocketMQ 5.0 初探,内容主要分为三个部分: 首先,带大家回顾业务消息领域首选 RocketMQ 4 发展历史以及 4.x 版本的演进与发 ...

  8. 举例useContext性能低下的样例,同时推荐用什么方法改进

    在React中,useContext 是一种非常方便的全局状态管理工具,它可以让我们在组件之间共享状态,而不需要通过层层传递 props.然而,当我们在一个大型的 React 应用中过度使用 useC ...

  9. 从[SDOI2011]消防 到[NOIP2007]树网的核

    有关消防一题中最优解一定在直径上的证明 P2491 [SDOI2011] 消防 P1099 [NOIP2007 提高组] 树网的核 题目描述 在一颗 \(n\) 个节点的无根树中,找到一条不超过 \( ...

  10. leetcode(力扣) 2866. 美丽塔 II

    原题链接 暴力做法 (时间复杂度 O(n^2)) 每次选取下标 i 为峰值, 进行 n 次,对每次取max就可以找到答案 对于 i 左边的序列: 需要满足序列是非递减的, 同时每个值尽可能大 所以满足 ...