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. 【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句

    问题描述 在为APIM服务配置了诊断日志(Diagnostic Setting),把日志收集在Log A Workspace中,需要验证日志中是否能查看到请求的错误信息. 所以想人为的来制造一些错误. ...

  2. 面试官:来说说vue3是怎么处理内置的v-for、v-model等指令?

    前言 最近有粉丝找到我,说被面试官给问懵了. 粉丝:面试官上来就问"一个vue文件是如何渲染成浏览器上面的真实DOM?",当时还挺窃喜这题真简单.就简单说了一下先是编译成rende ...

  3. pid算法函数实现,c语言版

    #include <stdio.h> float pid(float setpoint, float process_variable, float kp, float ki, float ...

  4. javascript现代编程之四——数值的进制和表示方法

    在JavaScript中,数值可以以不同的进制表示: 十进制:这是我们最常用的进制系统.例如:let decimal = 123; 二进制:数值前面加上 0b 或者 0B.例如:let binary ...

  5. 【Oracle】使用like的时候遇到的问题

    [Oracle]使用like的时候遇到的问题 like语句其中的%就代表着一个零或者多个字符,_代表一个字符,%与_可以同时使用 name想查询以'_'结尾的字符 用这个语句就会有问题 select ...

  6. 力扣697(java)-数组的度(简单)

    题目: 给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值. 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度 ...

  7. 阿里巴巴云原生混部系统 Koordinator 正式开源

    ​简介: 脱胎于阿里巴巴内部,经过多年双 11 打磨,每年为公司节省数十亿的混部系统 Koordinator 今天宣布正式开源.通过开源,我们希望将更好的混部能力.调度能力开放到整个行业,帮助企业客户 ...

  8. [FAQ] eggjs/egg 自定义 favicon.ico

      从  egg 项目配置里找到这一段代码: https://github.com/eggjs/egg/blob/master/config/config.default.js#L205C21-L20 ...

  9. 最好用的AI换脸软件,rope下载介绍(支持cpu)

    随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果 rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深 ...

  10. 【动画进阶】巧用 CSS/SVG 实现复杂线条光效动画

    最近,群里在讨论一个很有意思的线条动画效果,效果大致如下: 简单而言,就是线条沿着不规则路径的行进动画,其中的线条动画可以理解为是特殊的光效. 本文,我们将一起探索,看看在不使用 JavaScript ...