题面:https://www.cnblogs.com/Juve/articles/11707775.html

位运算:

大力分类讨论

第一次发现若a^b=c,则c^b=a,c^a=b

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
inline int read(){
re int x=0,f=1;re char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
int t,a,o,x;
inline int q_pow(re int a,re int b){
re int res=1;
while(b){
if(b&1) res=res*a;
a=a*a;
b>>=1;
}
return res;
}
inline int calc(re int x){
re int res=0;
while(x){
if(x&1) ++res;
x>>=1;
}
return res;
}
signed main(){
t=read();
while(t--){
a=read(),o=read(),x=read();
if(a!=-1&&o==-1&&x==-1){//only have and
puts("inf");
continue;
}
if(a==-1&&o!=-1&&x==-1){//only have or
printf("%lld\n",q_pow(3,calc(o)));
continue;
}
if(a==-1&&o==-1&&x!=-1){//only have xor
puts("inf");
continue;
}
if(a==-1&&o!=-1&&x!=-1){//no and
re int t=o^x;
if((t|o)!=o) puts("0");
else printf("%lld\n",q_pow(2,calc(x)));
continue;
}
if(a!=-1&&o==-1&&x!=-1){//no or
re int t=x^a;
if((a|t)!=t) puts("0");
else printf("%lld\n",q_pow(2,calc(x)));
continue;
}
if(a!=-1&&o!=-1&&x==-1){//no xor
if((a|o)!=o) puts("0");
else printf("%lld\n",q_pow(2,calc(a^o)));
continue;
}
if(a!=-1&&o!=-1&&x!=-1){//have all
if((a|o)!=o||(a^o)!=x) puts("0");
else printf("%lld\n",q_pow(2,calc(x)));
continue;
}
}
return 0;
}
 

集合论:

好像我打的不是正解

大力set模拟集合,在集合外加一个bas懒标记,表示集合中的数被增加了多少,查询x是否在集合中出现在set中查x-bas,插入插x-bas,

保证在加完bas后得到x

本题卡常,unordered_map也会T,只要把清空set改成新建一个空set然后赋值

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_set>
#define re register
using namespace std;
const int MAXN=3e6+;
char xch,xB[<<],*xS=xB,*xTT=xB;
#define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++)
inline int read(){
re int x=,f=;re char ch=getc();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getc();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getc();}
return x*f;
}
int m,bas=,sta[MAXN],top=;
unordered_set<int>s;
long long ans=0ll;
signed main(){
m=read();
for(re int i=,opt,sum;i<=m;++i){
opt=read();
if(opt==){
if(s.size()) ++bas;
}
if(opt==){
if(s.size()) --bas;
}
if(opt==){
sum=read();
for(re int j=,x;j<=sum;++j){
x=read();
if(s.find(x-bas)==s.end()){
s.insert(x-bas);
ans+=(x-bas);
}
}
}
if(opt==){
sum=read();
top=ans=;
for(re int j=,x;j<=sum;++j){
x=read();
if(s.find(x-bas)!=s.end()){
sta[++top]=x-bas;
ans+=(x-bas);
}
}
unordered_set<int>t;
swap(t,s);
while(top) s.insert(sta[top--]);
}
printf("%lld\n",ans+(long long)bas*s.size());
}
return ;
}

连连看:我咕了

串串香:

正解是kmp,被hash完美过掉

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define ull unsigned long long
using namespace std;
const int MAXN=1e6+;
const int mod=;
int t,n,m,ans;
ull pre[MAXN<<],h[MAXN<<];
char ch[MAXN];
signed main(){
pre[]=;
for(int i=;i<=*MAXN-;++i){
pre[i]=pre[i-]*mod;
}
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&m);
scanf("%s",ch+);
for(int i=;i<=m;++i){
h[i]=h[i-]*mod+ch[i]-'A'+;
}
ans=;
if(n==){
for(int i=m-;i>=;--i){
if(h[i]==h[m]-h[m-i]*pre[i]){
ans=i;
break;
}
}
if(ans==) ans=-;
printf("%lld\n",ans);
continue;
}
for(int i=;i<=m;++i){
h[i+m]=h[i+m-]*mod+ch[i]-'A'+;
}
for(int i=*m-;i>=;--i){
if(h[i]==h[*m]-h[*m-i]*pre[i]){
ans=*m-i;
break;
}
}
printf("%lld\n",n*m-ans);
}
return ;
}

