暂咕

$day1$

A. 位运算


分类讨论,贡献分离。

B. 集合论


维护类似时间戳的东西

C. 连连看


考场思路太局限了,考虑容斥。

我们可以看出两个方块能作出贡献,实际上是一个极大联通块(白块)所连节点,

然后我们就可以乱搞了

因为块会重复计算,容斥即可

有点懒,所以懒得细写了....

#include<bits/stdc++.h>
#define int long long
#define MAXN 1101
using namespace std;
int read(){
char c=getchar();int ff=1;int x=0;
while(c<'0'||c>'9'){if(c=='-')ff=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*ff;
}
int dex[5]={-1,1,0,0};
int dey[5]={0,0,-1,1};
int a[MAXN][MAXN];
//int kt[4][MAXN*MAXN*2];
const int mod=23333333;
/*struct node{
int head[mod];int tot=0;int nxt[mod];int to[mod];int val[mod];
int find(int x){
int me=x%mod;
for(int i=head[me];i;i=nxt[i]){
if(to[i]==x){return val[i];}
}
return 0;
}
void init(){
for(int i=1;i<=tot;++i)nxt[i]=0;
tot=0;
}
void insert(int x){
int me=x%mod;
for(int i=head[me];i;i=nxt[i]){
if(to[i]==x){val[x]++;return ;}
}
tot++;
to[tot]=x;head[me]=tot;val[tot]++;
}
void erase(int x){
int me=x%mod;
for(int i=head[me];i;i=nxt[i]){
to[i]=0;val[i]=0;
}
head[me]=0;
return ;
}
}T1,T2,T3;*/
int f[MAXN][MAXN][5];
int vis[MAXN][MAXN];
vector<pair<int,int> >v[MAXN*MAXN*2];int ans=0;
void work(int x){
if(!v[x].size())return ;
//printf("x=%lld\n",x);
map<int,int>T4,T1,T2,T3;
//kt[1][0]=0;kt[2][0]=0;kt[3][0]=0;
for(int i=0;i<v[x].size();++i){
int tox=v[x][i].first;int toy=v[x][i].second;
int k=1;for(k=1;k<=5;++k)if(f[tox][toy][k]==0)break;k--;
for(int j=1;j<=k;++j){
/*
ans+=T1.find(f[tox][toy][j]);
T1.insert(f[tox][toy][j]);
*/
ans+=T1[f[tox][toy][j]];
T1[f[tox][toy][j]]++;
//kt[1][++kt[1][0]]=f[tox][toy][j];
}
for(int j=1;j<=k;++j){
unsigned long long base=f[tox][toy][j];
for(int w=1;w<j;++w){
base=base*10000007ll+f[tox][toy][w];
/*
ans-=T2.find(base);
T2.insert(base);
kt[2][++kt[2][0]]=base;
*/
ans-=T2[base];
T2[base]++;
}
}
for(int j=1;j<=k;++j){
unsigned long long base=f[tox][toy][j];
for(int w=1;w<j;++w){
base=base*10000007ll+f[tox][toy][w];
for(int z=1;z<w;++z){
base=base*10000007ll+f[tox][toy][z];
/*
ans+=T3.find(base);
T3.insert(base);
*/ ans+=T3[base];
T3[base]++;
// kt[3][++kt[3][0]]=base;
}
}
}
if(k==4){
unsigned long long base=f[tox][toy][4]*10000007ll;
base=f[tox][toy][3]+base*10000007ll;
base=f[tox][toy][2]+base*10000007ll;
base=base*100000007ll+f[tox][toy][1];
ans-=T4[base];
T4[base]++;
}
}
/*
for(int i=1;i<=kt[1][0];++i){T1.erase(kt[1][i]);}
for(int i=1;i<=kt[2][0];++i){T2.erase(kt[2][i]);}
for(int i=1;i<=kt[3][0];++i){T3.erase(kt[3][i]);}
T1.init();T2.init();T3.init();
*/
}
queue<pair<int,int> >q;int n,m;
void puss(int tox,int toy,int sum){
int j=0;
for(j=1;j<=4;++j){if(f[tox][toy][j]==0)break;}
f[tox][toy][j]=sum;
}
int cnt=0;
pair<int,int>st[MAXN*MAXN];
void BFS(int x,int y){
int sss=0;
q.push(make_pair(x,y));vis[x][y]=1;
while(!q.empty()){
int mx=q.front().first;
int my=q.front().second;
q.pop();
for(int i=0;i<=3;++i){
int tox=mx+dex[i];int toy=my+dey[i];
if(tox<1||tox>n)continue;
if(toy<1||toy>m)continue;
if(a[tox][toy]==0&&vis[tox][toy]==0){
vis[tox][toy]=1;
q.push(make_pair(tox,toy));
}
else if(a[tox][toy]!=0&&vis[tox][toy]==0){
vis[tox][toy]=1;
st[++sss]=make_pair(tox,toy);
puss(tox,toy,cnt);
}
}
}
for(int i=1;i<=sss;++i){
int tox=st[i].first;int toy=st[i].second;
vis[tox][toy]=0;
}
sss=0;
}
int look(int x1,int y1,int x2,int y2){
for(int i=1;i<=4;++i){
if(f[x1][y1][i]==0)continue;
for(int j=1;j<=4;++j){
if(f[x2][y2][j]==0)continue;
if(f[x1][y1][i]==f[x2][y2][j])return 0;
}
}
return 1;
}
void QAQ(){
int sum=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(a[i][j]==0)continue;
for(int k=0;k<=3;++k){
int tox=i+dex[k];int toy=j+dey[k];
if(tox<=0||tox>n)continue;
if(toy<=0||toy>m)continue;
if(a[i][j]!=a[tox][toy])continue;
sum+=look(i,j,tox,toy);
}
}
}
ans+=sum/2;
}
int mx=0;int k;
signed main(){
//freopen("link6.in","r",stdin);
n=read();m=read();k=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
a[i][j]=read();
if(a[i][j]==0)continue;
v[a[i][j]].push_back(make_pair(i,j));
mx=max(a[i][j],mx);
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(!vis[i][j]&&a[i][j]==0){
cnt++;
BFS(i,j);
}
}
}
for(int i=1;i<=mx;++i){work(i);}
QAQ();
printf("%lld\n",ans);
}
/*
3 3 4
1 0 2
2 3 0
0 0 2
*/

