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 ...
随机推荐
- 重新整理数据结构与算法(c#)——KMP破解[二十七]
前言 很多人把KMP和暴力破解分开,其实KMP就是暴力破解,整个高大上的名字,难道还不是去试错匹配吗? KMP是这样子的,比如说: 绿色部分是我要匹配的. 按照一般写法是这样子的: ABABA 去匹配 ...
- 实训篇-Html-计算器
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Tkinter常用功能示例(一)
技术背景 Tkinter是一个Python自带的GUI框架,虽然现在主流的还是用pyqt的多一些,但是Tkinter在环境配置上可以节省很多工作,可以用来做一些小项目.如果是大型项目,用pyqt或者Q ...
- C#判断窗体是否被遮挡 - 开源研究系列文章
上次发布了托盘窗体的显示与隐藏的博文:,但是在测试窗体最大化的时候发现窗体没有隐藏,调试了下知道是窗体是否被遮挡这个函数的判断有问题.于是就研究了该代码,然后联系了该操作类的作者,也是博客园的园友,然 ...
- 使用C# 创建、填写、删除PDF表单域
通常情况下,PDF文件是不可编辑的,但PDF表单提供了一些可编辑区域,允许用户填写和提交信息.PDF表单通常用于收集信息.反馈或进行在线申请,是许多行业中数据收集和交换的重要工具. PDF表单可以包含 ...
- 快速获取使用dblink的视图的全部字段
快速获取使用dblink的视图的全部字段 默认情况下,使用dblink连接的视图在PL/SQL是没法通过代码助手获取全部的字段的 如果要获取全部字段的话,可以使用一个奇怪的方法 对要获取的使用dbli ...
- dotnet 警惕判断文件是否存在因为检查网络资源造成超长等待
在使用 System.IO.File.Exists 方法时,绝大部分的情况下都是一个非常快捷且没有成本的,但是如果判断的文件是否存在,是从非自己完全控制的逻辑下进入的,那就需要警惕是否判断的文件路径属 ...
- 2019-3-15-uwp-ScrollViewer-content-out-of-panel-when-set-the-long-width
title author date CreateTime categories uwp ScrollViewer content out of panel when set the long widt ...
- Ubuntu 20.04版本安装k8s控制节点与控制节点升级
一.环境配置 服务器配置:2核4G IP:192.168.10.23 主机名:master4将改主机加入此 集群 # 1.修改主机名 hostnamectl set-hostname master4 ...
- Ansible的yaml文件
ansible提供的脚本,遵循规范yaml(一般用于写配置文件) 可用于配制文件的语言:yaml.xml.json - 冒号后面必须有空格 - 横线后面必须要空格 - 严格保持对齐 - 等号前面不能有 ...