题面: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. iBATIS结果映射

    resultMap的元素是在iBATIS的最重要和最强大的元素.您可以通过使用iBATIS的结果映射减少高达90%的JDBC编码,在某些情况下,可以让你做JDBC不支持的事情. ResultMaps的 ...

  2. 绿色版mysql 免安装使用(转载)

    MySQL绿色版的安装(mysql-5.6.22-win32.zip) Posted on 2015-01-31 23:21 卒子 阅读(10739) 评论(2) 编辑 收藏 由于工作需要最近要开始研 ...

  3. SElinux(转)

    转自:http://www.361way.com/rh134-selinux/4653.html RH134小结(四)初识SElinux 2015年8月2日admin发表评论阅读评论   一.SEli ...

  4. shell 基本系统命令,关机重启,查看版本,查手册,日期,磁盘,历史命令

    1. 查看系统版本及内核版本 cat /etc/issue  查看系统版本 uname -r     查看内核版本 2. 关机重启命令 关机: shutdown -h now    立即关机 shut ...

  5. innodb 表

    1.innodb的存储引擎表类型 如果在创建表时没有显示的定义主键,则innodb存储引擎会按如下方式选择或创建主键 a.首先表中是否有非空的唯一约束(Unique not null)如果有,则该列即 ...

  6. C++ 系列:交换两个数字

    1. 创建中间变量 这是最快也是最简单的办法,例如: #include<stdio.h> int main(){ int a=10; int b=20; int temp; printf( ...

  7. AM8后台历史数据手工清理方法

    AM8后台历史数据手工清理方法 数据清理目前通过bat脚本将windows任务计划来完成 Bat 路径位置: \ActiveSoft\Am8Svr\STKServer\Data    (请根据服务安装 ...

  8. odoo 分组视图下显示同一批次记录的总数

    修改前: 修改后: xml文件: <?xml version="1.0" encoding="utf-8"?> <!-- vim:fdn=3: ...

  9. JS请求服务器,并返回信息,请求过程中不需要跳转页面

    js请求服务器,并返回信息,请求过程中不需要跳转页面 这个可以通过jQuery框架轻松实现,jQuery中包含多种ajax的请求方式,详细可以参考下对应 的API. 你上面定义的按钮类型是submit ...

  10. Oracle闪回查询恢复delete删除数据

    Flashback query(闪回查询)原理 Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. Flashback q ...