糊涂图:除了qj啥都不会

木叶下:

如果u,v相等,那么答案就是树的直径

如果u,v不想等,那么u,v,lca会构成一个环,环上的点会被保护起来,那么答案就是u,v路径上的点向下延伸的最长长度和lca处不走lca子树的最长长度

先求出对于每个点x,x的子树中的前三长的链的长度和对应的儿子

然后dfs求出每一个x,不走x的子树能走的最长长度,再求出每一个x,他的父亲不走x的最大长度,这个可以倍增,且可以用前三长链求出

然后倍增solve答案,注意在lca处是由两条路径走到的,所以要求前三大的链,保证有一条链既不过u,也不过v

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=200005;
int n,m,du[MAXN],ans=1;
int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0;
void add(int u,int v){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt;
}
queue<int>q;
int fa[MAXN][23],deep[MAXN];
bool flag=0;
int tot=0;
void DFS(int x,int f){
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==f) continue;
DFS(y,x);
}
}
pair<int,int>mxx[MAXN][3];
void dfs(int x,int f){
deep[x]=deep[f]+1;
fa[x][0]=f;
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==f) continue;
dfs(y,x);
int k=mxx[y][0].first+1;
if(k>mxx[x][2].first){
mxx[x][2].first=k;
mxx[x][2].second=y;
}
if(mxx[x][2].first>mxx[x][1].first){
swap(mxx[x][2],mxx[x][1]);
}
if(mxx[x][1].first>mxx[x][0].first){
swap(mxx[x][0],mxx[x][1]);
}
}
}
int get(int x){
int f=fa[x][0];
for(int i=0;i<=2;++i){
if(mxx[f][i].second!=x)
return mxx[f][i].first;
}
return 0;
}
int gett(int x,int y){
int f=fa[x][0];
for(int i=0;i<=3;++i){
if(mxx[f][i].second!=x&&mxx[f][i].second!=y)
return mxx[f][i].first;
}
return 0;
}
int w[MAXN],ww[MAXN][23];
void dfs(int x){
ww[x][0]=get(x);
w[x]=max(w[fa[x][0]],ww[x][0])+1;
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(y==fa[x][0]) continue;
dfs(y);
}
}
int solve(int x,int y){
if(deep[x]>deep[y]) swap(x,y);
int k=deep[y]-deep[x],res=mxx[y][0].first;
for(int i=0;i<=20;++i)
if((1<<i)&k){
res=max(res,ww[y][i]);
y=fa[y][i];
}
if(x==y){
res=max(res,w[x]);
return res;
}
res=max(res,mxx[x][0].first);
for(int i=20;i>=0;--i)
if(fa[x][i]!=fa[y][i]){
res=max(res,max(ww[x][i],ww[y][i]));
x=fa[x][i],y=fa[y][i];
}
res=max(res,max(gett(x,y),w[fa[x][0]]));
return res;
}
int main(){
scanf("%d",&n);
for(int i=1,u,v;i<n;++i){
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
++du[u],++du[v];
if(abs(u-v)!=1) flag=1;
}
if(!flag){
scanf("%d",&m);
while(m--){
int u,v;
scanf("%d%d",&u,&v);
if(u==v) printf("%d\n",n/2);
else{
if(v<u) swap(u,v);
printf("%d\n",max(n-v,u-1));
}
}
return 0;
}
for(int i=1;i<=n;++i){
if(du[i]<=1){
q.push(i);
deep[i]=1;
du[i]=-1;
}
}
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=pre[x];i;i=nxt[i]){
int y=to[i];
if(du[y]==-1) continue;
--du[y];
if(du[y]<=1){
deep[y]=deep[x]+1;
ans=max(ans,deep[y]);
q.push(y);
du[y]=-1;
}
}
}
memset(deep,0,sizeof(deep));
dfs(1,0);dfs(1);
w[1]=0;
for(int i=1;i<=20;++i){
for(int j=1;j<=n;++j){
fa[j][i]=fa[fa[j][i-1]][i-1];
ww[j][i]=max(ww[j][i-1],ww[fa[j][i-1]][i-1]);
}
}
scanf("%d",&m);
while(m--){
int u,v;
scanf("%d%d",&u,&v);
if(u==v) printf("%d\n",ans);
else printf("%d\n",solve(u,v));
}
return 0;
}