$day2$

A. 串串香


$hash$即可

B. 糊涂图


还没改出来QAQ....

C. 木叶下


树上直径,再用上$lca$即可

我们维护若干数组

$dp_{i}$表示从$x$的父亲不经过$x$的最大路径

$g_{i,4}$表示$x$的几个长链的儿子

$gofa_{i}$表示向$fa$的最长路径

$dis$是对于$dp$的倍增数组

然后根据数组定义打就没了

#include<bits/stdc++.h>
#define int long long
#define MAXN 210005
using namespace std;
int read(){
char c=getchar();int ff=1;int x=0;
while(c<'0'||c>'9'){if(c=='-')ff=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*ff;
}
int anss,diss[MAXN];
int dp[MAXN];//从x的父亲不经过x的最大路径
int fa[MAXN][25];
int dis[MAXN][25];
int g[MAXN][4];//从x到x的子树的最大路径
int son[MAXN][4];
int deep[MAXN];
int gofa[MAXN];//向fa走的最长路径
struct node{int to,n;}e[MAXN*2];int tot,head[MAXN];
void add(int u,int v){e[++tot].to=v;e[tot].n=head[u];head[u]=tot;}
void pianfen(int x,int fa){
for(int i=head[x];i;i=e[i].n){
int to=e[i].to;
if(to==fa)continue;
pianfen(to,x);
anss=max(anss,diss[x]+diss[to]+1);
diss[x]=max(diss[to]+1,diss[x]);
}
}
int n,m;
void DP(int x,int fa){
priority_queue<pair<int,int> >q;
g[x][1]=1;
for(int i=head[x];i;i=e[i].n){
int to=e[i].to;
if(to==fa)continue;
DP(to,x);
q.push(make_pair(g[to][1]+1,to));
//printf("psg=%lld x=%lld to=%lld\n",g[to][1]+1,x,to);
}
int th=1;
while(!q.empty()){
g[x][th]=q.top().first;
son[x][th]=q.top().second;
q.pop();
//printf("g[%lld][%lld]=%lld %lld\n",x,th,g[x][th],son[x][th]);
th++;
if(th==4)break;
}
}
void DFS2(int x,int fa){
for(int i=head[x];i;i=e[i].n){
int to=e[i].to;
if(to==fa)continue;
if(son[x][1]!=to)dp[to]=max(1ll,g[x][1]);
else dp[to]=max(1ll,g[x][2]);
//printf("dp[%lld]=%lld\n",to,dp[to]);
DFS2(to,x);
}
}
void jia_swaproot(int x,int fa){
for(int i=head[x];i;i=e[i].n){
int to=e[i].to;
if(to==fa)continue;
gofa[to]=max(gofa[x]+1,dp[to]+1);
jia_swaproot(to,x);
}
}
void DFS(int x,int faa){
//printf("xxx=%lld\n",x);
for(int i=head[x];i;i=e[i].n){
int to=e[i].to;
if(to==faa)continue;
fa[to][0]=x;
deep[to]=deep[x]+1;
dis[to][0]=dp[to];
//printf("dis[%lld]=%lld\n",to,dis[to][0]);
for(int j=1;j<=19;++j){
if(fa[to][j-1]==0)break;
fa[to][j]=fa[fa[to][j-1]][j-1];
dis[to][j]=max(dis[to][j-1],dis[fa[to][j-1]][j-1]);
}
DFS(to,x);
}
}
int Lca(int x,int y){
int maxn=0;
if(deep[x]<deep[y])swap(x,y);
int yuanx=x;int yuany=y;
//printf("x=%lld y=%lld\n",x,y);
for(int i=19;i>=0;--i){
if(deep[fa[x][i]]>=deep[y]){
maxn=max(dis[x][i]-1,maxn);
//printf("maxn=%lld %lld\n",maxn,dis[x][i]);
x=fa[x][i];
}
}
if(x==y){
maxn=max(maxn,g[yuanx][1]-1);
maxn=max(gofa[x]-1,maxn);
//printf("go=%lld %lld\n",gofa[x]-1,x);
return maxn;
}
for(int i=19;i>=0;--i){
if(fa[x][i]!=fa[y][i]){
maxn=max(dis[x][i]-1,maxn);
maxn=max(dis[y][i]-1,maxn);
x=fa[x][i],y=fa[y][i];
}
}
int lca=fa[x][0];
for(int j=1;j<=3;++j){
if(son[lca][j]==x||son[lca][j]==y)continue;
maxn=max(maxn,g[lca][j]-1);
break;
}
maxn=max(maxn,gofa[lca]-1);
maxn=max(maxn,g[yuanx][1]-1);maxn=max(maxn,g[yuany][1]-1);
return maxn;
}
signed main(){
//freopen("myx.in","r",stdin);
//freopen("wwb.out","w",stdout);
n=read();
for(int i=1;i<=n-1;++i){
int u=read();int v=read();
add(u,v);add(v,u);
}
deep[1]=1;
pianfen(1,0);
DP(1,0);
DFS2(1,0);
jia_swaproot(1,0);
DFS(1,0); anss++;
if(anss%2==1)anss/=2,anss++;
else anss/=2; m=read();
for(int i=1;i<=m;++i){
int u=read();int v=read();
if(u==v){
printf("%lld\n",anss);
continue;
}
int ans=Lca(u,v);
printf("%lld\n",ans);
}
}

「10.17-10.18」liu_runda’s模拟的更多相关文章

  1. 【record】10.17..10.23

    .

  2. 对于最近的一些日常总结by520(17.10.18)

    ---天天考试,各种题型都有,学到了很多新的知识,也发现了自己的许多不足---1.首先,自己的搜索需要加强,特别是广搜,10.18的T1裸广搜没有做对.2.数学的思维和一些逻辑问题需要加强,然后就是要 ...

  3. GitHub 公布 2021 Top 10 博文「GitHub 热点速览」

    作者:HelloGitHub-小鱼干 2021 年在这周彻底同我们告别了,在本周的「News 快读」模块你可以看到过去一年 GitHub 的热门文章,其中有我们熟悉的可能让很多程序员"失业& ...

  4. Ubuntu网络配置IP和DNS等,适用于14.04,16.04和17.10

    本文主要介绍Ubuntu系统的网络设置,包括IP,DNS和主机名等,适用于14.04,16.04和17.10等版本 ===============  完美的分割线 ================ = ...

  5. NOIP模拟赛 17.10.10

    初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...

  6. Noip模拟79 2021.10.17(题目名字一样)

    T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...

  7. 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果)

    [源码下载] 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果) 作者:webabcd 介绍背水一战 Windows 10 之 动画 ThemeTrans ...

  8. 发现struct proc_dir_entry内核3.10.17移到internal中去了,倒

    struct proc_dir_entry 原:2.6.38.8 在#include <linux/proc_fs.h> 现:3.10.17 在fs/proc/internal.h:str ...

  9. [CareerCup] 17.10 Encode XML 编码XML

    17.10 Since XML is very verbose, you are given a way of encoding it where each tag gets mapped to a ...