csps-模拟7778lrd两试的更多相关文章

  1. csp-s模拟测试98

    csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...

  2. csp-s模拟测试96

    csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...

  3. csp-s模拟测试94

    csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间, ...

  4. csp-s模拟测试93

    csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...

  5. csp-s模拟测试91

    csp-s模拟测试91 倒悬吃屎的一套题. $T1$认真(?)分析题意发现复杂度不能带$n$(?),计划直接维护答案,考虑操作对答案的影响,未果.突然发现可以动态开点权值线段树打部分分,后来$Tm$一 ...

  6. csp-s模拟测试90

    csp-s模拟测试90 考场发明$Spfa$祭. $T1$按照题意模拟,然后我就发现我死了.一气之下删掉了$priority$,拍了几下发现贼jb快而且还是对的就开心地交了.$T2$的差分状态定义很棒 ...

  7. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  8. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  9. 反省——关于csp-s模拟50

    本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...

随机推荐

  1. IntelliJ IDEA 创建的文件自动生成 Author 注释 签名

    IntelliJ IDEA 创建的文件自动生成 Author 注释 签名1.打开 File --> Setting2.找到 Editor --> File and Code Templat ...

  2. 2019 IEEEXtreme 13.0 Impact Factor 影响因子

    Impact Factor 题目大意 顾名思义,求影响因子.有 n 行 json 数据,第一行为期刊信息,后面为出版商出版的文章信息.   输入输出 点击查看详细 输入: 6 {"publi ...

  3. 02ubuntu下python环境安装

    原文链接:https://blog.csdn.net/weixin_42549407/article/details/85198460 我安装的是python3.6.9 1.下载python的源码压缩 ...

  4. 哈理工赛 H-小乐乐学数学 /// 筛法得素数表+树状数组

    题目大意: 给定n个数 m个询问 询问l r区间内的孤独数的个数 孤独数的定义为在该区间内与其他所有数互质的数 看注释 #include <bits/stdc++.h> using nam ...

  5. USACO2006 Backward Digit Sums /// 全排列 oj24212

    题目大意: 给出杨辉三角的顶点值M和底边数的个数 N (1 ≤ N ≤ 10) ,求出底边各个数的值,其中各个数范围都为1 ~ N 当N=4,M=16时可能是这样的   3   1   2   4  ...

  6. [转]关于Repository模式

    原文链接:关于Repository模式 定义(来自Martin Fowler的<企业应用架构模式>): Mediates between the domain and data mappi ...

  7. SQL 顺序

    查询语句中select from where group by having order by的执行顺序 查询语句中select from where group by having order by ...

  8. Spring Boot + Mybatis + H2 database数据库

    H2 Database H2 由纯 Java 编写的开源关系数据库,可以直接嵌入到应用程序中,不受平台约束,便于测试. h2数据库特点 (1)性能.小巧 (2)同时支持网络版和嵌入式版本,另外还提供了 ...

  9. Java 基础 - 装箱, 拆箱

    总结 1-装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的.(xxx代表对应的基本数据类型).例如:在装箱的时候自动调用的是Integer的 ...

  10. js结巴程序

    var str="我.....我是一个个......帅帅帅帅哥!"; var reg=/\./gi; str=str.replace(reg,""); reg= ...