随机推荐

  1. 【Tavern】1.tavern测试框架介绍

    目录 1. Tavern 和 Postman 2. 安装Python 3. 安装Tavern 4. 第一个测试用例 1. Tavern 和 Postman Tavern是一个用Python实现的接口自 ...

  2. Java 中 RMI 的使用

    RMI 介绍 RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中的对象,调用另一个 JVM 中的对象方法并获取调用结果.这 ...

  3. 【Azure Redis 缓存】Azure Cache for Redis服务中,除开放端口6379,6380外,对13000,13001,15000,15001 为什么也是开放的呢?

    问题描述 在使用安全检测工具对Azure Redis服务端口进行扫描时,发现Redis对外开放了13001, 13000,15000,15001端口.非常不理解的是,在门户上只开放了6379,6380 ...

  4. python模块导入原理

    转自:http://blog.csdn.net/u012422440/article/details/41791433 今日在自学Python,借此机会,正好重新开始写博文,既可以巩固python的知 ...

  5. 关于Redis哨兵机制,7张图详解!

    写在前面 之前有位朋友去面试被问到Redis哨兵机制,这道题其实很多小伙伴都应该有被问到过!本文将跟大家一起来探讨如何回答这个问题!同时用XMind画了一张导图记录Redis的学习笔记和一些面试解析( ...

  6. 使用PuTTY连接Azure VM

    使用PuTTY连接Azure VMhtml { -webkit-print-color-adjust: exact } * { box-sizing: border-box; -webkit-prin ...

  7. Gateway导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  8. safari模拟IE

    在如下网站找到相对应的useragent https://developers.whatismybrowser.com/useragents/explore/software_name/interne ...

  9. [OS] 汇编语言

    操作系统 每个进程拥有一片连续的内存空间(地址空间),空间中的每个字节都可以用一个32位无符号整数定位,每个字节的位置称为地址 CPU 32位:能够处理的数据最大为32bit,地址空间2^32< ...

  10. [刷题] 1 Two Sum

    要求 给出一个整型数组nums 返回这个数组中两个数字的索引值i和j 使得nums[i]+nums[j]等于一个给定的target值 两个索引不能相等 实例 nums=[2,7,11,15], tar ...